Timerüberlauf in CTC Modus (OCR1A Problem)

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 18 4 2024  11:27:11      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


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 (reti).

_________________

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!

_________________


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag       heute wurden bisher 3 Beiträge verfasst
© x sparkkelsputz        Besucher : 180917657   Heute : 2552    Gestern : 9237    Online : 540        18.4.2024    11:27
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0354018211365