Hallo
Der tiny ist nicht gestorben...
Oh, dann habe ich das wohl fehlinterpretiert. Ich dachte, weil ihr euch nun auf größere AVRs stürzt, habt ihr den tiny13 aufgegeben.
Inzwischen weiß ich auch, was ein Mini-Z-Car ist, allerdings habe ich noch keine technischen Daten wie Größe, Gewicht, Geschwindigkeit und Technik gefunden.
Dafür habe ich meinen Code weiterentwickelt und sollte nun auch RC5-Daten senden können. Allerdings mit 36kHz-Trägerfrequenz, weil damit das Bittiming sehr einfach ist. Der 36kHz-TSoP kosten nur ein Euroundeinbisschen, wir müssen also nicht zwingend den 38kHzler verwenden.
Ich hab's aber noch nicht geflasht, weil mein Programmer aus irgendeinem Grund nicht mehr funktioniert. (Das Teil ist zickiger als der asuro-Transceiver). Trotzdem zeige ich euch mal meinem momentanen Stand (es ist mein erstes erstes ernsthaftes bascom-Programm), vielleicht erkennt ja jemand auf Anhieb gravierende Fehler oder kann einen Tipp zu den Kompillerdirektiven geben:
Code:
'RC5-Code senden mit ATtiny13 (erster ernsthafter Versuch mit Bascom) 14.12.07 mic'
'Achtung! Das ist ein eher theoretischer Code den ich noch nicht getestet habe!'
'Es sollten im 0,5 Sekundentakt die Werte 0 bis 31 als Addresse und Kommando'
'mit Togglebit=0 gesendet werden. Ob das so funktioniert muss ich noch testen'
'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 mußte 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'
'64-33 bedeutet erstes Manchester-Halbbit, 32-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
'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'
'Anmerkung für Harry: Ob das Bittiming bei 38kHz funktioniert weiß ich nicht,'
'aber ein 36kHz-LSoP kostet nur ca. 1,xx Euro + Versandkosten im Onlineversand'
Ocr0a = 133
'ISR für Timer0 bei OutputCompareA definieren'
On Timer0 Rc5_isr
'Interrupts für Timer0 erlauben'
Enable Timer0
'Interrupts generell erlauben'
Enable Interrupts
'Timer anhalten'
Stop Timer0
'Es wird noch wird nicht gesendet'
Rc5_halbbit = 0
'und IR-LED aus'
Config Portb.0 = Input
'Hauptprogramm --------------------------------------------------------------'
Do
For Count = 0 To 31
Call Rc5_send(count , Count , 0)
Waitms 500
Next
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
'Start der Übertragung mit dem ersten Halbbit'
Rc5_halbbit = 64
'Trägerfrequenz einschalten'
Start Timer0
'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
Wait 1
Loop Until Rc5_bitmaske = 0
'Trägerfrequenz ausschalten'
Stop Timer0
'LED ausschalten'
Config Portb.0 = Input
'Fertig'
End Sub
'Ab hier folgt die ISR'
Rc5_isr:
'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 = 64 Then
'geben wir das erste Halbbit invertiert aus (Manchestercodierung?)
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'ende erstes Halbbit'
End If
'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 32 Then
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'ende zweites Halbbit'
End If
'Bitzeit ist Trägerfrequenz/64, also wir zählen den Bittimer runter'
Rc5_halbbit = Rc5_halbbit - 1
'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 = 64
'Dann setzen wir die Bitmaske auf as nächste zu sendende Bit'
Rc5_bitmaske = Rc5_bitmaske / 2
'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
Return
Laut Bascom belegt der Code 81% des Flash-Speichers, es sollte also noch Platz für die geplante Codierung der einzelnen Mini-Z-Renner sein.
Gruß
mic
Lesezeichen