PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Display (KS0073) in 4 Bit-Modus initialisieren und ansteuern



Jimmybot
23.09.2014, 20:16
Guten Abend Community,

ich bin mal wieder am einen C-Code am verzweifeln.

Ich versuche ein LCD Display (KS0073, 4 Zeilen je 20 Zeichen) im 4 Bit-Modus betreiben.

Dabei ist das Display am PORTD von einem ATmega 8 Controller angeschlossen:

Datenleitung D0-D3 an Pin D0-D3
RS an Pin D4
RW an Pin D5
Enable an Pin D6


Ich versuche ohne Fremdbibliothek auszukommen, damit der Lerneffekt möglichs hoch sein soll.
Habe mir natürlich die "fertigen" Ideen von Peter Fleury angeschaut, wie er es macht (Aber nicht getestet ob diese Bib. bei mir laufen).

Dabei ist mir beim Initialisieren schon was auf gefallen:
In der Bib. von Peter Fleury wird das Display 3 mal einen Reset unterzogen:


/* reset LCD */
delay(16000); /* wait 16ms after power-on */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(4992); /* wait 5ms */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(64); /* wait 64us */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(64); /* wait 64us */
Aber laut Datenblatt des KS0073 wird der 4 Bit-Modus so Initialisiert (mein Code):

_delay_ms(50); // Nachdem die Versorgungsspannung anliegt, braucht das Display min. 20ms bis es bereit ist. Hier sicherheits halber 50ms.
LCD_cmd(0x33); // 2x Softreset (?).
LCD_cmd(0x32); // 1x Softreset, da nach auf 4Bit Modus.
LCD_cmd(0x2C); // Erweitertes Funktionsregister freischalten.
LCD_cmd(0x09); // Erweitertes Funktionsregister: 4 Zeilen aktivieren.
LCD_cmd(0x28); // Erweitertes Funktionsregister sperren.
LCD_cmd(0x0C); // Display einschalten, Cursor aus, Blinken aus.
LCD_cmd(0x01); // Display löschen.
_delay_ms(1.6); // Befehl Display löschen dauert länger als andere Befehle.
LCD_cmd(0x06); // Display fertig machen. => Initialisierung ist beendet.
Die LCD_cmd Funktion sieht so aus:

void LCD_cmd(uint8_t data)
{
uint8_t data_L, data_H;

data_L=data&0x0F; // Datenbyte erzeugen b0000.xxxx
data_H=data>>4; // Datenbyte erzeugen b0000.xxxx

LCD_PORT=data_H; // Erst das höhere Nibbel auf die Daten-Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT&=~(1<<LCD_RS_PIN); // RS-Pin auf low für Kommando Byte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
LCD_PORT=data_L; // Das niedrigere Nibbel auf die Daten_Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT&=~(1<<LCD_RS_PIN); // RS-Pin auf low für Kommando Byte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
}

void LCD_enable()
{
LCD_PORT|=(1<<LCD_E_PIN);
_delay_us(50);
LCD_PORT&=~(1<<LCD_E_PIN);
}

Das Fragezeichen in der Init stellt meine erste Frage da: Warum muss ich das Display 3x zurücksetzten? Im Datenblatt habe ich nichts gefunden (s. 59 steht die Init für 4Bit), oder überlesen.

Das ist die eine Frage... Mittlerweile wird das Display über die oben genannte Funktion initialisiert.

Und nun das wo ich im Moment scheiter:

// Begrüßng schreiben
LCD_zeichen('I');
LCD_zeichen('c');

Die Funktion dazu:

void LCD_zeichen(uint8_t data)
{
uint8_t data_L, data_H;

data_H=data>>4;
data_H=data_H&0x0F; // Datenbyte erzeugen b0000.xxxx
data_L=data&0x0F; // Datenbyte erzeugen b0000.xxxx

LCD_PORT=data_L; // Erst das höhere Nibbel auf die Daten-Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT|=(1<<LCD_RS_PIN); // RS-Pin auf high für DatenByte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
LCD_PORT=data_H; // Das niedrigere Nibbel auf die Daten_Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT|=(1<<LCD_RS_PIN); // RS-Pin auf high für DatenByte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
}

Was ist mir aufgefallen:

Das ich hier die Nibbels umgekehrt senden muss wie bei den Kommandos ( Bei Kommandos erst High-Nibbel, dann Low-Nobbel. Beim Zeichenschreiben erst Low-Nibbel, dann High-Nibbel).
Wenn ich das 'I' alleine schreie, wird es richtig dargestellt. Kommen mehre Buchstaben dazu gibt es Buchstabensalat.


