www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt auslösen


Autor: Durand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich benutze der ATMega32/STK600
Ich möchte  nacheinander mehrere Interrupt auslösen. Der ertse sollte 
bei 1s (das habe ich schon im Griff) sich auslösen, der zweite soll ein 
Hadware interrupt  entweder mit PB3 oder PD4/5 sein bei 10s un der 
dritte sollte ein sofware Interupt bei 30s. Ich habe den Timer1 mit 16 
bit benutzt.
Frage:
Darf oder kann ich Overflow und Compare Interupt in den selben Code 
ausführen?
Kann ich nur mit dem Timer2 die drei verschidenen Interrupt auslösen 
oder soll ich der timer0 und timer1?


hier mein code


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

int main (void)

{
  //int volatile counter =0;
  DDRB=0xff;// Set LEDs to output
  TCCR1B |=((1<<CS10)|(1<<CS11)|(1<<WGM12));// Set up timer in CTC Mode
  TIMSK  |= (1<<OCIE1A);//manage specifics inetrrupt___Enable compare 
match with Timer/counter1
  TCCR1A |= (1<<COM1A0);//
  sei();
  OCR1A=15624;  // each one second
//  OCR1B=19530;// each 20 seconde??????

   while(1)
    {}
}

ISR(TIMER1_COMPA_vect)

{
  DDRB ^=0xff;// Led toggle
}


/*ISR(TIMER1_COMPB_vect)

{
  DDRB ^=0xff;// Led toggle
}
*/

es toggle nur bei 1s.


vielen Dank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durand schrieb:

> Frage:
> Darf oder kann ich Overflow und Compare Interupt in den selben Code
> ausführen?

Wer will es dir verbieten?

> Kann ich nur mit dem Timer2 die drei verschidenen Interrupt auslösen

Gegenfrage:
Wenn du eine Uhr nur mit Sekundezeiger hast, wie kriegst du es hin, dass 
du

* Tätigkeit 1 alle 15 Sekunden
* Tätigkeit 2 alle 40 Sekunden
* Tätigkeit 3 alle 2 Minuten

ausführst. Oder brauchst du dazu 3 Uhren?

Autor: Nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> DDRB ^=0xff;// Led toggle

Lass das DDR Register in Ruhe.
Mit den DDR Registern wird eingestellt ob ein Pin Eingang oder Ausgang 
sein soll.
Wenn du einen Ausgang von 0 auf 1 oder umgekehrt schalten willst, dann 
benutze das PORT Register. Dazu ist es da.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include<avr/io.h>
#include <avr/interrupt.h>

int main (void)
{
  DDRB = 0xff;// Set LEDs to output

  TCCR1B |=((1<<CS10)|(1<<CS11)|(1<<WGM12));// Set up timer in CTC Mode
  TCCR1A |= (1<<COM1A0);//
  TIMSK  |= (1<<OCIE1A);//manage specifics inetrrupt___Enable compare
match with Timer/counter1

  sei();

  OCR1A=15624;  // each one second

  while(1)
  {}
}

uint8_t Time2;
uint8_t Time3;

ISR(TIMER1_COMPA_vect)

{
  PORTB ^= 0x01;    // 1. Led, bei jeder Sekunde

  Time2++;
  if( Time2 == 3 ) {
    PORTB ^= 0x02;  // 2. LED, alle 3 Sekunden
    Time2 = 0;
  }

  Time3++;
  if( Time3 == 5 ) {
    PORTB ^= 0x04;  // 3. LED, alle 5 Sekunden
    Time3 = 0;
  }

}

Autor: Durand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


danke für Ihre Mühe.
Was ist wenn ich inzwischen ein Hardware Interrupt auslösen möchte. Da 
ich erwate nach 10s ein Extern Signal und dannach kann ich nach 30 
secondes ein interrupt noch auslösen.


danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durand schrieb:
> Hallo,
>
>
> danke für Ihre Mühe.
> Was ist wenn ich inzwischen ein Hardware Interrupt auslösen möchte. Da
> ich erwate nach 10s ein Extern Signal und dannach kann ich nach 30
> secondes ein interrupt noch auslösen.

?
Das hab ich jetzt nicht verstanden.

Aber nichts und niemand hindert einen daran, sich noch ein paar 
zusätzliche Variablen einzuführen, die irgendwelche Zeiten darstellen 
und in der ISR manipuliert werden können. Zb eine Stoppuhr, die nach 
einer bestimmten Zeit nach einem Ereignis eine LED einschaltet
#include<avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t CountDown;

int main (void)
{
  DDRB = 0xff;// Set LEDs to output

  TCCR1B |=((1<<CS10)|(1<<CS11)|(1<<WGM12));// Set up timer in CTC Mode
  TCCR1A |= (1<<COM1A0);//
  TIMSK  |= (1<<OCIE1A);//manage specifics inetrrupt___Enable compare
match with Timer/counter1

  OCR1A=15624;  // each one second

  CountDown = 0;  // Stoppuhr ausschalten

  sei();

  while(1)
  {
    // stellvertretend für was anderes wird hier einfach nur gewartet
    // das kann auch irgendwas anderes sein, zb ein Tastendruck
     _delay_ms( 5000 );  

    // irgendetwas ist passiert
    // Schalte die Stoppuhr auf 4 Sekunden
    // 4 Sekunden später soll die LED 5 einschalten
    CountDown = 4;
  }
}

ISR(TIMER1_COMPA_vect)

{
  if( CountDown > 0 ) {      // die Stoppuhr ist eingeschaltet
    CountDown--;             // 1 Sekunde runterzählen

    if( CountDown == 0 ) {   // Stoppuhr abgelaufen?
      PORTB = 0x10;          // 5. Led einschalten
    }
  }
}

Sei ein bischen kreativ. Sieh dich um, wie du Probleme im realen Leben 
löst und bilde den Prozess in einem Programm nach. Niemand sagt, dass 
man alle Probleme nur damit lösen darf, indem die Hardware das komplette 
Problem lösen muss.

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.