Hi, Mic
Naja, unscheinbarer 8-Pinner ist nicht ganz richtig!
KnowHow des Programmierers ist wohl die erste Instanz!
Mfg Harry
Druckbare Version
Hi, Mic
Naja, unscheinbarer 8-Pinner ist nicht ganz richtig!
KnowHow des Programmierers ist wohl die erste Instanz!
Mfg Harry
Frohes Fest euch allen!
Mfg
Harry
Hallo an alle.
Hab mich an den Code von "Radbruch" gehängt, weil ich genau
solche Tinys hier habe und nen kleienen Hand RC5 Sender bauen will.
Hier sollte man natürlich auf Batteriesparen setzen.
Also Tiny13 in Sleep legen.
Mit den richtigen Registern angesteuert auch kein Problem.
Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011000
Gimsk = &B00100000
Gifr = &B00100000
Aber : Wo in dem Code kann ich nen Interrupt auslösen lassen
bzw. in den Code durch den Irq einspringen ? (PcInt0)
Command ändern mit anderer Taste ist ja kein Hexenwerk.
Nur das Schlafen legen..... :-$
Denn mit "Senden_aktiv = 0" wird der Träger munter
weiter gesendet.
Also WO unterbrechen, dass
a: der String fertig gesendet wird, und
b: der µC an der richtigen Stelle wieder aufwacht ?
Eventuell Probleme mit Timer0 ? oder den ASM Code ?
Gruß Pizzakurier
PS: guten Rutsch an alle =D>
Hallo pizzakurier
Mit den Sleep-Modi der tinys habe ich noch keine Erfahrungen. Das Erste worüber ich jetzt im Datenblatt (Seite 27) gestolpert bin:
Also einfach einen Reset auslösen und alles beginnt von vorne. Das würde wunderbar funktionieren, wenn du nur eine feste Codesequenz senden willst. Ein Taster an Pin1 gegen GND (eventuell noch ein PullUp gegen Vcc) würde den tiny aufwecken und den Code senden lassen.Zitat:
If a reset occurs during sleep mode, the MCU wakes up and executes from the Reset Vector.
Nachdem der Code gesendet wurde (wir senden nur einmal) könnte man z.B. hier schlafen gehen:
(nur theoretisch, noch nicht getestet)Code:...
'endlos wiederholen'
$asm
sleep
$end Asm
Goto Label
...
Gruß
mic
Genau.Zitat:
Zitat von radbruch
Auf das bin ich noch garnicht gekommen.
Ich kann einen Pinchange-Interrupt als Reset ausführen.
Dann im Index oben die Taste auswählen, gewünschten Command setzen
und wie Du sagtest unten wieder schlafen legen.
Muss mal kucken ob ich nen PCint. als Reset beschalten kann....
Muss ich sofort kucken und testen....
Gruß Pizzakurier \:D/
@EDIT
Bei Einstellungen diesen Code einfügen :
Direkt unter Label das hier :Code:Config Pinb.1 = Output 'ocr0b
Config Pinb.2 = Output 'led
Config Pinb.3 = Input 'taste down
Config Pinb.4 = Input 'taste up
Portb = &B00011000
Enable Interrupts 'enable global ints
On Pcint0 Int
Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011000
Gimsk = &B00100000
Gifr = &B00100000
und zu guter letzt, das Int-Sub Programm:Code:Label:
Enable Pcint0
!sleep
Damit wird der komplette RC5 gesendet und schläft dann ein.Code:$end Asm
Return
Int: 'Wenn Interrupt ausgelöst wird, (Taste gedrückt)
Disable Pcint0 'schalte INT0 ab
Return 'hoch zur Hauptschleife nach Befehl Sleep
Bei mir liegen 2 Taster auf PB3 und PB4 mit jeweils Pullup aktiv.
Jetzt muss ich nur noch die 2 Taster auswerten für verschiedene Befehle :-)
Guten Rutsch an alle BASCOMer (und der Rest natürlich auch :-))
Pizzakurier
So - Hier nun das Endergebnis :-)
Platine:
Bild hier
gesamte Schaltung:
Bild hier
und die Behausung:
Bild hier
Layout:
Bild hier
Bascom Projekt gibts hier :
http://www.6c33.de/avr/handsender_la...ender_lang.bas
und für Sprint-Layout 4 das Layout
http://www.6c33.de/avr/handsender_la...ender_lang.lay
(rechtsklich - Ziel speichern unter)
Viel Spass damit.
Schaltplan brauchts für das hier glaube ich nicht ](*,)
Viele Grüsse und ein gutes neues Jahr 2008
Pizzakurier
Hallo pizzakurier
Sehr schön gelöst mit dem Sleep (das @Edit hast du ja recht heimlich angehängt). Verblüffend schlank umgesetzt und natürlich vor dem Senden eingebaut. Super. Und das es auch mit 3V funktioniert hatte ich schon vermutet. Mich würde noch der Wert für den verwendeten Vorwiderstand für die IR-LED interessieren.
Nun haben wir die Basis für alle möglichen kleinen RC5-Anwendungen komplett. Man könnte die Sendecodes noch als #defines im Programmkopf unterbringen und das Ganze noch etwas ordentlicher dokumentieren. Aber das kann auch die Aufgabe für die nachfolgenden Anwender sein.
Noch eine kleine Anregung: Wenn man die zu sendenden Codes im EEProm ablegt, kann man für alle, die nicht in Bascom programmieren, eine fertige Hex-Datei anbieten. Zusammen mit deinem Projekt wäre das ein wohl einen Eintrag im RN-Wiki wert. Das sollten aber die BASCOMer selbst machen, denn für mich war das nur ein "Gastspiel".
Gruß
mic
Hallo Mic.
Danke für die Blumen.Zitat:
Zitat von radbruch
Der Vorwiderstand ist für eine LD271 und hat bei mir 47 Ohm.
Ein Wehrmutstropfen bleibt noch : Der RC5 code wird nur ein bis 2x gesendet und der Tiny schläft bei gedrückter Taste ein.
Muss mal probieren, ob ein
"if portb.1=1 and portb.2=1 and portb.4=1 then ..."
vor dem schlafengehen das ganze eventuell das ganze dazu bewegt, dauerhaft bei gedrückter Taste zu senden.
Dann wäre da noch das Toggle-Bit.
Aber das kann man relativ einfach mit dem Befehl "toggle" und einer Bitmaske realisieren. Braucht man für "eigene" Projekte aber kaum :-))
Interessant ist noch die RC5 Emppfangsgeschichte. Muss mal probieren, ob das mit "getrc5" in Basacom mit dem Tiny13 auch geht . ( braucht glaube ich nur Timer0) Er muss ja nicht demodulieren (macht der Tsop)
Die Geschichte mit dem Eeprom hatte ich mir auch schon überlegt.
Wäre Sinnvoll, wenn man z.B. noch ne Uart hätte zum seriell ändern.
Werd aber nu mal das Dauersenden bei Tastendruck probieren.
Melde mich.
Gruß Bernhard.
PS: Hat´s in Stuggitown auch Schnee ?
Heut N8 hats bei uns (Bad Boll) ca. 3cm (hoho) hingeworfen :-))
Sodele.Zitat:
Werd aber nu mal das Dauersenden bei Tastendruck probieren.
Dauersenden geht nu.
der Code vor dem Sleep funktioniert.
Somit sendet der Code dauerhaft, solange eine Taste gedrückt wird.Code: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
End If
Bascom-Code im vorigen Thread ist aktualisiert.
Damit bin ich nun endgültig zufrieden.
Der Code hat sehr viel Potential. Zub Bsp, wenn Timer1 durch andere Aufgaben in grösseren Prozessoren belegt ist etc.
Bin auf Antworten gespannt.
Ach ja : Warum kam der Code nicht ein JAhr früher ? :-)
Nun hab ich mich mit nem Tiny2313 rumgeschlagen, hatte das Basiswissen von jetzt über den Sleep Befehl noch nicht und liess den Tiny damals über ein Diodenmatrix auf INT0 bei Tastendruck aufwachen, weil er mit dem PCint nicht mehr aufwachen wollte. Heute weiss ich, dass die Deklaration PCMSK wichtig ist, damit er weiss, auf welche Pin´s er reagieren muss.
Aber hat grad richtig Spass gemacht, meine kleine IR Fernbedienung zu bauen. Endlich haben meine kleinen Tiny13 ein ZuHause =D>
VlG
Bernhard
Hallo
Dass man den Code mehrfach senden sollte, hatte ich auch nicht bedacht.
Vielleicht so? (nur theoretisch)
und die eigentliche Tastenabfrage in der Pcint0-ISR:Code:Label:
' vermutlich ist PinB.5 (!reset) high deshalb ist PINB ohne gedrückte Taste wohl 62'
If Pinb = 62 Then 'wenn keine Taste gedrückt
Enable Pcint0 'PcInt einschalten
'gute Nacht :-)) mic: Ob das auch in einer "Condischen" funktioniert weiß ich nicht'
!sleep
Else
Rc5_code.11 = Not Rc5_code.11 'sonst toggle-Bit wechseln und weitersenden
End If
'Bitmaske auf erstes von 14 zu sendende Bits setzen' '
Rc5_bitmaske = &B0010000000000000
Hab's nicht getestet, weil Aufbau eingemottet. Wir haben am Filderrand satte 1cm Neuschnee.Code:Int: 'Wenn Interrupt ausgelöst wird, (irgendeine Taste gedrückt)
Disable Pcint0 'schalte INT0 ab
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
Return 'hoch zur Hauptschleife nach Befehl Sleep
Gruß
mic
[Edit]Ich bin einfach zu langsam. Schön dass es nun endgültig funktioniert
Hallo Mic.
Hammer dasselbe (ähnlich) gedacht :-)
Mittlerweile ist mein Code von 76% auf 63% geschrumpft.
Hab die ISR wegprogrammiert.
Ich mach das mit dem Interrupt alles oben beim Sleep.
Jetzt hab ich nur noch ein Problem:Code: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
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
End If
Ich hab die Command´s 0,1 und 2.
Wenn ich nun Command 0 drücke, kanns passieren (nicht immer),
dasser beim loslassen den command 1 sendet. ?!?!?!?!???
Solange ich die Taste drücke, bleibt er bei Null.
Jetzt wirds bunt.
Gruß Bernhard.
Hallo
Bitte nicht lachen, ist nur ein Verdacht:
Vielleicht macht der tiny13 einen Neustart. Zeig doch nochmal das komplette Programm in der aktuellen Version.Zitat:
'Hier kann man den gewünschten Code eintragen'
Rc5_code = &B0011010010000001
'Testcode: 2 Start, kein Toggle, Adresse 18, Kommando 1'
Und nochmal mit bedingtem Schlafen und ISR versuchen. Möglicherweise "entprellt" der Aufruf der ISR auch die Taster etwas.
Gruß
mic
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:
Das Prellen dürfte nicht stören, denn wenn der code erst mal gesetzt ist, ändert sich dieser nicht mehr beim prellen.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
Erst mit anderer Taste wird der code neu "gesetzt".
Gruß Bernhard
Hallo Bernhard
Dann dürfte dies nun die offizielle und funktionierende Version sein. Prima Ergebniss.
Die Wiederholfrequenz hatte ich auch im Verdacht (bei dir nun 40+80, laut Doku: "As long as a key remains down the message will be repeated every 114ms."), aber dann hätte ich Probleme beim Drücken und nicht beim Loslassen erwartet. Aber egal, wenn's funzt dann gut. Viel Spaß mit deiner beneidenswert hübschen Fernbedienung.
(btw: Den nächsten Satz hatte ich bisher überlesen: "The toggle bit will retain the same logical level during all of these repeated messages." Bedeutet also, nur toggeln, wenn Taste erneut gedrückt wurde. Das ist dann oben bei meinem letzten Vorschlag nicht richtig)
Gruß
mic
Guten Morgen Jungs,
Also, ich als Auslöser dieses Themas bin begeistert von dem Ergebniss!
Aber warum hat sich damit noch nicht früher jemand beschäftigt....?
Also ich denke das so mancher nun auf den 2313 verzichtet und alles ein bisschen kleiner baut!
Leider bin ich noch nicht dazu gekommen Sender in mein Auto einzubauen und der USB Empfänger ist auch noch nicht gebaut.
Einzige Lösung wäre weniger zu arbeiten oder den Tag zu verlängern.
Der einzige Wehrmutstropfen.... die Teile hab ich schon, nun fehlt nur noch die Umsetzung.
Mfg
Harry