Forum: Mikrocontroller und Digitale Elektronik Problem mit Quarz?


von Thomas (Gast)


Lesenswert?

Hallo

ich habe an meinem ATmega8 einen 4MHz Quarz angeschlossen. Kapazitäten
habe ich nach Datenblatt ausgewählt.

Ich kann den ATmega ohne Probleme brennen und auch das Programm läuft
(einfacher Blinker). Allerdings bleibt das Programm nach ein paar
Sekunden stehen. Habe sämtliche Funktionen überprüft; Jede Funktion
arbeitet eingenständig -> egal von wo sie aufgerufen wird, bzw. ein
Interrupt sie unterbricht.

Nun vermute ich, dass das Quarz nicht richtig schwingt; Habe ein 30MHz
Oszi da; wie kann ich messen, ob das Quarz richtig schwingt? Habe es
zwischen Masse und Xtal versucht - ohne großen Erfolg. Nun kann es
natürlich sein, dass das schon aussagekräftig genug ist.

Wie schaut eine Schwingung des Quarzes aus?

von Jens D. (Gast)


Lesenswert?

Das ist wenn ein Sinus.. nur einige Oszis koenen das nicht Messen, weil
der Quarz zusammenbricht (Kapazitive belastung)

Programmierst du in ASM?

Ich hatte am WE mal einen Fehler gehabt und stadt RETI nud RET
geschrieben naja da lief der Controller zwar aber er ging nicht mehr in
die Interruptroutine, weil er dachte noch darin zu sein

Gruss

von Marillion (Gast)


Lesenswert?

> Wie schaut eine Schwingung des Quarzes aus?

Ungefährer Sinus. Aber Vorsicht! Durch die Belastung des Tastkopfes
kann dieser Sinus zusammenbrechen, deshalb 10:1 Einstellung wählen.


Sind die Fusebits richtig gesetzt? Wenn nicht läuft die MCU evtl. auf
dem internen RC-Clock.

von Thomas (Gast)


Lesenswert?

Fuses sollten richtig sein...
Der Blinker ist auf Sekundentakt parametriert. Mit falschen Fuses würde
der Blinker nicht im Sekundentakt blinken.

Aber nochmal zur Sicherheit, wie sollten die Fuses für externen Clock
gesetzt werden?

von Thomas (Gast)


Lesenswert?

Ja,

ich programmiere ASM - derweil tippe ich dann doch auch auf irgendeinen
Überlauf. Shit, kann nicht OnChip debuggen.
Reti habe ich eingehalten;  - keine Ahnung, was da los ist...

itemp wird nirgends mehr verwendet

TIM0_OVF:
  lds    itemp,mySREG
  sbrs  itemp,0        ;überspringe, wenn erstes BIT gelöscht ist
  rjmp  timer0restart
timer0mydelay:
  inc    mydelay_azyk    ;jeden Timer2 überlauf inkrementieren
timer0restart:
  ldi    itemp,0xdb      ;Timerstartwert schreiben
  out    TCNT0,itemp
reti
;

von Olaf_K (Gast)


Lesenswert?

Ich würde eher auf ein Softwareproblem tippen, Stichwort Stack-Overflow
(z.B. Unterprogramm mit RJMP statt RCALL aufgerufen), oder Stack nicht
richtig initialisiert. Probier Deinen Code mal im Simulator und
beobachte Stackpointer und SRAM-Inhalt.

MfG Olaf

von Thomas (Gast)


Lesenswert?

So...für die Leute, die über den gleichen Fehler stolpern.
Olaf_K hat den entscheidenen Hinweis gegeben.
die mainLoop war keine wirklich schleife mehr ;-) Sie hat sich immer
wieder selber mit rcall aufgerufen...

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.