Hallo Mic.
Bin über meine eigene Euphorie gestolpert.
Hatte die Wiederholzeit (100ms) auf 50ms reduziert.
Da hat sich mein Empfänger wohl etwas täuschen lassen.
80ms sind aber wieder ok.
Hier mein letzter aktueller Code:
Code:
'RC5-Code senden mit ATtiny13 100% Funktion mit endloser Wiederholung 18.12.07 mic'
'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'
'Die Stellen, an denen man den zu sendenden Code und die Wiederholgeschwindigkeit'
'ändern kann, sind mit +++++++++++++++++++++++++++++++++++++++++++++++++ markiert'
'
'Code von mir ( Pizzakurier ) https://www.roboternetz.de/phpBB2/vi...36253&start=66 geändert.
'Nun können mit 3 Tastern (max.4) verschiedene IR Codes gesendet werden.
'Wenn er fertig gesendet hat, geht der µC schlafen und brauch nur noch weniger als ein µA...
'Batterie ( 2x 1,5V Micro ) hält damit ewig :-))
'Danke an das tolle Forum und vor allem "radbruch" und "x1cr" für die Idee und Code.
'
'Einstellungen -----------------------------------------------------------------'
'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8
$framesize = 16
Config Pinb.0 = Input 'ocr0a (IR-LED)
Config Pinb.1 = Input 'Taste grün
Config Pinb.2 = Input 'Taste rot
Config Pinb.3 = Input 'n/c
Config Pinb.4 = Input 'Taste blau
Portb = &B00011110 'Pullup-Widerstände für Pb.1-4 aktivieren
Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011110 'Maske, welche Pins einen pcint auslösen dürfen (Pinb.1-4)
Gimsk = &B00100000 'GIMSK Bit5 = PinChangeInterrupt eingeschaltet
'Dims --------------------------------------------------------------------------'
'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word
'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word
'Teiler des Trägertaktes und Kennung des Halbbits'
'0-63 bedeutet erstes Manchester-Halbbit, 64-127 bedeutet zweites Manchester-Halbbit'
Dim Rc5_halbbit As Byte
'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word
'Sendeflag'
Dim Senden_aktiv As Byte
'Initialisierung ---------------------------------------------------------------'
'Startwerte setzen, es findet noch keine Übertragung statt'
Senden_aktiv = 0
'Timer0 auf CTC-Mode mit OC0APin-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1
'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 133
'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave
'MatchCompare Interrupt erlauben'
Enable Oc0a
'Interrupts generell erlauben'
Enable Interrupts
'Hauptprogramm -----------------------------------------------------------------'
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'und Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
'Hier kann man den gewünschten Code eintragen'
'Rc5_code = &B0011010010000001
Rc5_code = &B0011000000000000
'Testcode: 2 Start, kein Toggle, Adresse 0, Kommando 0'
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
Label:
If Pinb.1 = 1 And Pinb.2 = 1 And Pinb.3 = 1 And Pinb.4 = 1 Then 'wenn keine Taste gedrückt...
Enable Pcint0 'PcInt einschalten
'gute Nacht :-))
!sleep
Disable Pcint0 'PcInt ausschalten
End If
If Pinb.1 = 0 Then 'Taste grün
Rc5_code = &B0011010010000001
End If
If Pinb.2 = 0 Then 'Taste rot
Rc5_code = &B0011010010000000
End If
If Pinb.4 = 0 Then 'Taste blau
Rc5_code = &B0011010010000010
End If
'Bitmaske auf erstes von 14 zu sendende Bits setzen' '
Rc5_bitmaske = &B0010000000000000
'Start ist erstes Halbbit'
Rc5_halbbit = 0
'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Senden_aktiv = 1
Do
nop
Loop Until Senden_aktiv = 0
'+++++++++++++++++++++++++++++++++++++++++'
'Kurz warten vor der nächsten Übertragung'
Config Portb.0 = Output
Portb.0 = 1
Waitms 40
Config Portb.0 = Input
Portb.0 = 0
Waitms 80
'Das ist dann die Wiederholgeschwindikeit'
'+++++++++++++++++++++++++++++++++++++++++'
'endlos wiederholen'
Goto Label
'Ab hier folgt die ISR ---------------------------------------------------------'
Rc5_isr:
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
PUSH R24 ; since we are going to use R24 we better save it
IN r24, SREG ; get content of SREG into R24
PUSH R24 ; we can save a register
$end Asm
'Wenn wir senden wollen'
If Senden_aktiv = 1 Then
'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske
'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 0 Then
'dann geben wir das erste Halbbit invertiert aus. (Manchestercodierung)
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'Ende erstes Halbbit'
End If
'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 64 Then
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'Ende zweites Halbbit'
End If
'Bitzeit ist Trägertakt/128 , also wir zählen den Bittimer hoch'
Incr Rc5_halbbit
'Bei RC5_halbbit = 128 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 128 Then
'Wir setzen die Bitmaske auf das nächste zu sendende Bit'
Shift Rc5_bitmaske , Right , 1
'und laden den Bittimer mit dem Startwert als Flag für erstes Halbbit.'
Rc5_halbbit = 0
'Ist das letzte Bit gesendet?'
If Rc5_bitmaske = 0 Then
'Dann sind wir fertig. Dies erkennt dann das Hauptprogramm'
Senden_aktiv = 0
'Ende Sendeflag'
End If
'weitersenden bis alle Bits ausgegeben sind'
End If
'und wiederholen bis rc5_bitmaske = 0'
End If
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm
Return
End 'end program
Das Prellen dürfte nicht stören, denn wenn der code erst mal gesetzt ist, ändert sich dieser nicht mehr beim prellen.
Erst mit anderer Taste wird der code neu "gesetzt".
Gruß Bernhard
Lesezeichen