Timer und Interrupts

OP #3493174
Lesenswert?

Hallo,ich habe dieses Teil am Interrupt nicht verstanden if(zaehler<255 
zaehler=0x00;.....) normalerweise,wenn zaehler>255 sein muss,oder?Das 
program soll ein Lösung für eine Aufgabe sein! (Atmega 2560)

2) Ich musste alle nicht benötigten Komponenten des Mikrocontrollers 
Deaktivieren.Dafür habe die IDLE Mode gewählt ist ok?

3)Ich habe nicht verstanden wie die Ocr1a berechnet ist.Normalerweise 
die Formel ist.Ocr1a =(0.5 sec * (fcpu/Prescaler))-1) das ist für led 
von 1Hz.

Ich danke euch!


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

#include<avr/sleep.h>


#define F_CPU 16 000 000UL

#define TICKS ((uint16_t) 15624)
   // globalle Variable
volatile uint8_t zaehler;
    // Prototyp
void init_timer1_ctc(void);


  void init_timer1_ctc(void){


  TCCR1B |=(1<<WGM12)|(1<<CS12); // CTC- MOdus + Prescaler(1024)

  TIMSK1  |=(1<<OCIE1A); //  interrupt aktivieren,wenn der Vergleichwert 
erreicht ist


  OCR1A=TICKS; // Vergleichwert laden

  }


ISR(TIMER1_COMPA_vect)
{
  ++zaehler;        // PORTA inkrementiern
  if(zaehler<255)
  zaehler=0x00;  // löschen bei Überlauf

  PORTD^=(1<<PD0);// LED EIN BZW AUS
}


int main (void){
    DDRA    =0xFF;    // PortA als Ausgang
  DDRD   |=(1<<PIN0);// PD0 Output PD1 Input

  PORTD |= (1<<PD1);  // Pull-Up setzn


  // Timer1 Konfiguration
   init_timer1_ctc();


  set_sleep_mode(SLEEP_MODE_IDLE);

  sleep_mode();

  sei();

  while(1)
  {

     if(PIND & !(1<<PD1)){

     zaehler = 0x00;  // Taster drücken Zaehler auf null

     }

    PORTA=zaehler; //Binärzahl auszgeben

  }

}
Gast #3494341
Lesenswert?

Hallo!
1)Wenn der Zähler =0x00 immer auf 0 bleibt dann PORTA auch ,weil
PORTA=zaehler; .Und Laut Aufgabestellung(unten) muss Port A die Zahl der 
Taktzyklen als Binärzahl auszugeben.Deswegen dachte ich ,dass der Zähler 
>255
sein muss.Ist das nicht richtig?

2) Ich habe die OCR1A MIT 256 berechnt aber ich bin nicht auf 15625 
gekommen!wie geht das denn!

Aufgabe:
Programmieren Sie eine Anwendung, die am Port C.1 eine LED mit einer 
Frequenz von 1 Hz
ansteuert. Zusätzlich ist am Port A die Zahl der Taktzyklen als 
Binärzahl auszugeben. Bei einem
Überlauf des Zählers soll die Zählung wieder bei Null beginnen.
1) Realisieren Sie das oben beschriebene Projekt mit einem 
Softwaretimer! Überprüfen Sie
die Genauigkeit Ihrer Taktfrequenz am Oszilloskop.
2) Modifizieren Sie Ihr Lösung für Aufgabe 1) und stellen Sie das 
Programm so um, daß die
Zeitmessung mit einem Hardwaretimer und Interrupts erfolgt!
3) Ergänzen Sie Ihre Lösung für Aufgabe 2) um eine Resetfunktion, die 
beim Drücken eines
Tasters den Zähler auf Null zurück setzt!
Gast #3494404
Lesenswert?

Vielleicht auch so:
1
#define F_CPU 16.0  // CPU clock in MHz

Float-Wert, rechnen tut damit der Preprozessor, z.B. 
Timervoreinstellung, Baudrate, das belastet dann nicht den Code und die 
Laufzeit mit Float-Rechnungen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren