PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WinAVR,AVR Studio, Warnmeldungen , komische Fehler..?



Roberto
14.11.2007, 23:15
Hallo Leute

Habe da ein bisschen ein komisches Problem:

Benutze neueste Version von WinAVR mit Avr Studio.
Prog. ein MEGA16 über STK500

Schreibe da gerade ein bisschen an einem Programm für einen kleinen Robi..

Das Programm besteht derzeit aus 3 Teilen die alle unter Source-File im AvrStudio liegen.
Eines ist für das Grafik LCD (Sharp) eines als Hauptprogramm und eines für die Motorstersteuerung. (derzeit gerade mit PWM)

Die Ausgabe am LCD (in Text) funktionierte bis jetzt immer einwandfrei.
Auf einmal kommen teilweise wirre Zeichen.
Jetzt bin ich draufgekommen, dass wenn ich den Compiler optimieren lasse, sind diese Anzeigefehler weg. :-k

Kennt jemand diese Probleme ?

Jetzt habe ich mir mal die Warnungen angeschaut..
Schätze mal, das hängt irgendwie zusammen :-k
Hier mal ein Auszug:


../sharp_lcd_v2.c:166: warning: left shift count >= width of type
../sharp_lcd_v2.c:168: warning: left shift count >= width of type
../sharp_lcd_v2.c:172: warning: implicit declaration of function 'Kontroll_Register'
../sharp_lcd_v2.c: At top level:
../sharp_lcd_v2.c:190: warning: conflicting types for 'Kontroll_Register'
../sharp_lcd_v2.c:172: warning: previous implicit declaration of 'Kontroll_Register' was here
../sharp_lcd_v2.c: In function 'LCD':
../sharp_lcd_v2.c:251: warning: suggest parentheses around comparison in operand of |
../sharp_lcd_v2.c:251: warning: suggest parentheses around comparison in operand of |
../sharp_lcd_v2.c:251: warning: suggest parentheses around comparison in operand of |
avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -DF_CPU=8000000UL -O1 -fsigned-char -MD -MP -MT Hauptprogramm.o -MF dep/Hauptprogramm.o.d -c ../Hauptprogramm.c
../Hauptprogramm.c: In function 'main':
../Hauptprogramm.c:48: warning: implicit declaration of function 'Motor_init'
../Hauptprogramm.c:50: warning: implicit declaration of function 'LCD_init'
../Hauptprogramm.c:55: warning: implicit declaration of function 'Display_fuellen'
../Hauptprogramm.c:56: warning: implicit declaration of function 'LCD'


Vielleicht könnt Ihr mir da ein paar Tipps geben, wo ich da ansetzen kann?
Leider schaut es mit dem englisch nicht so gut aus und auch im C bin ich erst Anfänger 8-[ , Aber der Wille ist da O:)

Vielleicht habt Ihr ein paar Tipps für mich ?!
L.G. Roberto

Ps.: Weis schon, ohne Code ist da blöd einen Rat zu geben, aber will auch nicht den ganzen Code da reinmüllen.
Bei bedarf vielleicht auszugsweise....

Nachtrag:
Zeile 166:

LCD_Adress_Port &= ~(1<<_resb);

Zeile 172:

Kontroll_Register(0xf0);

Zeile 190:

void Kontroll_Register(int Register)
{
LCD_Bus_Port=Register; //Register-Daten anlegen
LCD_Adress_Port |= rs; // org. war rs=1; //Registerauswahl (Low = Datenregister, High = Controllregister)
LCD_Adress_Port &= ~_csb; // org. war _csb=0; //Display Auswählen (Low Aktiv)
LCD_Adress_Port &= ~_wrb; // org. war _wrb=0; //Write (Low ist schreiben)
LCD_Adress_Port |= _wrb; // org. war _wrb=1; //Nicht mehr schreiben
LCD_Adress_Port |= _csb; // org. war _csb=1; //Display nicht mehr auswählen
}

Zeile 251:

if (Zeile == 1|Zeile == 3 | Zeile ==5 | Zeile ==7)
.
.
.

askazo
15.11.2007, 10:25
Hi!

Zu Zeile 166: Du scheinst hier weiter zu schieben als der Datentyp groß ist.
Wenn z.B. LCD_Adress_Port ein 8-bit Datentyp ist und _resb größer 8 ist, erhälst Du diese Warnmeldung.

Zu Zeile 172: Du benutzt die Funktion Kontroll_Register(), bevor sie deklariert ist. Wenn Du an den Anfang der Datei einen Prototyp setzt (void Kontroll_Register(int); ), sollte der Fehler weg sein. Normalerweise gehören die Prototypen aber in die zugehörige Header-Datei.

Zu Zeile 190: Ich schätze mal, dass LCD_Bus_Port ein 8-bit Datentyp ist. Dann muss Register auch ein 8-bit Typ sein.

Zu Zeile 251: Der Compiler schlägt Dir sinnvollerweise vor, Klammern um die Vergleichsoperationen zu legen, also so:
if ((Zeile == 1) | (Zeile == 3) | (Zeile ==5) | (Zeile ==7))

Gruß,
askazo

m.a.r.v.i.n
15.11.2007, 10:38
Hallo,

Zeile 251 müßte man so schreiben:


if (Zeile == 1 || Zeile == 3 || Zeile == 5 || Zeile == 7)

askazo
15.11.2007, 10:46
@marvin: Stimmt, das hatte ich glatt übersehen.
| ist bitweises Oder, || logisches Oder.
Trotzdem sind Klammern hier schon alleine der Übersicht wegen sinnvoll.

askazo

Roberto
16.11.2007, 01:20
Hallo
Danke für Eure Antwort .
Hat ein bisschen gedauert. Musste das erst noch umsetzen..

Habe jetzt alle(fast) Warnungen heraus bekommen.
(Warnt das er nicht optimiert hat :-$ )

Irgendwie scheint mir das C schon ein bisschen unsicher.. :-k

Inzwischen, mit noch ein paar Warnungen, ging das Display wieder normal(Ohne Optimierung)
Jetzt sind alle Warnungen raus und das Display geht wieder nicht richtig (mit optimieren ) ](*,)

Wenn ich optimiere (-O1)geht wieder alles normal :-k

Müsste es nicht ohne Optimieren auch gehen
(habe mal wo gelesen, dass das Simulieren nur ohne optimieren gehen soll..),
oder sollte man sowieso immer optimieren?


Wegen den Prototypen:

Muss ich in jedem C-Teil (File) jeden Block den ich verwende, vorher als Prototypen deklarieren (schön umständlich !)
Auch wenn der Block im anderen C-Teil liegt?(wenn ich ihn benutze)
Warum kann sich der Compiler das nicht selber zusammensuchen ?

----
l.G. Roberto

Ps.:
Ohne Optimierung ist das Programm 7664 bytes
Mit -o1 = 2376 bytes
Mit -02 = 2420 bytes
Mit -03 = 2702 bytes
Mit -Os = 2342 bytes