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.
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.