mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer/Counter ATmega32


Autor: mutti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hab ein Problem mit dem Timer/Counter1 beim Atmega32, hab mich nen 
bissl reingefuchst aber irgendwas scheint nicht richtig zu sein.

MEIN QUELLTEXT:

************************************************************************ 
***
************************************************************************ 
***
************************************************************************ 
***

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t flag = 0, overflow = 0;
uint16_t loop=32000, timer1=0, timer2=0, timer=0;

int main(void)  {



//*** TIMER/COUNTER 1: 16-Bit: CPU-Takt(16MHz): Triggert auf pos. Flanke 
***//

  TCCR1B |= (0<<CS12)|(0<<CS11)|(1<<CS10);
  TIMSK |= (1<<TICIE1)|(1<<TOIE1);
  TCCR1B |= (1<<ICES1);

  //*** INTERRUPT-Routinen Zulassen/Aktivieren ***//

  sei();

  //*** Datenrichtungen und Ports festlegen ***//

  DDRD = 0x00;
  DDRC = 0xFF;
  PORTC = 0xFF;
  PORTD = 0x00;


  while(1)  {

    if (timer == 1600)   //1600 entspricht bei 16MHz einer
                                        //Pulsbreite von 100us
    {
        //Hier soll was passieren wenn die
                                //Eingelesene Pulsweite genau der 
Pulsweite
                                //des Signals entspricht
    }
  }
}

//*** INTERRUPT-Routine bei Erkennung der positiven(logisch:HIGH, später 
logisch:LOW) Flanke ***//

ISR (TIMER1_CAPT_vect)   {


  if (timer1==0)
  {
    // Timerwert wird ausgelesen!
    timer1 = ICR1;
    timer2 = 0;

    // Timerinterrupt reagiert jetzt auf  Flanke die logisch: LOW nach 
sich zieht
    TCCR1B & (0<<ICES1);
  }
  else
  {
    // Timerwert wird ausgelesen
    timer2 = ICR1;

    // Abfragebedingung ob Timer ein NULL-Durchgang hatte, und der 
daraus resultierenden Fehlerbehebung bei der Berechnung
    if (overflow == 0)
    {
      timer = timer2 - timer1;
    }

    else
    {
      timer = timer2 + (65536 - timer1);
    }

    timer1 = 0;

    // Timerinterrupt reagiert jetzt wieder auf  Flanke die logisch:HIGH 
nach sich zieht
    TCCR1B & (1<<ICES1);
  }



}

//*** INTERRUPT-Routine für Timer NULL-Durchgang ***//

ISR (TIMER1_OVF_vect)  {

  overflow = 1;

}

************************************************************************ 
***
************************************************************************ 
***
************************************************************************ 
***

Meine Fragen:

1. Müssen die Fuse Bits gesetzt sein, hab nen 16 MHz Quarz dran!?
2. Mit der Schleife, in der etwas passieren soll, hab ich nen Problem... 
die ist wahr(lampen an:: PORTC = 0x00;) bei nem Wert von 16000 hab ich 
nen umrechnungsfehler??

3. Was fällt euch noch an Fehlern auf??


mfg mutti

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.