Interrupt auslösen

Gast #1718804
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
#1718807
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?
#1718822
Lesenswert?

1
#include<avr/io.h>
2
#include <avr/interrupt.h>
3

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

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

13
  sei();
14

15
  OCR1A=15624;  // each one second
16

17
  while(1)
18
  {}
19
}
20

21
uint8_t Time2;
22
uint8_t Time3;
23

24
ISR(TIMER1_COMPA_vect)
25

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

29
  Time2++;
30
  if( Time2 == 3 ) {
31
    PORTB ^= 0x02;  // 2. LED, alle 3 Sekunden
32
    Time2 = 0;
33
  }
34

35
  Time3++;
36
  if( Time3 == 5 ) {
37
    PORTB ^= 0x04;  // 3. LED, alle 5 Sekunden
38
    Time3 = 0;
39
  }
40

41
}
Gast #1718846
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
#1718878
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
1
#include<avr/io.h>
2
#include <avr/interrupt.h>
3

4
volatile uint8_t CountDown;
5

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

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

15
  OCR1A=15624;  // each one second
16

17
  CountDown = 0;  // Stoppuhr ausschalten
18

19
  sei();
20

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

27
    // irgendetwas ist passiert
28
    // Schalte die Stoppuhr auf 4 Sekunden
29
    // 4 Sekunden später soll die LED 5 einschalten
30
    CountDown = 4;
31
  }
32
}
33

34
ISR(TIMER1_COMPA_vect)
35

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

40
    if( CountDown == 0 ) {   // Stoppuhr abgelaufen?
41
      PORTB = 0x10;          // 5. Led einschalten
42
    }
43
  }
44
}

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

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