hallo. ich arbeite gerade an nem kleinen über IR fernsteuerbaren aktor mit 8 kanälen. ich verwende den IRMP Decoder dazu. ich kann momentan für jeden Kanal von praktisch jeder fernsteuerung einen code lernen und mit diesem dann den kanal ein- und ausschalten. die codes werden dann im eeprom abgelegt und beim start wieder gelesen. bis gestern hat alles auch hervorragend funktioniert. ich habe mir nur gedacht ein knopf auf der fernsteuerung der alle kanäle ausschalten kann wäre praktisch. gesagt, getan. ging beim ersten versuch. dann hab ich überprüft ob auch noch richtig gespeichert wird. und da war das problem. es werden nur die tasten für die 2 ersten kanäle richtig geladen und der rest ist weg. Das ist meine Lernfunktion. (abgeändert von Servo-Controlled IR-Transmitter) die funktion habe ich aber seit sie einmal funktioniert hat nicht mehr verändert.
1 | /
|
2 | #define CHANNELS 8
|
3 | #define BUTTONS CHANNELS + 1
|
4 | |
5 | *---------------------------------------------------------------------------------------------------------------------------------------------------
|
6 | * Learning-Mode: When an IR signal arrives, it is saved in an array position related to the actual servo positions |
7 | *---------------------------------------------------------------------------------------------------------------------------------------------------
|
8 | */
|
9 | void Learn(void) |
10 | {
|
11 | WaitForKeyRelease(); |
12 | while(1) |
13 | {
|
14 | Flash(200,200,1); // fast flash LED 10 times to indicate a learned code |
15 | |
16 | if (irmp_get_data (&IR_data)) // when IR code is decoded, |
17 | {
|
18 | IR_data.flags = 0; // ignore repeat-flag |
19 | stored_ir_data[selection] = IR_data; // populate the array |
20 | Flash(25,25,5); // fast flash LED 10 times to indicate a learned code |
21 | break; |
22 | }
|
23 | if(KEY2==0) |
24 | {
|
25 | Flash(100,100,2); // fast flash LED 10 times to indicate a learned code |
26 | break; |
27 | }
|
28 | }
|
29 | // Write to EEPROM
|
30 | eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)BUTTONS*6); |
31 | }
|
32 | |
33 | while(1){....} |
34 | }
|
und das ist der anfang des programms mit der lesefunktion:
1 | int main (void) |
2 | { int i; |
3 | |
4 | cpu_clock_init(); |
5 | io_init(); |
6 | timer_init(); // initialize timer |
7 | |
8 | sei (); // enable interrupts |
9 | |
10 | if (eeprom_read_byte(&ee_check)!=0xE7) // When EEPROM is uninitialized, do it now |
11 | {
|
12 | for (i=0;i<8;i++) |
13 | {
|
14 | stored_ir_data[i].protocol = 0; |
15 | stored_ir_data[i].address = 0; |
16 | stored_ir_data[i].command = 0; |
17 | stored_ir_data[i].flags = 0; |
18 | }
|
19 | |
20 | eeprom_write_byte(&ee_check, 0xE7); |
21 | eeprom_write_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6); |
22 | }
|
23 | |
24 | else // else, read in the contents |
25 | {
|
26 | eeprom_read_block(&stored_ir_data,&ee_ir_data,sizeof(unsigned char)*BUTTONS*6); |
27 | }
|
ich nehme an ich habe irgendwo einen ganz kleinen fehler gemacht und ich finde ihn nur nicht. ich freue mich aber über jede hilfe