Autor |
Timerüberlauf in CTC Modus (OCR1A Problem) |
|
|
|
|
BID = 645691
Peda Schriftsteller
Beiträge: 891
|
|
Hallo,
hab mal angefangen beim atmega interrupts in kombination mit timern zu benutzen.
Leider schert sich das Programm in keinster Weise um den Wert in OCR1A.
Von der Ausgabe her scheint der Timer immer komplett vollzulaufen und dann erst den Interrupt auszulösen.
Verwendet wird ein atmega8.
Code : |
#include <avr/io.h>
#import <avr/delay.h>
#include <avr/interrupt.h>
//Variablen definieren
int main (void) {
DDRD = (1 << DDD6); // Pin 6 als Ausgang
//Timer mit Vorteiler 8 starten
TCCR1B |= (1<<CS11);
//Überlauf setzen
TCCR1A|=(1<<WGM12);
OCR1AL=64;
//Interrupt einschalten
TIMSK = _BV(OCIE1A); //Timer Interrupt enable
sei();
while(1){
}
return 0;
}
//Interrupts
ISR(TIMER1_COMPA_vect)
{
cli();
PORTD &= ~(1<<PD6); //Port6 ausschalten
_delay_ms(200);
PORTD = PORTD | ( 1<<PD6 ); //Port6 einschalten
sei();
} |
|
Gibt es etwas einfaches was ich übersehen habe ?
_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))
[ Diese Nachricht wurde geändert von: Peda am 6 Nov 2009 9:45 ]
[ Diese Nachricht wurde geändert von: Peda am 6 Nov 2009 9:53 ] |
|
BID = 645698
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Moin Peda!
Das Bit WGM12 liegt in TCCRB1, nicht in TCCRA1.
Ansonsten würde ich Das Vergleichsregister vor dem Starten des Timers beschreiben, also erst OCR1A schreiben, dann den Timer starten, indem du TCCRB1 beschreibst.
Das fiese ist, dass WGM10-3 nicht komplett in einem Kontrollregister liegt .
Code : |
cli();
PORTD &= ~(1<<PD6); //Port6 ausschalten
_delay_ms(200);
PORTD = PORTD | ( 1<<PD6 ); //Port6 einschalten
sei();
|
|
Im Interrupt, wenn irgend möglich, sowas vermeiden. Damit fährt der µC 200ms völlig sinnlos eine Warteschleife.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 6 Nov 2009 10:31 ] |
|
BID = 645701
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Achja, mal eine Taktfrequenz (die du leider nicht nennst ) von 1MHz vorausgesetzt, wird eine Frequenz von etwa 1.95kHz erzeugt, was in einer Periodendauer von etwa 500µs resultiert.
Das heißt, während dein µC 200ms verbrät, finden ca. 400 positive Vergleiche zwischen TCNT und OCR statt.
Man gut, dass du das I-Flag nicht erneut in der ISR gesetzt hast .
Du kannst dort übrigens auch cli und sei weglassen, das erledigt die Hardware automatisch beim Eintritt und Verlassen einer ISR (ret i).
_________________
|
BID = 645707
Peda Schriftsteller
Beiträge: 891
|
Hi,
danke für die Lösung !!!!
manchmal sitzt man vor den Datenblättern und sieht den Wald vor lauter Bäumen nicht.
Hmm mit den Schlüssen in deinem 2tenPost hattest du natürlich recht, aber ich hab was gebraucht, um zu testen obs funktioniert, und da kann man 500us blinkimpulse bei einer led gerade noch erkennen, wenn nicht zuviele auf einmal kommen.
_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))
|
BID = 645709
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin Peda!
Zitat :
|
um zu testen obs funktioniert,
|
Ich weiß, mach ich auch so.
Und jetzt klappt es?
_________________
|
BID = 645825
Peda Schriftsteller
Beiträge: 891
|
Freilich klapp es jetzt, dank deiner kompetenten Hilfe !!!
_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))
|
BID = 645826
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Schön!
_________________
|