Moin und wünsche frohe Weihnachten zu haben/gehabt zu haben. Ich bin langsam mit meinem Latein am Ende. Ich versuche ganz einfach ein 2x16 LCD Display an einem ATmega88 zu betreiben(*): ATmega mit Quartz (14.7456MHz, 2 Kondensatoren, Pullup an der RESET-Leitung, LCD Display über 4 Datenleitungen an PORTD und PB0 angeschlossen), Software ist im Wesentlichen Peter Fleurys LCD Bibliothek (passend konfiguriert) und ein simples Programm: main() { lcd_init(); lcd_clrscr(); lcd_puts("Hello"); set_sleep_mode(SLEEP_MODE_IDLE); while (1) sleep_mode(); } Diese Programm gibt nur Müll auf dem Display aus. Ersetze ich "lcd_puts("Hello");" durch einzelne "lcd_putc('H'); ...", steht "Hello" auf dem Display. Ich habe dann mal den externen Quarz durch den internen Takgenerator ersetzt und die CLKDIV8 Fuse gelöscht, weil ich meinen Logic Analyzer anschließen wollte und der ist nicht der Schnellste, der uC lief also intern mit 1MHz und dann fiel mir auf, daß das Display flackerte. Dann habe ich mein Oszilloskop mal an den E-Eingang des Displays geklemmt und sehe, daß dort unregelmäßig die Leitung auf "1" gezogen wird! Dann eine LED zusätzlich angesteuert (am Anfang von main() aus- und kurz vor dem while(1) wieder angemacht) und die flackert deutlich sichtbar! Ich vermute nun, daß der uC einen Reset bekommt, nur ... von wem? Hat jemand eine Idee, was den Reset verursachen könnte? WDT ist aus (Fuse-Bit ist 1), Interrupts nutze ich auch nicht. Wie gesagt: mit dem Latein am Ende ... Josef (*) Ist eigentlich ein Nebenkriegsschauplatz: eigentlich will ich mit MPCM experimentieren um mehrere uC als Sensoren/Aktoren an einem Raspberry Pi zu betreiben.
Josef Möllers schrieb: > Software ist im Wesentlichen Peter Fleurys LCD > Bibliothek (passend konfiguriert) und ein simples Programm Da ich Peter Fleurys Bibliothek als recht robust und fehlerfrei erfahren habe, kann eigentlich nur eine falsche Konfiguration in 'lcd.h' der Schuldige sein. Häng die doch bitte mal an einen Beitrag an. Schaltplan und vor allem deine Abblockmassnahmen wären aber auch nicht schlecht - tatsächlich sogar sehr hilfreich :-)
Ja, sieht sehr nach spontanem Reset aus. Das kann an mangelhafter Stromversorgung liegen, oder falsch angeschlossenen Abblockkondensatoren. Zuerst solltest du das Programm jedoch auf das absolute Minimum reduzieren. Dieser sleep Modus ist für die Displayansteuerung nicht relevant, also nimm das mal raus.
1 | #include <util/delay.h> |
2 | #include <util/io.h> |
3 | #include "die_lcd_lib.h" |
4 | |
5 | #define F_CPU 1000000UL |
6 | |
7 | main() |
8 | { |
9 | DDRB |= 1; |
10 | PORTB |= 1; // Led an |
11 | _delay_ms(500); |
12 | PORTB &= ~1 // Led aus |
13 | _delay_ms(500); |
14 | PORTB |= 1; // Led an |
15 | _delay_ms(500); |
16 | PORTB &= ~1 // Led aus |
17 | _delay_ms(500); |
18 | |
19 | lcd_init(); |
20 | lcd_clrscr(); |
21 | lcd_puts("A"); |
22 | |
23 | PORTB |= 1; |
24 | _delay_ms(500); |
25 | PORTB &= ~1 |
26 | _delay_ms(500); |
27 | |
28 | lcd_puts("Hello"); |
29 | |
30 | PORTB |= 1; |
31 | _delay_ms(500); |
32 | PORTB &= ~1 |
33 | } |
Der obige Code steuert eine LED an PB0 an. Beobachte Ausgabe und LED's. Folgendes müsste passieren: Led blinkt zweimal. A erscheint. Led blinkt einmal. AHallo erscheint. Led blinkt einmal. Dann darf nichts mehr passieren.
Danke Matthias, auch an Stefan Us. Der Hinweis auf die Abblockkondensatoren war gut: ich habe die Schaltung mal aufgeteilt und den ATmega auf das Atmel-Evaluationsboard von Pollin gesteckt und das Display auf mein Steckbrett. Damit hatten beide separate Versorgungen und, tatsächlich, damit geht's! Ich werde mein kleines Board mal überarbeiten müssen. Ich hatte aber noch einen anderen blöden Fehler: in meinem Makefile hatte ich für's Übersetzen der Teile in .o-Files den uC-Typ angegeben (-mmcu=atmega88), beim Zusammenbinden der Objektdateien das aber vergessen. Dementsprechend fehlte der Start-Code komplett und so unwichtige Dinge wie Stack-Pointer waren gar nicht initialisiert :-( Seltsam, daß der avr-gcc das gar nicht angemeckert hat! Nunja ... Danke nochmals, Josef
Stefan Us schrieb: > #include <util/delay.h> > #include <util/io.h> > #include "die_lcd_lib.h" > > #define F_CPU 1000000UL Stefan, denk dran, das F_CPU deklariert werden sollte, bevor du util/delay.h einbindest. Sonst gibts ne Warnung und die Delayzeiten stimmen nicht.
:
Bearbeitet durch User
Danke für den Hinweis. Ich setze diesen Wert immer im Makefile, deswegen wusste ich das wohl nocht nicht.
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.