Hallo,
ich bin ein absoluter Neuling, aber ich habe bereits so gut es ging
gegoogelt - die Treffer die ich zum Thema AVR/Interrupts fand, brachten
mich nicht weiter
(http://www.windmeadow.com/node/19 ist veraltet,
http://www.avr-tutorials.com/interrupts/avr-external-interrupt-c-programming
nicht so verständlich)
Mein Problem ist leider, dass ich das Manual zum ttiny2313 nicht
eindeutig verstehe - ich danke im Voraus für die Geduld der Kenner.
Laut Datenblatt sind es bei tiny2313 folgende Register:
MCUCR - wenn ich richtig verstehe, stellt er NUR für INTO und INT1 den
Triggerfall (steigend, fallend..) mit den ISCxx ein? Und für Interrupts
an den PCINTx nicht nötig/wirkungslos?
GIMSK - Schaltet Interrupts für INTx und PCINTx ein - für alle PCIONTx
auf einmal. MUSS aktiviert werden damit Interrupts registriert werden?
EIFR - scheint aus der Beschreibung das gleiche zu tun wie GIMSK - wo
ist aber der unterschied? Wegen "Extern" vermute ich, dass die
Interrupts die so gesetzt wurden, nicht durch interne Schaltung der Pins
ausgelöst werden? ALso müssen extern(taster) ausgelöste Pins in GIMSK
und EIFR gesetzt werden?
PCMSK - von der Beschreibung her soll er bestimmte Pins der PCINTx Reihe
die in GIMSK alle auf einmal gesetzt werden, einzeln
aufnehmen/ausschließen?
Wenn es stimmt - was ist mein Fehler in dem Versuch, die
Blinkgeschwindigkeit zu ändern -
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | volatile int speed=500;
|
6 |
|
7 | ISR(INT0_vect){
|
8 | //switchen wenn registriert
|
9 | if(PINB & (1<<PINB0)){
|
10 | PORTB&=~(1<<PB0);
|
11 | speed=100;
|
12 | }else{
|
13 | PORTB|=(1<<PB0);
|
14 | speed=500;
|
15 | }
|
16 | _delay_ms(500);//zeit für tasterloslassen
|
17 | }
|
18 |
|
19 | void long_delay(uint16_t ms)
|
20 | {
|
21 | for(; ms>0; ms--) _delay_ms(1);
|
22 | }
|
23 |
|
24 | int main (void) { // (2)
|
25 | uint8_t i;
|
26 | //portb1,2 auf aus, portb 3,4 auf ein, pullups
|
27 | DDRB=0x03;
|
28 | PORTB =0x0F;
|
29 |
|
30 | MCUCR=0x01;
|
31 | GIMSK=(1<<INT0);
|
32 | EIFR=(1<<INTF0);
|
33 |
|
34 | sei();
|
35 |
|
36 | int schalt=0;
|
37 | int speed=1000;
|
38 | while(1){
|
39 | //blinkschleife
|
40 | if(schalt){//ausschalten
|
41 | PORTB&=~(1<<PB1);
|
42 | schalt=0;
|
43 | _delay_ms(speed);
|
44 | }else{//einschalten
|
45 | PORTB|=(1<<PB1);
|
46 | schalt=1;
|
47 | _delay_ms(speed);
|
48 | }
|
49 | }
|
50 | return 0;
|
51 | }
|
Wäre für Tipps sehr dankbar,
Grüße