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
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?
Lies mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR
> 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.
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 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.