Hallo Harry
Hihi, danke für's Lob. Prima, dass es nun mit deinen Fuses funktioniert. Dass der Code für dich noch nicht vollkommen durchschaubar ist, wundert mich nicht wirklich. Ich quäle mich auch sehr, aber man wächst ja bekanntlich mit den Aufgaben.
Inzwischen kann ich den RC5-Code richtig senden, allerdings nur einmal, weil meine ISR noch zu lange dauert und sich der Tiny deshalb aufhängt. Trotz aller Optimierungsanstrengungen will sie einfach nicht mehr kleiner werden.
Ein großer Fehler steckt noch in der Zusammenstellung der zu sendenden Bits, deshalb wird zum Testen jetzt der Wert für rc5_code direkt als Bitmuster gesetzt. In der jetztigen Version des Progamms kurz bevor die ISR die Kontrolle übernimmt:
Rc5_code = &B0011000101000111
steht z.B. für 2 Start, kein Toggle, Addresse 5 und Command 7
Übrigens kann ich mit dem Code sogar mit der normalen roten LED auf kurze Entfernung (10 cm) Daten zu meinem RP6 senden.
Durch die Optimierungen belegt das Programm nun nur noch 58% des Speichers:
Code:
'RC5-Code senden mit ATtiny13 100% Funktion! (aber nur einmal*grummel*)16.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'
'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
'Hier musste ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8
'Dims und Declears -------------------------------------------------------------'
'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'
'128-65 bedeutet erstes Manchester-Halbbit, 64-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte
'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte
'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte
'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word
'Zähler für das Demo'
Dim Count As Byte
'Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1
'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)
'Initialisierung ---------------------------------------------------------------'
'Timer0 auf CTC-Mode mit OC0A-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
'Es wird noch wird nicht gesendet'
Rc5_bitmaske = 0
'Hauptprogramm -----------------------------------------------------------------'
Do
Call Rc5_send(count , Count , 0)
Waitms 200
Loop
'Sub und ISR -------------------------------------------------------------------'
'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'2 Startbits setzen'
Rc5_code = &B11
'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
Shift Rc5_code , Left , 1
'das Toggle-Bit setzen wenn gewünscht'
If Tog <> 0 Then
Set Rc5_code.0
End If
'address hat 5 gültige Bits'
Shift Rc5_code , Left , 5
'überflüssige Addressbits ausblenden'
Address = Address And &B11111
'und Address-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Address
'command hat 6 gültige Bits'
Shift Rc5_code , Left , 6
'überflüssige Commandbits ausblenden'
Command = Command And &B111111
'und Kommando-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Command
'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
Rc5_bitmaske = &B0010000000000000
Rc5_code = &B0011000101000111 '
'Start der Übertragung mit dem ersten Halbbit, Trägertakt /128 = Bitlänge!'
'Rc5_halbbit = 128'
Rc5_halbbit = Bits(7)
'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
nop
Loop Until Rc5_bitmaske = 0
'LED ausschalten'
Config Portb.0 = Input
'Fertig'
End Sub
'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 Rc5_bitmaske > 0 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 = 128 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 runter'
Decr Rc5_halbbit
'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 0 Then
'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
'Rc5_halbbit = 128'
Rc5_halbbit = Bits(7)
'Dann setzen wir die Bitmaske auf das nächste zu sendende Bit'
Shift Rc5_bitmaske , Right , 1
'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
'alle Bits sind gesendet, also sind wir fertig'
'nächstes Bit'
End If
'und wiederholen 14 mal'
'Ende wenn rc5_bitmaske >0'
End If
$asm 'Code aus der Basom-Hilfe on interrupt isr nosave'
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm
Return
Und noch der Output meines RP6 (mit jeweils einem tiny-Neustart zwischen den Zeilen):
_________
Please make sure that your IR Remote Control really transmits RC5 code!
Toggle Bit:0 | Device Address:5 | Key Code:7
Toggle Bit:0 | Device Address:5 | Key Code:7
Toggle Bit:0 | Device Address:5 | Key Code:7
So langsam sollte man sich mal Gedanken über die Auswertung der Daten für die geplante Zeitnahme am PC machen...
Ach, noch eine Bemerkung zum RC5-Protokoll: Je nach Informationsquelle wird ein gesetztes Bit durch einen LowzuHigh oder einen HighzuLow-Übergang beschrieben. Ich folge jetzt der verbreitesten Auffassung und sende LowzuHigh für ein High und HighzuLow für ein Low. Im RN-Wissen ist es genau gegenteilig beschrieben. Die Verwirrung wird wohl durch den negierten Ausgang des PSoP verursacht. Mein RP6 versteht meine selbst erzeugten Daten und die Daten meiner TV-Fernbedienung. Deshalb nehme ich an, meine Version ist die Richtige.
Gruß
mic
Lesezeichen