Forum: Mikrocontroller und Digitale Elektronik LEDs blinken nicht im Takt


von Onur Demir (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

nachdem ich meine ersten Gehversuche mit dem ATMega8515 (auf STK500)
absolviert habe, widmete ich mich den Timern zu. Das Programm, welches
ich beigefügt habe, hat den simplen Auftrag, bei einem Overflow ein
Interrupt auszulösen, und den PortB Zustand zu invertieren. Die
Realisierung erfolgt über den Timer0. Eigentlich easy.

Problem: Bei derzeitiger Einstellung sollen alle LEDs an PortB mit
einer Freq. von 7Hz leuchte (also deutlich zu erkennen). Interner
Oszillator bei 1MHz, per Fuse eingestellt.

Das Problem ist, dass nicht alle LEDs im Takt blinken. Erwartet hätte
ich ein synchrones blinken aller LEDs. Bei dieser Freq. leuchten die
LEDs 0 und 1 asynchron zu den anderen.

Kennt einer dass von euch?

MFG

Onur

von Olaf K. (Gast)


Lesenswert?

Am Anfang fehlen die Interrupt-Vektoren (siehe Datenblatt). Bei einem
TOV0-Interrupt springt er irgendwo in den Code hinein. Es sei denn, Du
hast die Bytes am Anfang so abgezählt, daß die TOV0-Routine genau an
der richtigen Stelle beginnt...

Außerdem sieht Deine main-Loop seltsam aus: Du pollst das TOV0-Flag,
und falls es gesetzt sein sollte, läuft der Code unkontrolliert in die
ISR-Routine hinein. Ich weiß nicht genau, ob man in der Loop überhaupt
jemals ein gesetztes Bit vorfindet (der Interrupt dürfte dem immer
zuvorkommen), falls ja, dann wird wohl ziemlich schnell der Stack
überlaufen (wegen reti ohne zugehörigem call).

Am Ende das ret ist überflüssig.

MfG Olaf

von Muppets (Gast)


Lesenswert?

...und immer erst das Datenblatt lesen.
Äh nicht nur Lesen, auch verstehen.

Die 2 von der Muppets Show wink

von Laplace (Gast)


Angehängte Dateien:

Lesenswert?

Hier hast du mal einen von meinen ersten "Gehversuchen", allerdings
mit dem ATMega8. Du musst nur die Include-Zeile anpassen (.INCLUDE
"m8515def.inc"), dann sollte das bei dir laufen.

Deine ISR ist schon richtig, sie wird nur nicht aufgerufen, weil du am
Anfang deines Programmes keinen Vektor definiert hast.
So etwa:
.org   $006
    rjmp ISR_TOV0  ;Timer0 OV
Damit sagst du dem Controller, er soll in deine ISR_TOV0 springen
sobald ein Timer0 Overflow auftritt.
Du musst deinen Programmstart allgemein etwas sauberer schreiben.

von Onur Demir (Gast)


Lesenswert?

Hallo,

Ihr habt Recht. Das Grundgerüst meines Programms ist fehlerhaft. Beim
Programm selber habe ich mich eigentlich an das Applikationssheet von
Atmel gehalten.

Naja, sind noch Gehversuche. Ich hoffe dass ich die LEDs synchron zum
blinken bekomme.

MFG

Onur

von TravelRec. (Gast)


Lesenswert?

Nur nicht den Mut verlieren, wenn´s das erste Mal mit ´nem Programm
geklappt hat, kommt schnell die Lust auf mehr ;-).

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.