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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.