Warum? Wo ist mein Denkfehler, oder habe ich das Display falsch initialisiert?

Vollständigkeitshalber mal den Kompletten C-Code von mir:

/*
* BMA020.c
*
*
* Created: 26.01.2014 14:28:04
* Author: Jimmy
*
* Pin Konfiguration:
*** PC 4: SDA
*** PC 5: SCL
***
*** PD0-PD3: Daten LCD-Display
*** PD4: RS LCD-Display
*** PD5: RW LCD-Display
*** PD6: Enable (freigabe)
*/
#include <avr/io.h>
#include <stdlib.h>

#define F_CPU 8000000UL
#include <util/delay.h>

// ****** Port D umbezeichen ******
#define LCD_PORT PORTD // Port D ist nun LCD_PORT
#define LCD_data0_PIN PD0 // Pin D0 ist nun LCD_data0_PIN
#define LCD_data1_PIN PD1 // Pin D1 ist nun LCD_data1_PIN
#define LCD_data2_PIN PD2 // Pin D2 ist nun LCD_data2_PIN
#define LCD_data3_PIN PD3 // Pin D3 ist nun LCD_data3_PIN
#define LCD_RS_PIN PD4 // Pin D4 ist nun LCD_RS_PIN
#define LCD_RW_PIN PD5 // Pin D5 ist nun LCD_RW_PIN
#define LCD_E_PIN PD6 // Pin D6 ist nun LCD_E_PIN

int16_t poti_wert, x, x_LSB, y, y_LSB, z, z_LSB;

//****** LCD Display Enable Kommando ******
void LCD_enable()
{
LCD_PORT|=(1<<LCD_E_PIN);
_delay_us(50);
LCD_PORT&=~(1<<LCD_E_PIN);
}

//****** Kommandos für LCD Display ******
void LCD_cmd(uint8_t data)
{
uint8_t data_L, data_H;

data_L=data&0x0F; // Datenbyte erzeugen b0000.xxxx
data_H=data>>4; // Datenbyte erzeugen b0000.xxxx

LCD_PORT=data_H; // Erst das höhere Nibbel auf die Daten-Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT&=~(1<<LCD_RS_PIN); // RS-Pin auf low für Kommando Byte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
LCD_PORT=data_L; // Das niedrigere Nibbel auf die Daten_Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT&=~(1<<LCD_RS_PIN); // RS-Pin auf low für Kommando Byte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
}

//****** LCD Display initialisieren ******
void LCD_init(void)
{
_delay_ms(50); // Nachdem die Versorgungsspannung anliegt, braucht das Display min. 20ms bis es bereit ist. Hier sicherheits halber 50ms.
LCD_cmd(0x33); // 2x Softreset (?).
LCD_cmd(0x32); // 1x Softreset, da nach auf 4Bit Modus.
LCD_cmd(0x2C); // Erweitertes Funktionsregister freischalten.
LCD_cmd(0x09); // Erweitertes Funktionsregister: 4 Zeilen aktivieren.
LCD_cmd(0x28); // Erweitertes Funktionsregister sperren.
LCD_cmd(0x0C); // Display einschalten, Cursor aus, Blinken aus.
LCD_cmd(0x01); // Display löschen.
_delay_ms(1.6); // Befehl Display löschen dauert länger als andere Befehle.
LCD_cmd(0x06); // Display fertig machen. => Initialisierung ist beendet.
}

//****** Zeichen im Display ausgeben ******
void LCD_zeichen(uint8_t data)
{
uint8_t data_L, data_H;

data_H=data>>4;
data_H=data_H&0x0F; // Datenbyte erzeugen b0000.xxxx
data_L=data&0x0F; // Datenbyte erzeugen b0000.xxxx

LCD_PORT=data_L; // Erst das höhere Nibbel auf die Daten-Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT|=(1<<LCD_RS_PIN); // RS-Pin auf high für DatenByte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
LCD_PORT=data_H; // Das niedrigere Nibbel auf die Daten_Pins legen.
LCD_PORT&=~(1<<LCD_RW_PIN); // RW-Pin auf low für Schreibzugriff.
LCD_PORT|=(1<<LCD_RS_PIN); // RS-Pin auf high für DatenByte.
LCD_enable(); // LCD Display signalisieren, dass Datenbyte abgeholte werden kann.
}

//****** Hauptfunktion ******
int main(void)
{

// Portrichtung
DDRD=0xFF;
DDRB=0x01;

//Display initialisieren
LCD_init();

// Begrüßng schreiben
LCD_zeichen('I');
LCD_zeichen('C');

while(1)
{
PORTB=0x01; // Den Controller beschäftigen
}
}

Zum vergleich, die Bib von Peter Fleury im Anhang

Hoffe ihr könnt mir weiter helfen.

RoboHolIC
23.09.2014, 22:38
In der Bib. von Peter Fleury wird das Display 3 mal einen Reset unterzogen

Das ist typisch für LCD-Controller vom Typ HD44780 oder kompatible Controller.
Im Datenblatt zum KS0073 habe ich derlei nicht gesehen. Der scheint nicht ansatzweise mit dem HD44780 kompatibel zu sein.
Sicher, dass die Lib von Peter Fleury auch zu deinem Display passt???


Was ist mir aufgefallen:

Das ich hier die Nibbels umgekehrt senden muss wie bei den Kommandos ( Bei Kommandos erst High-Nibbel, dann Low-Nobbel. Beim Zeichenschreiben erst Low-Nibbel, dann High-Nibbel).


Davon habe ich im Datenblatt nichts gelesen, stattdessen: Erst das HighNibble, dann das LowNibble.

