@MasterFx tolle Arbeit die Du da geleistet hast.
Danke
Ich habe den Thread komplett gelesen (puh).
nicht schlecht
Wodurch werden die Interrupts ausgelöst(die beiden unterschiedlichen Tasten)?
Ja genau.
Durch den "Befehl":
Code:
PCMSK = (1<<PCINT3) | (1<<PCINT4); /* Pin Change Interrupt for Pin3+4*/
GIMSK |= (1<<PCIE); /* Enable Pin Change Interrupt */
werden die Pin-Change Interrupts für die Taster aktiviert (darum ja auch die Kommentare dahinter). Diese wecken den µC aus der Sleep-Phase wieder auf.
uint8_t i,j=0;
uint8_t cmd = 0;
uint16_t mask = 1;
uint16_t address = 0x1E3A;
Was bedeuten folgende Ausdrücke?
while(mask < 0x80)
if(cmd & mask)
(address & mask)
mask <<= 1;
Vielleicht kannst Du die ablaufende Sequenz beschreiben?
das ist recht simpel. Beim Tastendruck wird zunächst geschaut welche Taste gedrückt wurde und das Entsprechende Kommando eingestellt:
Code:
if((PINB & 1<<PB3) == 0)
cmd = 0x2D;
else if((PINB & 1<<PB4) == 0)
cmd = 0x37;
while(mask < 0x80) bedeutet dass die folgende Schleife ausgeführt wird solange die "mask" < 0x80 ist. Die Maske wird bei jedem Durchlauf durch "mask <<= 1;" nach links geschoben (also ich schiebe einfach nur die "1" durch die verschiedenen Positionen. Bedeutet beim ersten Durchgang ist die Maske 0x01, beim zweiten 0x02, beim dritten 0x04 etc. bis sie dann bei 0x80 angekommen ist.
Mit if(cmd & mask) schaue ich ob ein Bit an Postion der "1" aus der Maske ebenfalls eine "1" im Kommando ist und sende das entsprechende Kommando (also 48 Pulse aus einem 40kHz Rechteck-Signal)
Für eine "0" eben nur 24 Pulse.
Das gleiche passiert mir der Adresse.
Bedeutet im Klartext:
Wenn der Taster an PB3 gedrückt wurde ist das Kommando 0x2D. 0x2D ist in binärer Darstellung 101101. Die Maske fängt bei 00000001 an. Nun kommt das binäre UND:
0b00101101 & 0b00000001 ist "1" also sende ich 48 Pulse. Dann schiebe ich die Maske und erhalte im nächsten Durchgang
0b00101101 & 0b00000010 und das ist "0", also sende ich 24 Pulse. Im nächsten:
0b00101101 & 0b00000100 ist wieder "1" also 48 Pulse usw.
wenn ich dann mit dem Kommando senden durch bin kommt kommt die Adresse die eben 13 Bit lang ist durchlaufe ich das ganze eben 13 mal und schiebe die maske auch entsprechend oft nach links.
Achja wie das IR-Signal aussieht, hat Dewenne gemessen, das war meine Grundlage:
https://www.dslr-forum.de/showthread.php?t=435214&page=10#93
Leider hat er selbst sich noch nicht dazu geäußert ob es klappt.