www.mikrocontroller.net

Forum: Compiler & IDEs Timer Compare Match


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha wrote:
>
> TCCR1B = (1<<CS10);       //setzt den Prescaler 64
> 

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

Autor: Datasheet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte es sich um einen ATMega16 handeln dann hier die Auflösung
...
void initTimer()
{
  // CTC Mode aktivieren
  TCCR1A |= (0<<WGM11)|(0<<WGM10);
  TCCR1B |= (0<<WGM13)|(1<<WGM12);
  // Timer 1 Vorteiler setzen
  TCCR1B |= (0<<CS12)|(1<<CS11)|(1<<CS10);   // Vorteiler 64
  // Vergleichswert setzen
  OCR1A = 11000;
  // Interrupt wird durch Compare Match ausgelöst
  TIMSK |= (1<<OCIE1A);
  //ISR wird ausgelöst
  TIFR |= (1<<OCF1A);
  sei();
}

//Timerinterrupt Compare
ISR(TIMER1_COMPA_vect)
{
  // Toggle Pin  
  PORTA ^= (1<<PA0);
}
...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.