Hallo zusammen
Ich habe Probleme mit dem CTC-Mode im ATmega16.
In einer Interruptroutine soll der Ausgang OC1A des Timer 1
gesetzt werden. Dann soll der Timer 1 von 0 an hochzählen
und bei Gleichheit mit dem OCR1A Register den Ausgang
OC1A wieder zurücksetzten.
Hier die entsprechenden Teile meiner Lösung, die aber nicht
funktioniert. Was muss ich anders machen?
Hi
>TCCR1A = (1<<COM1A1); //OC1A bei Gleichheit löschen
TCCR1A = (1<<COM1A0); //OC1A bei Gleichheit Toggeln
Bei jedem Erreichen von OCR toggelt das Pin, und der Timer wird
zurückgesetzt.
Den Rest kannst du dir sparen.
MfG Spess
CTC -> clear timer on compare match...
Zählt hoch bis compare match, fängt dann wieder bei 0 an.
Wenn dann OC1A auf toggeln gestellt ist gehts doch.
Was geht denn genau nicht bei dir?
>TCCR1A = (1<<COM1A0); //OC1A bei Gleichheit Toggeln
Er soll aber nicht Toggeln.
OC1A soll durch die ISR von T0
alle 20ms gesetzt werden und dann
je nach Wert in OCR1A nach einer
bestimmten Zeit 0,1...1,5ms
wieder aus gehen und aus bleiben.
T1 lass ich einfach weiterzählen.
>Du hast den Port aber auch als Ausgang definiert?
Ja, und zwar mit diesen Befehlen:
[c]
SETBIT(DDRD,DDD5); //OC1A Pin zum Ausgang machen
SETBIT(PORTD,PORTD5);
[/]
Ich kenne die SETBIT Funktion/Makro nicht aber die funktionier?
Geht der Pin denn ohne den Timer auf 5V, ich hatte schonmal nen defekten
Pin...
Hm ok. Dann hab ich auch kein Plan mehr ^^
Ausserdem: IM CTC Modus zählt der Timer bis zu OCR1A und setzt sich
selber zurück. Wenn der OC1A pin aktiv ist, kann man den Pin nicht mehr
über PORT-Zugriffe steuern, d.h. der Pin wird vom Timer gesteuert. Wenn
Du ihn einmal setzten willst, wird der Pin gesetzt und bleibt dann high,
egal was du sonst noch machst. Ausser du initaialisiert den Timer samt
Pin neu.
Erst mal Danke für die Tipps.
Hier noch mein ganzes Testprogramm.
In Abhängigkeit von einer Taste
sollte OC1A im Rhythmus von 2Sek
eine halbe oder eine Sek an sein.
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#define F_CPU 8000000UL //Taktfequenz in Hz. Wichtig für alle
4
//zeitabhängigen Funktionen und ISRs
5
#include<util/delay.h>
6
7
#define nop asm volatile ("nop") //nop für ganz kurze Pausen
8
9
//Makros für die Bitverarbeitung
10
#define SETBIT(adr, bit) (adr |= (1<<bit))
11
#define CLEARBIT(adr, bit) (adr &= ~(1<<bit))
12
#define TOOGELBIT(adr, bit) (adr ^= (1<<bit))
13
#define CHECKBIT(adr, bit) (adr & (1<<bit))
14
15
16
//Anschlussklemmen der beiden LED und der Glühlampe
17
#define led_r PORTC5 //LED rechts
18
#define led_l PORTD7 //LED links und Glühlampe
19
#define port_r PORTC
20
#define port_l PORTD
21
22
23
intmain(void)
24
{
25
SETBIT(DDRC,led_r);//LED Pins zu Ausgängen machen
26
SETBIT(DDRD,led_l);
27
CLEARBIT(port_r,led_r);//LED ausschalten
28
CLEARBIT(port_l,led_l);
29
30
SETBIT(DDRD,DDD5);//OC1A Pin zum Ausgang machen
31
SETBIT(PORTD,PORTD5);//bleibt eine halbe Sek an
32
33
_delay_ms(500);//0,5s Pause
34
35
//Timer 0 einrichten.
36
//ISR wird jede ms aufgerufen
37
TCCR0=1;//Prescaler auf 0
38
SETBIT(TIMSK,TOIE0);
39
TCNT0=0;
40
41
//Timer 1 vorbereiten CTC-Mode mit OCR1A Register. Bei
42
//Gleichheit von Zähler und OCR1A wird der Pin OC1A gelöscht
irre ich mich oder wird da jetzt bei jedem Aufruf der ISR n immer neu
mit 62500 initialisiert, dann einen runter gezählt und auf 0 geprüft,
nur um dann wieder auf 62500 gesetzt zu werden?
/Edit
nein ich irre mich :)