Hallo, ich versuche mich mittlerweile seit Stunden mit einer ganz simplen einfachen Aufruf Funktion mit etwas auf meinem LCD Display ausugeben und ein Menü mittels 3 Tastern zu steuern, aber die Ausgabe bzw. der Aufruf der Ausgabe findet nicht statt. Compiliert wird ohne Fehler und bis zu einem Punkt funktionierten die ersten Ausgaben auch bis nur noch ein H im Display erscheint. Ich finde meinen Fehler leider nicht, erschlagt mich bitte nicht direkt... Bin auch nicht all zu weit in Sachen C Programmierung und muss mir alles ganz langsam aneignen. Es geht sich um den Aufruf meines Hauptmenüs ab Zeile 257. Bis dahin funktioniert alles soweit und die Ausgabe kommt. Wäre euch sehr dankbar für einen Tipp... Vielen lieben dank Lars p.s. kompletter c code ist angefügt.
Benutz doch mal die Funktion
1 | lcd_puts_P("String") |
für deine Stringanzeigen. Ich habe jetzt nicht mitgezählt, aber jeder dieser Strings kostet Platz im RAM, wenn du lcd_puts() benutzt. Da die Ausgabe auch erst dann abbricht, wenn du die Interrupts freigibst, solltest du auch nochmal nach Portkonflikten suchen. Schaltplan kann nicht schaden, und im Zweifelsfall mal die 'lcd.h'
Kleiner Korrekturvorschlag: lcd_puts_P( PSTR("String") ); http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga05ca900ebf7cd121be73c654d9ccb3eb
Krapao schrieb: > Kleiner Korrekturvorschlag: > lcd_puts_P( PSTR("String") ); > http://www.nongnu.org/avr-libc/user-manual/group__... Hast bestimmt recht, allerdings läufts bei mir auch ohne PSTR ausm Flash. Keine Ahnung warum, habe Peter Fleury aber auch erst in einem Projekt benutzt, um endlich mal meine LCD Berge abzuarbeiten.
Danke für eure Vorschläge, die Ausgabe allgemein Funktioniert nach der Initialisierung auch. D.h. der Text ZEile 214 "PA" - MB -TN - Ln wird noch jeweils korrekt ausgegeben, danach das LCD gelöscht die Wartezeit klappt auch nur danach kommt der Aufruf meiner Anzeige für mein Menü nicht wo ich die Taster abfrage. Das Menu an sich habe ich in anderer Form auch schon mal funktionsfähig gehabt sollte also eher nur was mit dem Aufruf oder dem nicht abfragen der Taster zu tun haben. Die Funktion der Taster habe ich vorab schon überpfüft bevor ich die Ausgabe auf das LCD gemacht habe. Habe zum Testen jeweils mit dem Taster eine LED an und ausschalten lassen, somit sollte der Teil auch stimmem... weiß leider nicht mehr weiter.. MFG
Du hast Recht und ich habe da was vermurxt. Dein Code läuft deswegen: > AVR-GCC-Tutorial > extern void lcd_puts_p (const char *progmem_s); > #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) Sorry, hatte nicht auf _p und _P geachtet.
Lars O. schrieb: > Habe zum Testen jeweils mit dem Taster eine LED an und ausschalten > lassen, somit sollte der Teil auch stimmem... > > weiß leider nicht mehr weiter.. Sehr schön, das du diesmal den Schaltplan und die lcd.h mitgepostet hast ;-P Nu wissen wir immer noch nicht mehr. Meinen Hinweis mit den Interrupts mal durchdacht? Kommentier mal das sei() aus und guck, obs dann weitergeht.
Entschuldige Matthias Sch. habe den LCD.h vergessen. Bin mittlerweile etwas ausgebrannt, da ich seit Tagen an diesem Projekt hänge und so einige 100 Fehler gamacht habe. Den Schaltplan habe ich angehängt, ist aber denke ich eher unwichtig. Habe zum testen für alles das "myAVR Board MK2" erweitert mit einem 4x20 Zeichen LCD Display und die Taster und LED s der Boards benutzt.
Matthias Sch. schrieb: > Interrupts mal durchdacht? Kommentier mal das sei() aus und guck, obs > dann weitergeht. Habe das SEI() auskommentiert aber es bringt leider keine Veränderung.
Pass mal bitte in lcd.h noch diese Zeile an deine Quarzfrequenz an:
1 | #define XTAL 3686400 /**< clock frequency in Hz, used to calculate delay timer */ |
Dann werden deine Variablen nicht initialisiert, hmen, einst und man sollten alle mit sinnvollen Werten beim Starten besetzt werden. Und was soll diese Zeile:
1 | return 253; |
Du kannst ja aus main() nicht zurückkehren. Wohin auch? Muss weg.
Ok, lcd.h ist angepasst. Die Variablen werden nicht initialisiert ? Ich war der Meinung dies in Zeile 75 zu machen. uint8_t zurueck=1; // Variable zurück zum Hauptbildschirm uint8_t aut=1; // Variable für Betrieb Automatische uint8_t einst=1; // Variable für Einstellungen uint8_t man=1; // Manuelle Wassersteuerung uint8_t hmen=1; // Variable für das Hauptmenu wo würdest du das und wenn wie machen ? das return hab ich schon rausgenommen, war nur ein verzweifelter Versuch.. THX
hmm... main() wird einmal ausgeführt. Und dann? Müsste dein Menü nicht in irgendeiner Endlosschleife laufen?
Oliver schrieb: > Endlosschleife Danke dir, ich würde mal sagen genau das habe ich vergessen... :-) was ein wenig Abstand zur Sache das Leben einfach machen kann. Hab eine da Schleife eingefügt und mein LCD Menü funktioniert wunderbar. Euch allen vielen Lieben dank...
Lars O. schrieb: > Oliver schrieb: >> Endlosschleife > > Danke dir, ich würde mal sagen genau das habe ich vergessen... :-) > > was ein wenig Abstand zur Sache das Leben einfach machen kann. Ein übersichtliches Programm, bei dem du Funktionsteile in Funktionen aufgeteilt hättest, würde dir das Leben noch viel einfacher machen.
Karl Heinz Buchegger schrieb: > Funktionen HI, das würde ich eventuell auch tun, aber ich weiß leider nicht genau wie ich das alles anwenden soll. Habe für das ganze wirklich eine lange Zeit gebraucht um das zu verwirklichen. Wenn du mir eventuell ein kontretes Beispiel gibst kann ich es vielleicht besser umsetzten. Muss mir noch jeden Befehl genaustens ansehen... Thx Lars
Lars O. schrieb: > plan.JPG Das sieht ja grausig aus. Hast du schon mal drüber nachgedacht, das JPEG als Kompressionsverfahren für Photos mit Farbverläufen und strukturierten Flächen optimiert ist und für Schaltpläne ein eher nicht geeignetes Format ist?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.