Spontaner Reset ATmega88 mit LCD

Gast #3939430
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.
(Firma: matzetronics) #3939466
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 :-)
Gast #3939543
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.
Gast #3939714
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren