Hallo,
ich wollte den Aufbau (Siehe Link im Quellcode) nachbauen und setze
dafür ein Atmega328PU ein. Dieser wird über ein 16Mhz Quarz angesteuert.
Ich setze ein TSOP4838 am INT0 ein.
Ich arbeite mit AtmelStudio6. Es scheint hier aber so, als wenn INT0
nicht arbeitet. Der Code scheint für AtmelStudio < 6 erstellt worden zu
sein, weil er "GICR" nicht kennt. Ich habe folgendes gefunden:
1 | #define GIMSK _SFR_IO8(0x3B)
|
2 | #define GICR GIMSK
|
Scheint aber nicht zu funktionieren....
Hat jemand eine Idee, wie ich diesen Code für AtmelStudio6 bauen kann,
so dass INT0 auslöst?
Danke!
1 | // Avr rc5 remote control:
|
2 | // http://wiki.electronics-irc.net/Avr_rc5_remote_control
|
3 | // mein Testaufbau: Atmega328PU @ 16Mhz Quarz (nicht 3,...Mhz)
|
4 |
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/io.h>
|
7 | #include <util/delay.h>
|
8 |
|
9 | // definiere für Atmega328p --> GICR (richtig?)
|
10 | #define GIMSK _SFR_IO8(0x3B)
|
11 | #define GICR GIMSK
|
12 |
|
13 | //#define PB5 (1 << 5)
|
14 |
|
15 | typedef union {
|
16 | uint16_t raw;
|
17 | struct {
|
18 | unsigned cmd : 6; // LSB
|
19 | unsigned addr : 5;
|
20 | unsigned toggle : 1;
|
21 | unsigned start : 2;
|
22 | unsigned : 2; // MSB
|
23 | };
|
24 | } rc5data;
|
25 |
|
26 | static volatile int flag = 0;
|
27 | static volatile rc5data data;
|
28 |
|
29 | void init_int0()
|
30 | {
|
31 | // Interrupt on INT0 pin going low
|
32 | MCUCR = (1 << ISC01);
|
33 |
|
34 | // Turn on INT0!
|
35 | GICR |= (1 << INT0);
|
36 | }
|
37 |
|
38 | ISR (INT0_vect)
|
39 | {
|
40 | int pos = 0;
|
41 |
|
42 | if (!flag) {
|
43 | data.raw = 0;
|
44 |
|
45 | // triggers on falling edge of start bit 1.
|
46 | _delay_ms(1);//_delay_ms(0.2);
|
47 |
|
48 | while (pos < 14) {
|
49 | data.raw = (data.raw << 1) | ((~PIND & 0x04) >> 2); //PIND2 <-- IR Empfänger
|
50 | _delay_ms(10); //_delay_ms(1.8);
|
51 | pos++;
|
52 | }
|
53 |
|
54 | flag = 1;
|
55 | }
|
56 | }
|
57 |
|
58 | int main()
|
59 | {
|
60 | init_int0();
|
61 | DDRB = 0xFF;
|
62 |
|
63 | sei(); // Enable interrupts
|
64 |
|
65 | while(1) {
|
66 |
|
67 | while(!flag);
|
68 |
|
69 | /* set PB5 pin of PORTB high */
|
70 | PORTB = (1 << PB5);
|
71 | _delay_ms(500);
|
72 |
|
73 | /* set all pins of PORTB low */
|
74 | PORTB = 0x00;
|
75 | _delay_ms(500);
|
76 |
|
77 | // Do with data from the remote control here what you like.
|
78 | flag = 0;
|
79 |
|
80 | }
|
81 |
|
82 |
|
83 | return 0;
|
84 | }
|