Forum: Mikrocontroller und Digitale Elektronik Interrupt auslösen


von Durand (Gast)


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

von Karl H. (kbuchegg)


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?

von Nobody (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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
}

von Durand (Gast)


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

von Karl H. (kbuchegg)


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.

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.