Forum: Mikrocontroller und Digitale Elektronik Eine Sekunde sind plötzlich 10 lang


von Günther F. (taraquedo)


Lesenswert?

Hallo!

Seit gestern suche ich nun nach einem Fehler, warum mein HD44780-Display 
nicht initialisiert, obwohl es dieses in einer anderen Schaltung mit 
der, bis auf die Pinkonfiguration, identischen Software tut. Nun stellte 
ich soeben fest, dass was mit dem Timing nicht stimmt. Folgender Code:
1
while(1) { for (i=0; i<50; i++) _delay_ms(20); usw; }
Sollte eine LED an- und ausschalten und ich erwarte ein T_On von 1s und 
ein T_Off von 1s, da 50*20ms=1s (In usw; steckt natürlich LED an, 
gleiche Wartezeit und LED aus). Ich erhalte aber 10s.

Verbaut ist ein 10MHz Quarz an einem Mega644V und unter 
Projekteinstellungen habe ich auch 10000000 Hz angegeben. Eine 
Redefinition von F_CPU bringt nur eine Warnung, ändern tut sich nix.

Was habe ich denn verpennt? Ich denke mal, dass ich damit endlich den 
Grund gefunden habe, warum das Display nicht läuft. Das Timing der 
Init-Sequenz soll ja kritisch sein.

Grüße!

von JojoS (Gast)


Lesenswert?

vermutlich der alte 'Standard' Fehler: die _delay_ms() Funktion erlaubt 
nicht beliebig lange delays. Die maximale Verzögerungszeit hängt von der 
Taktfrequenz ab, schaue mal in den Header wo delay_ms definiert ist, da 
steht die Formel für die max. Zeit drin.
Eine andere Fehlerquelle ist eine falsche Einstellung die per 'Fuse' 
gemacht wird: wird wirklich der ext. Quarztakt benutzt? Faktor 10 kann 
auch daher kommen das ein interner 1Mhz Takt aktiv ist.

von Joe (Gast)


Lesenswert?

da läuft der interne takt.umstellen der fuses hilft.

von JojoS (Gast)


Lesenswert?

nochmal nachgesehen, das max. delay bei 10Mhz sollten 26ms sein, wäre in 
dem Code also ok. Bleibt aber noch die falsche Fuse.

von Günther F. (taraquedo)


Lesenswert?

Ja, genau. Deshalb wählte ich 20ms, weil ich das mit den 26 komma 
irgendwas schon gelesen hatte.

Aber jetzt habe ich mich AUSGESPERRT! Statt einen Schritt nach vorn habe 
ich einen nach hinten gemacht. Ich programmierte die LFUSE auf 0xE0, das 
heißt SUT belassen bei 0b10 (65ms Wartezeit), CKDIV8 habe ich auf 1 
gesetzt also keine Frequenzteilung und CKSEL auf 0b0000 (externe 
Quelle).

Meine Hardware hat an XTal1 und XTal2 einen 10MHz Quarz dicht gesetzt 
(2polig, hohe Bauform). Jeweils von XTAL geht ein Kondensator zur Masse. 
Die könnten allerdings zu groß sein. Was nimmt man da so? Würden zu 
große C das Schwingen verhindern? Es scheint ja gerade zu, als ob er 
nicht mehr anschwingt und ich so nicht rein komme. Aber ich habe auch 
kein Oszi, um das zu messen. Was mache ich denn jetzt!?

Grüße!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Meine Hardware hat an XTal1 und XTal2 einen 10MHz Quarz dicht
> gesetzt (2polig, hohe Bauform).

Also External Crystal

> ... und CKSEL auf 0b0000 (externe Quelle).

Warum machst du denn sowas? Das ist falsch.

> Aber jetzt habe ich mich AUSGESPERRT!

Klar.

http://www.mikrocontroller.net/articles/AVR_Fuses#Taktquellen_Fuse_Einstellung

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

>CKSEL auf 0b0000 (externe Quelle).

Typischer fehler, du darfst nicht auf externe Taktquelle fusen sondern 
auf Externen Quarz.

Im moment erwartet dein AVR einen sauberen fertigen Takt an XTAL1
Da du jedoch einen Quarz und keinen Quarzoszillator (4 Beine) dran 
hängen hast, kann das ganze so nicht laufen.

Am einfachsten programmierst du einen anderen AVR, dass er z.b. mit nem 
CTC timer dir nen Takt erzeugt. Diesen Takt kannst du dann auf XTAL1 
legen dann solltest du den µC wieder programmieren können.

von Günther F. (taraquedo)


Lesenswert?

heul Habe ich gerade beim aufrichtigerem Lesen des DB auch gesehen. So 
ein Mist. Gott sei dank habe ich hier noch einen zweiten rumliegen. Zum 
Reaktivieren steht ja was bei dem Link. Dann habe ich jetzt wohl extra 
Arbeit. *grummel, grummel*

Vielen Dank!

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.