Hallo zusammen,
die PIN Change Interrupts des 2313A bringen mich zur Verzweifelung. Hier
mal ein Code mit dem ich:
a) den Interrupt INT0 getestet habe
b) mich mit der Sleep funktion auseinander gesetzt habe und....
c) der Pin Change Interrupt
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/sleep.h>
|
4 | #include <util/delay.h>
|
5 | #define F_CPU 8000000UL // 8 MHz (fuer delay.h)
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | ISR (INT0_vect)
|
11 |
|
12 | {
|
13 | PINB = 0x02;
|
14 | asm("nop");
|
15 |
|
16 | }
|
17 |
|
18 |
|
19 | ISR (PCINT_B_vect) // für PinChange an Port A in PCINT_A_vect ändern
|
20 | {
|
21 | PINB = 0x04;
|
22 | asm("nop");
|
23 | }
|
24 |
|
25 | int main(void)
|
26 |
|
27 | {
|
28 | DDRA = 0x00; // auch ein setzten auf Oxff ( Port auf Ausgang ) bringt nichts
|
29 | PINA = 0x03;
|
30 | DDRB = 0xff;
|
31 | DDRD = 0x00;
|
32 |
|
33 |
|
34 |
|
35 | // Interrupt INT0 auf ansteigende Flanke, POwer-down und Sleep mode setzen
|
36 | MCUCR |= (1<<ISC01) | (1<<ISC00) | (1<<SM0) | (1<<SE) | (1<<SM1);
|
37 |
|
38 |
|
39 | //externer Interrupt INT0 und Pin-change einschalten
|
40 | GIMSK |= (1<<INT0) | (1<<PCIE0); // hier müßte ich eigentlich lt Datenblatt PCIE1 eintragen
|
41 |
|
42 |
|
43 | // mit PCMSK und PCINT7 ist PB7 der Interruptauslöser
|
44 | PCMSK |= (1<<PCINT7); // hier müßte PMSK1 und PCINT8 stehen
|
45 |
|
46 | sei();
|
47 | sleep_mode(); // wird durch INT0 ==PD2 oder PCIE0==PB7 wieder geweckt
|
48 |
|
49 |
|
50 |
|
51 |
|
52 | while(1)
|
53 | {
|
54 | asm("nop");
|
55 | }
|
56 |
|
57 |
|
58 | }
|
Im Code, so wie er dort steht, funktionieren die Pin Chnage Interrupts
des kpl. PORTB Registers ( je nach Angabe in PCINT0..PCINT7).
Da ich diverse, fertig bestückte und funktionierende Platinen besitze,
möchte ich gerne einen PIN Change Interrupt an PA0 und/oder PA1 haben.
Dazu habe ich im Quellcode mal die Punkte als Kommentar getippelt, die
geändert werden müßten.
Lt. Datenblatt:
-- Im GIMSK das Bit3 PCIE1 setzen
-- Im PCMSK1 das Bit0, Bit1 PCINT8, PCINT9 setzen
-- den ISR des PIN-Change-Interrupt in PCINT_A_vect ändern
Nun geht der Spuk weiter. PCIE1 und PCMSK1 sind dem Compiler unbekannt.
Also hier Forum gesucht und gefunden: die Headerdatei iotn2313a.h mit
Texteditor um die fehlenden Punkte erweitert(#Define XXXXXX ).
Immer noch nada....Der PIN Change Interrupt geht nicht. Der 2313A
verhält sich so wie sein Vorgänger 2313, mit PCIE nur an PORTB.
Nun weiß ich gar nicht mehr weiter und hoffe auf eure Hilfe. Ich habe
mich zwar ein wenig in die Materie eingelesen, bin aber noch gaaaanz
weit am Anfang der CPU Programmierung, daher bitte nicht sofort
erschlagen....
Glück auf
Reinhard Pfeiffer