oberallgeier
23.09.2014, 23:10
... LCD Display (KS0073... 4 Bit-Modus ... auf gefallen ... Peter Fleury ... Display 3 mal einen Reset unterzogen ...Tja - war mir nie aufgefallen, ich nutzte vor Jahren die Bibliothek von PFleury. Du musst den Code aber richtig lesen: der dreimalige Reset ist nicht für die nibbelweise Übertragung, da steht (in meiner jahrealten) Bibliothek von PFleury ein #if ... #else ... #endif davor. Für den 4bittigen IO sah ich nie einen Mehrfachreset. Und in Deinem ersten Codefenster steht ja auch mehrfach:
/* function set: 8bit interface */

Versuchs die Bibliothek noch mal aufmerksamen durchzulesen.

schorsch_76
24.09.2014, 03:33
Ich have vor zwei Wochen einen Ks0073 in Betrieb genommen... Über i2c. Ohne irgendwelche Libs. Ich kann dir in ein paar Stunden dann die Initialisierungsroutine , bzw. Die Sequenz zeigen.
Gruß Georg

schorsch_76
24.09.2014, 06:37
// bis in the display state. see PCF8574 in schematic
// 0: Power
// 1: RS
// 2: RW
// 3: CS (enable)
// 4: D4
// 5: D5
// 6: D6
// 7: D7

// function set 4 bit
// this needs to be done without the add_command function
g_buffer[0] = 0x21;
g_buffer[1] = 0x21 | (1<<3);
g_buffer[2] = 0x21;
twi.write_to_slave(avr::display_address, g_buffer, 3);
state++;
case 7:
return check_twi(state);
case 8:
curr_pos = 0;
add_command(0,0,0x24); // function set line (enable ext. F);
add_command(0,0,0x09); // set 4 line mode
add_command(0,0,0x20); // disable extended function again

twi.write_to_slave(avr::display_address, g_buffer, curr_pos);
state++;
return false;
case 9:
return check_twi(state);
case 10:
// init done
curr_pos = 0;
add_command(0,0,0x0F); // display on
add_command(0,0,0x01); // clear display
add_command(0,0,0x06); // entry mode set
twi.write_to_slave(avr::display_address, g_buffer, curr_pos);
state++;
return false;


So hab ich mein Display angeschlossen:
https://www.roboternetz.de/community/threads/65635-LCD-Probleme/page3?p=604859&viewfull=1#post604859

add_command macht:


void
add_command(unsigned char rs, unsigned char rw, unsigned char value)
{
unsigned char out = 0x01; // always power

// high nibble
out |= (value & 0xF0);

// rs and rw flags
if (rs) out |= (1<<1);
if (rw) out |= (1<<2);

// toggle e
out |= (1<<3);
g_buffer[curr_pos++] = out;

out &= ~(1<<3);
g_buffer[curr_pos++] = out;

// low nibble
out &= 0x0F;
out |= ((value & 0x0F) << 4);

// toggle e
out |= (1<<3);
g_buffer[curr_pos++] = out;

out &= ~(1<<3);
g_buffer[curr_pos++] = out;
}


Das bedeutet für dich:
RS = low / RW = low

// function set
- Display D5 hochnehmen
- E high
- E low

// add_command(0,0,0x24) // function set line (enable ext. F);
- out nibble=2
- E high
- E low
- out nibble=4
- E high
- E low

Du siehst also wie du das umsetzen kannst...

Das hier ist der Kern meiner Displayroutine.

Gruß
Georg

RoboHolIC
24.09.2014, 16:17
Für den 4bittigen IO sah ich nie einen Mehrfachreset.

4-bitiger I/O und Mehrfach-Reset haben auch nichts miteinander zu tun. In der Reset- bzw. frühen Init-Phase der HD44780 gibt es noch keine 4-/8-Bit-Unterscheidung. Die drei gleichen Resetbefehle ist innerhalb ihrer Abfolge unterschiedlicher Zeitbedarf spezifiziert. Da scheint intern verschiedenes zu passieren, was auch die Norwendigkeit des Dreifachresets plausibel macht.
Sorry, wenn ich jetzt zu ausschweifend gewesen sein sollte.

Jimmybot
24.09.2014, 17:09
@ RoboHolIC und oberallgeier:
der KS0073 ist fast identisch mit dem HD44780, der Unterschied macht sich in der anderen 4-Bit-Inititialisierung bemerkbar.
Feury hat dies bezüglich seine Bib. angepasst, so dass man es auch für den KS0073 verwenden kann.

Werde mir heute Abend nochmal den Code von Feury zu gemüte führen...

@ schorsch: Danke für deinen Code. Werde dann mir auch mal anschauen.

Ich werde jetzt erstmal euer Input verarbeiten. Danke für euere schnellen Antworten.

Jimmybot
10.10.2014, 16:00
Nachdem es immer noch nicht funktionieren will, bin ich immer noch kein schritt weiter.

Also habe ich mir gedacht: Alles auf dem Steckbrett platt machen, neu verdrahten und die Bib. von Fleury benutzen....... Ja..... Funktioniert auch nicht. Noch nicht mal das erstellen der Hex File.

Fehlermeldung:

3 ld returned 1 exit status
1 undefined reference to 'lcd_init'
2 undefined reference to 'lcd_puts'

hier mein überschaubarer Code:


/*
* BMA020_LCD.c
*
* Created: 10.10.2014 16:26:27
* Author: Jimmy
*
* - Port B:
* + PB0: LED grün
*
* - Port C:
* + PC4: SDA
* + PC5: SCL
*
* Pin Konfiguration:
* - Port D
* + PD0: Data0
* + PD1: Data1
* + PD2: Data2
* + PD3: Data3
* + PD4: RS Pin
* + PD5: RW Pin
* + PD6: E Pin
* + PD7: NC
*/


#include <avr/io.h>
#include "Bib/lcd.h"
#define F_CPU 8000000UL
#include <util/delay.h>



int main(void)
{
// Portrichtung konfigurieren
DDRB=0x01;

// Initialisierung
lcd_init(LCD_DISP_ON);

// Begrüßungstext
lcd_puts("Hallo Unbekannter");

while(1)
{
// Den Controller beschäftigen
PORTB|=(1<<PB0);
}
}

Bin ich so unfähig, oder habe ich einfach nur ein riesen Brett vor meinen Kopf?

Hubert.G
10.10.2014, 16:43
Du solltest doch zuerst die Lib. von Fleury zum laufen bringen, dann weist du das die Hardware funktioniert.
Aber offensichtlich hast du schon ein Problem beim Compilieren.

schorsch_76
10.10.2014, 17:47
Du must das C File der Lib von Fleury in dein Makefile einbinden.

Jimmybot
10.10.2014, 18:20
Du solltest doch zuerst die Lib. von Fleury zum laufen bringen, dann weist du das die Hardware funktioniert.
[...]

Genau das habe ich nun vor.


Du must das C File der Lib von Fleury in dein Makefile einbinden.
Wie mache ich das? Habe bis her noch nie eine Bib. eingebunden.


Danke für die schnellen Antworten.

schorsch_76
10.10.2014, 22:26
Du musst halt das C File zu deinen Source Files dazufügen ... Zeig mal dein Makefile, dann kann man hier helfen ...

Jimmybot
12.10.2014, 20:03
Du musst halt das C File zu deinen Source Files dazufügen ... Zeig mal dein Makefile, dann kann man hier helfen ...

################################################## ##############################
# Automatically-generated file. Do not edit!
################################################## ##############################

SHELL := cmd.exe
RM := rm -rf

USER_OBJS :=

LIBS :=
PROJ :=

O_SRCS :=
C_SRCS :=
S_SRCS :=
S_UPPER_SRCS :=
OBJ_SRCS :=
ASM_SRCS :=
PREPROCESSING_SRCS :=
OBJS :=
OBJS_AS_ARGS :=
C_DEPS :=
C_DEPS_AS_ARGS :=
EXECUTABLES :=
OUTPUT_FILE_PATH :=
OUTPUT_FILE_PATH_AS_ARGS :=
AVR_APP_PATH :=$$$AVR_APP_PATH$$$
QUOTE := "
ADDITIONAL_DEPENDENCIES:=
OUTPUT_FILE_DEP:=
LIB_DEP:=

# Every subdirectory with source files must be described here
SUBDIRS := \
../Bib/


# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../Bib/lcd.c \
../BMA020+LCD.c


PREPROCESSING_SRCS +=


ASM_SRCS +=


OBJS += \
Bib/lcd.o \
BMA020+LCD.o

OBJS_AS_ARGS += \
Bib/lcd.o \
BMA020+LCD.o

C_DEPS += \
Bib/lcd.d \
BMA020+LCD.d

C_DEPS_AS_ARGS += \
Bib/lcd.d \
BMA020+LCD.d

OUTPUT_FILE_PATH +=BMA020+LCD.elf

OUTPUT_FILE_PATH_AS_ARGS +=BMA020+LCD.elf

ADDITIONAL_DEPENDENCIES:=

OUTPUT_FILE_DEP:= ./makedep.mk

LIB_DEP+=

# AVR32/GNU C Compiler





Bib/%.o: ../Bib/%.c
@echo Building file: $<
@echo Invoking: AVR/GNU C Compiler : 3.4.2
$(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -DDEBUG -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega8 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<"
@echo Finished building: $<


./%.o: .././%.c
@echo Building file: $<
@echo Invoking: AVR/GNU C Compiler : 3.4.2
$(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -DDEBUG -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega8 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<"
@echo Finished building: $<




# AVR32/GNU Preprocessing Assembler



# AVR32/GNU Assembler




ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

# Add inputs and outputs from these tool invocations to the build variables

# All Target
all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)

$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP)
@echo Building target: $@
@echo Invoking: AVR/GNU Linker : 3.4.2
$(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="BMA020+LCD.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=atmega8
@echo Finished building target: $@
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature "BMA020+LCD.elf" "BMA020+LCD.hex"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "BMA020+LCD.elf" "BMA020+LCD.eep" || exit 0
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "BMA020+LCD.elf" > "BMA020+LCD.lss"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature "BMA020+LCD.elf" "BMA020+LCD.srec"
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-size.exe" "BMA020+LCD.elf"







# Other Targets
clean:
-$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)
-$(RM) $(C_DEPS_AS_ARGS)
rm -rf "BMA020+LCD.elf" "BMA020+LCD.a" "BMA020+LCD.hex" "BMA020+LCD.lss" "BMA020+LCD.eep" "BMA020+LCD.map" "BMA020+LCD.srec"



Auf der Suche nach dem Makefile bin ich selber drüber gestoßen, wie ich die C-Datei einbinden kann. Zumindes funktioniert jetzt das Compilieren ohne Fehlermeldung.
Werde die Tage das mal auf meine Hardware testen. Wenn es Funktioniert, werde ich mich wieder dem ursprünglichen Problem widmen. Nehmlich ohne Fremdbibliothek das LCD ans laufen kommen.

Jimmybot
14.10.2014, 18:25
Sorry, doppel Post.

Die Bib. von Feury funktioniert, daher ist die Hardware in Ordnung.
Nun geht es darum raus zu finden, warum meine Code nicht funktionieren will.

Nachmal danke für die Hilfestellung mit dem Einbinden der Bib.

Jimmybot
02.11.2014, 17:36
Ich habe den Fehler gefunden.


Ich habe bei der Initialisierung das Bit für den Decrement/Increment Mode falsch gesetzt.
Wenn er bei der ersten Position bereits abwärts zählt, kann nur mist raus kommen.


Danke für die Unterstützung.

RoboHolIC
02.11.2014, 21:26
Ich habe den Fehler gefunden.

Hey, Glückwunsch zum Erfolg, Dank für die Nennung der Fehlerursache und Anerkennung für deine Ausdauer bei der Fehlersuche !!!