Timer1 Compare Mode Probleme,Mega16

Gast #825060
Lesenswert?
• ▲
▼
Hallo,

ich habe Probleme mit dem Compare Mode des 16bit Timers.
Mein Programm soll den Ausgang OC1A mit einer langsam schneller 
werdenden Frequenz ansteuern. Dazu will ich kontinuierlich den 
Vergleichswert OCR1A Wert in einer Schleife ändern. f=(fquarz/(2*OCR1A)
Um dies zeitlich zu koordinieren, warte ich bis der Controller das match 
bit im TIFR setzt(das er nach Interrupt wieder löscht).
Leider springt der Controller nicht in meine for schleife und ändert 
somit den
Wert nicht. In einer Simulation mit Win AVR hängt er in dem Interrupt 
ähnlich einer Schleife fest und verläßt diese nicht mehr. Frage ist 
warum. Wenn ich weiter das Programm verändere und z.B noch z.B ein 
Portb|(1<<1); in der while schleife setze überspringt er auch die for 
schleife, geht einmal in den compare interrupt und dann verharrt er in 
der while...
Ich verstehe nicht was ich falsch mache. Bedanke mich im voraus für jede 
Hilfe. Zum Kompilieren verwende ich Programmers Notepad.
Angehängte Dateien:
Gast #825089
Lesenswert?
• ▲
▼
jetzt hängt er im loop_until_bit... da das bit bei einen compare nicht 
mehr ausgelöst wird. Vieleicht hast du noch eine Idee woran das liegt.
 Wenn ich das loop_until_bit_is_set Wegnehme verharrt er auch wieder in 
der compare interupt Schleife. Aber das Vergleichregister verändert sich 
dann. Dass heißt, das die for schleife jetzt arbeitet(auch wenn er da 
nciht hinspringt).
Gast #825355
Lesenswert?
• ▲
▼
Habe noch eine Variable eingefügt die den kontinuierliches Laden bis zu 
einer gewissen Frequenz, ohne sprünge. Leider springt das Programm 
trotzdem nur einmal in  Compare Interrupt danach wird anscheinend nicht 
nochmal ein match ausgelöst. Woran kann das noch liegen? (was heißt 
pollen?)


Zur Funktion: Es ist wichtig das OCR1A langsam von 65000 bis 10000 läuft

volatile unsigned short i=65535,k=0;

ISR(TIMER1_COMPA_vect){
k=1;
OCR1A=i;        //aktualisierung des Vergleichregisters
}

int main(){

TCCR1A |= (1<<COM1A0);             //Umschalten des Ausgangs OC1A
TCCR1B |= (1<<CS10)|(1<<WGM12);     //interne Frequenz 1.1 und löschen 
des Timers nach match (CTC Mode)
TIMSK |= (1<<OCIE1A);      //enable timer1 compare interrupt
DDRD |= (1<<5);        //Ausgang für digitalen Ausgang

OCR1A=65535;        //laden des Vergleichregisters
sei();

for(i=65535;i>=10000;i--){
while(k==0){}        //damit jeder i Wert runtergezählt wird und keine 
Sprünge auftreten
k=0;

}
while(1){}
return 0;
}
Angehängte Dateien:
Gast #825414
Lesenswert?
• ▲
▼
Nachtrag:

>Die Impulse werden immer kürzer und bleiben irgendwann stehen.

Sie bleiben natürlich nicht stehen sondern die Pulsbreite
wird nicht mehr kleiner weil die Schleife abbricht.

*Scheiß auf den Simulator !* Der taugt nicht die Bohne.
Programme simuliert man nicht, man probiert sie aus. Zwischen
Simulation und Realität gibt es erhebliche Unterschiede.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.