Forum: Mikrocontroller und Digitale Elektronik Timer und Interrupts


von Armin P. (armin_p)


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

  }

}

von Hubert G. (hubertg)


Lesenswert?

Armin Patick schrieb:
> if(zaehler<255
> zaehler=0x00;.....)

So bleibt der Zähler immer auf 0 da immer <255.
1
TCCR1B |=(1<<WGM12)|(1<<CS12); // CTC- MOdus + Prescaler(1024)

Hier ist der Prescaler auf /256 gestellt.

Deine konkrete Frage habe ich allerdings nicht verstanden.

von Armin (Gast)


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!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Armin Patick schrieb:
> #define F_CPU 16 000 000UL

Das sieht zwar hübsch aus, besser ist aber
1
#define F_CPU 16000000UL

von Wilhelm F. (Gast)


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.

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.