Forum: Mikrocontroller und Digitale Elektronik Spontaner Reset ATmega88 mit LCD


von Josef Möllers (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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 :-)

von Stefan F. (Gast)


Lesenswert?

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.

von Josef Möllers (Gast)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.