Forum: Compiler & IDEs Timer Compare Match


von Micha (Gast)


Lesenswert?

int main(void)
{
DDRA = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
// PortB als eingang alle Pull up Widerstände acktiviert
DDRB = 0x00;
PORTB = 0xFF;


//Timer einstellen
TCCR1B = (1<<CS10);       //setzt den Prescaler 64
OCR1A = 11000;
TCNT1 = 0;                             //startewert des Counters
TIMSK = 1<<OCIE1A;                     //Compare-Int aktivieren
sei();

for(;;)
{
//hier werden die Ports gesetzt !
//set_Porta(PA1);
//set_Porta(PA0);
}
}

SIGNAL (SIG_OUTPUT_COMPARE1A)
{
//hier nicht Warum ?
set_Porta(PA1);
set_Porta(PA0);
)

Was könnte das Problem sein wenn der Interrupt nicht ausgeführt wird.
Kopiere ich die Befehle in main werden die Ports gesetzt !

Eigentlich hat der Code schon einmal funktioniert. Der einzige 
unterschied ist das ich jetzt den interne Quarz verwende.

von Rolf Magnus (Gast)


Lesenswert?

Aus den Registernamen und Interrupt-Handlern schlußfolgere ich einfach 
mal, daß es vermutlich um einen AVR geht. Jetzt müßtest du nur noch 
verraten, um welchen Prozessor es konkret geht.

> unterschied ist das ich jetzt den interne Quarz verwende.

Es gibt beim AVR keinen internen Quarz. Meinst du den RC-Oszillator?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Micha wrote:
>
1
> TCCR1B = (1<<CS10);       //setzt den Prescaler 64
2
>

Sieht seltsam aus. was set_Porta macht, weiß allein ger Geier. Ebenso, 
um welche Hardware es geht. In der Kristallkugel erscheint ein 
verschwommen Etwas, das nach ATmega32 aussieht...

Johann

von Datasheet (Gast)


Lesenswert?

Sollte es sich um einen ATMega16 handeln dann hier die Auflösung
1
...
2
void initTimer()
3
{
4
  // CTC Mode aktivieren
5
  TCCR1A |= (0<<WGM11)|(0<<WGM10);
6
  TCCR1B |= (0<<WGM13)|(1<<WGM12);
7
  // Timer 1 Vorteiler setzen
8
  TCCR1B |= (0<<CS12)|(1<<CS11)|(1<<CS10);   // Vorteiler 64
9
  // Vergleichswert setzen
10
  OCR1A = 11000;
11
  // Interrupt wird durch Compare Match ausgelöst
12
  TIMSK |= (1<<OCIE1A);
13
  //ISR wird ausgelöst
14
  TIFR |= (1<<OCF1A);
15
  sei();
16
}
17
18
//Timerinterrupt Compare
19
ISR(TIMER1_COMPA_vect)
20
{
21
  // Toggle Pin  
22
  PORTA ^= (1<<PA0);
23
}
24
...

Achja, Vorteiler 64 und Vergleichswert 11.000 macht bei 1MHz 0,704s. Ich 
weiß, der OP hat natürlich nicht geschrieben welchen Takt er hat (warum 
auch). Aber der interne Oszi kann doch nur 1, 2, 4 und 8 MHz macht dann 
0,704s, 0,352s, 0,176s und 0,088s. So gewollt?

Ich weiß, dass es nicht mehr akut sein wird ;-)
Ich hatte bloß gerade eben das gleiche Problem und eigentlich keinen 
Bock auf Datenblatt lesen. Vielleicht kann sich der ein oder andere das 
jetzt sparen.

bye
Datasheet

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.