Hallo,
versuche mich gerade im Aufnehmen von IR Signalen und wollte mal eure
einschätzung haben, ob das so sein kann(oder ob ich gegen alle Regeln
der Messtechnik verstoße).
Ziel: Wecker mit AVR, der Anlage einschaltet, Radio auswählt,... . Dazu
will ich die Tasten einteachen.
1 | #include "avr\io.h"
|
2 | #include "avr\interrupt.h"
|
3 | #include "inttypes.h"
|
4 | #include "avr\eeprom.h"
|
5 |
|
6 |
|
7 | uint16_t eeTest[32] EEMEM;
|
8 | uint16_t Test[32];
|
9 |
|
10 | int main() {
|
11 | //INIT
|
12 | MCUCR = (1 << ISC10);
|
13 | TIMSK = (1 << TOIE1);
|
14 | GICR |= (1 << INT1);
|
15 | Test[31] = 0x0000;
|
16 | sei();
|
17 | DDRD = (1 << PD6) | (1 << PD7);
|
18 | PORTD = (1 << PD7);
|
19 | DDRB |= (1 << PB0);
|
20 | while(1){
|
21 | if ( Test[31] ){
|
22 | for ( uint8_t i = 0; i<=31; i++){
|
23 | eeprom_write_word( &eeTest[i], Test[i] );
|
24 | }
|
25 | }
|
26 |
|
27 | }
|
28 | return 0;
|
29 |
|
30 | }
|
31 |
|
32 | ISR(INT1_vect){
|
33 | static uint8_t a = 0;
|
34 | TCCR1B = 0x00;
|
35 | PORTD ^= (1 << PD6);
|
36 |
|
37 | //eeprom_write_word( &eeTest[a], TCNT1 );
|
38 | Test[a] = TCNT1;
|
39 | a++;
|
40 | TCNT1 = 0x0000;
|
41 | TCCR1B = (1 << CS12) | (1 << CS10);
|
42 | if ( a == 31) GICR &= ~(1 << INT1);
|
43 | }
|
44 | //Schutz falls TIMER überläuft
|
45 | ISR(TIMER1_OVF_vect){
|
46 | GICR &= ~(1 << INT1);
|
47 | PORTB = (1 << PB0);
|
48 | }
|
IM EEPROM steht dann:
:020000020000FC
:100000000000470011000500FD0247001000060037
:10001000FC02480010000600FC0247001100050029
:10002000FD02470011000500FD0247001000060018
:10003000FC02480010000600FC0247001100050009
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:00000001FF
Als IR-Empfänger verwende ich einen TSOP , der mit PULLup an INT1 hängt.
Takt 8MHz. Fernbedienung für meine Yamaha Stereoanlage.
Ich komme mit diesem Aufbau an zeiten zwischen 2ms und 9ms.
0xFD02 wird wohl die PAUSE zwischen den Signalen sein, da ich die TASTE
ständig gedrückt hatte. Habe leider kein OSZI mitdem ich das
verifizieren könnte, mir kommen die Impulse nur ein bischen wenig vor.
mfg Alex