Hi, ich habe ein Problem.
Und zwar habe ich mir eine Platine geätzt, wo jetzt ein Attiny2313 in
SMD drauf sitzt. An PD3-5 hängen jetzt 3 Taster, bei deren Betätigung
jeweils ein RC5 Code gesendet werden soll. Die Diode hängt an PB3/OC1A
und ist testweise noch eine normale LED. Der Code ist noch sehr einfach
gehalten:
$regfile = "attiny2313.dat"
$crystal = 4000000
Ddrd.5 = 0
Portd.5 = 1
Dim Togbit1 As Byte
Dim Togbit2 As Byte
Dim Command As Byte
Dim Address As Byte
Command = 12
Togbit1 = 0
Togbit2 = 32
Address = 5
Do
If Pind.5 = 0 Then
Rc5send Togbit1 , Address , Command
Rc5send Togbit2 , Address , Command
Waitms 100
Portb.3 = 0
End If
Loop
End
(Code ist aus dem Internet kopiert und angepasst:
http://www.qsl.net/d/dg1xpz/elektronik/avr/rc5_send.html )
Wenn PD.5 betätigt wird soll der Code gesendet werden. Passiert auch.
ABER, nach dem Senden bleibt die LED dauerhaft aktiv. Auch das "PORTB.3
= 0" vor dem "end if" bringt nix. Die LED bleibt an. Nur verstehe ich
nicht wieso. Spätestens das Setzen von PB.3 auf 0 sollte die LED
abschalten.
Weitere Details:
Versorungsspannung: CR2032 - 3V
Takt: interne 4 Mhz
interne Pullups PD3-5: aktiv
LED hängt direkt an PB.3.
Das ganze soll ein Geschenk werden. Mittels dieser Fernbedienung soll
eine hoch montierte Solar-LED-Lampe geschaltet werden. PD.3 bekommt das
Signal "LEDs an/aus" PD.4 und PD.5 bekommen das Signal "LEDs heller,
LEDs dunkler".
Ich danke Euch im Vorraus.
Also ich bin derzeit voll am suchen. Der Pin lässt sich einfach nicht
abschalten. Kann es sein das noch eine Zweitfunktion des Pins PB3
aktiviert ist? Im Beispiel von Bascom hängt die IR-Diode über Transistor
und Vorwiderstand am Pin. Nur habe ich das jetzt erst gesehen wo die
Platine bereits fertig geätzt und bestückt ist. Wie gesagt, die Diode
hängt jetzt direkt am Pin. Beim Betätigen des Tasters flackert die LED.
Die Daten gehen also definitiv raus und ein paralel zur Diode
geschaltetes Multimeter zeigt beim Senden Werte zwischen 2,4V und 2,6V.
Nach dem Senden bleibt eine Spannung von 2,4V. Hat jemand eine Idee
woran es liegen könnte das sich PB3 nicht auf 0 setzen lässt? Danke.
Der RC5 Send Code benuzt offenbar einen Timer um den 38kHz Träger zu
erzeugen.
Ich schätze mal, dass der Code insofern fehlerhaft ist, dass die
Verbindung vom Timer zum Pin nicht mehr gelöst wird. Da kannst du selber
dann am Port Register zuweisen, was du willst. Solange diese Verbindung
nicht gelöst wird, hast du keine Kontrolle über den Pin.
Timer Register studieren und die COM Bits löschen.
Leider hat das Setzen des PINs PB3 als Ausgang keine Auswirkung. Und was
die Schaltung angeht, die ist leider bereits fest. Wegen fertiger
Platine. Da lässt sich jetzt nix mehr dran ändern. Da die
Empfängerschaltung noch nicht aufgebaut ist, besteht aber die Freiheit
mir ein eigenes Übertragungsprotokoll auszudenken. Da ich noch recht
frisch bei Bascom bin und erst erste Versuche mit Displays und der
Bascom eigenen DCF77 Routine experimentiert habe, wird es vielleicht
nicht ganz einfach, aber ein lohnenswertes Projekt. Ich dachte in
Richtung Manchester Codierung. Da ich hier ein paar alte
Wetterstationssensoren der Ws2500 Serie (Hersteller ELV) zu stehen habe,
die ich gern anzapfen würde, wäre es recht lohnenswert mich damit zu
beschäftigen.
So gestern Abend und heute noch viel rum probiert und nun habe ich eine
Lösung die sowohl sehr einfach gehalten ist, aber trotzdem funktioniert.
Sobald ich den Attiny2313 ohne RC5, sondern mit einem einfachen Blinker
bespielt habe, lief auch PB3 wieder hervorragend. Das Programm sorgte
einfach nur dafür das PB3 im Sekundentakt blinkt, was er auch tat. Hat
demnach wohl wirklich irgendwie mit den Timern zu tun das PB3 nach dem
senden nicht mehr aus gehen wollte.
Meine jetzige Lösung ist wie gesagt, sehr einfach gehalten. Es werden 2
Bytes übertragen. Das erste ist mit einer festen Zahl belegt, welche zur
Überprüfung dient ob das empfangene Signal auch von der Fernbedienung
kam, das zweit Byte sind die Nutzdaten.
Übertragen wird so:
If Pind.5 = 0 Then 'Wenn Taster gedrückt wird
Send = 155 'Dann wird der feste Wert von 155 geladen
Senden 'und gesendet
Portb.3 = 0 'Pin PB3 auf 0 setzen
Wait 1 'und erstmal eine Sekunde Ruhe
Send = 5 'Danach senden der Nutzdaten.
'Dieser Taster sendet eine 5
Senden 'Wieder die Subroutine "senden"
End If 'Tasterabfrage beenden
Sub Senden() 'Unterroutine "Senden"
For Zahler = 1 To 7 'Diese Routine gibt jedes der 8 Bits
Portb.3 = Send.zahler 'nacheinander an PB3 aus
Waitms 100 'Der Empfänger muss lediglich genau die
Next 'Zeiten einhalten
End Sub
Sofern Sender, als auch Empfänger sich an die Zeiten halten, also
Beispielsweise die 100 Millisekunden Wartezeit bis das nächste Bit
geschaltet wird, sollte der Empfänger das empfangen was der Sender
sendet.
Hier mal die Empfangsroutine:
Sub empfangen() 'Unterroutine "Senden"
For Zahler = 1 To 7 'Hier klappert der Attiny jedes
send.zahler = Portb.3 'einzelne Bit der Variable "send" ab
Waitms 100 'und setzt es auf den Wert, welcher
Next 'an PB3 gerade anliegt.
End Sub
Entsprechend müsste natürlich PB3 beim Empfänger als Eingang definiert
sein. Läuft alles korrekt, sollte der Empfänger genau das ausgeben was
der Sender gesendet hat.
Otto schrieb:> Jast du die Transistorschsltung aus dem Beispiel verwendet oder die LED> zwischen PB3 und GND angeschlossen?
Ich hatte die Diode direkt an PB3. Laut der Schaltung hätte ich einen
kleinen Transistorverstärker zwischen schalten müssen. Wie gesagt, ist
die Platine, auf welcher die Schaltung sich befindet allerdings bereit
fertig und kann nicht mehr geändert werden.
1. Direkt an PB3 schriebst du bereits oben - aber gegen VCC oder GND?
2. Das hat damit zu tun, dass der Ruhepegel der RC5-Routine invers ist.
3. So wie in deinem letzten Post beschrieben, wirst du nie Daten
empfangen, denn wie soll sich der Empfänger darauf synchronisieren?
Otto schrieb:> 1. Direkt an PB3 schriebst du bereits oben - aber gegen VCC oder GND?>> 2. Das hat damit zu tun, dass der Ruhepegel der RC5-Routine invers ist.
Das hat mir richtig geholfen. Daraufhin habe ich mir die Schaltung auf
der verlinkten Seite nochmal genau angeschaut und siehe da... Verstärkt
wird mit PNP Transistor, welcher naturgemäß nur bei annähernd 0V
durchsteuert und höhreren positiven Spannungen sperrt.
Dachte bisher immer das RC5 auch mit positiven Signalen arbeitet. Egal,
ich hab jetzt per Freiluftverdrahtung auf der geätzten Platine noch
einen PNP Transistor mit 1k Vorwiderstand untergebracht und an dessen
Emitter hängt auch gleich der zweite NPN Transistor, welcher das Signal
nochmal deutlich verstärkt. Die Kamera meines Handys zeigt nun ein
kräftiges Flackern der Infrarot LED und der aufgebaute Empfänger
dekodiert die Signale auch korrekt. Soweit, so gut. Nur ein Problem habe
ich trotzdem noch. RC5 ist ja 36khz. Leider hab ich bei Reichelt aber
einen 38khz Empfänger bestellt. Vermute mal das daraus auch der schwache
Empfang resultiert. Denn Richtig empfangen wird die Fernbedienung nur
selten und nur mit viel rum probieren. Aber wie gesagt, wenn empfangen
wird, dann auch richtig dekodiert.
Hier für alle Nachbauer nochmal 2 sehr gute Links.
Die Beschreibung zum Aufbau des Empfängers und seines Programms in
Bascom: http://www.qsl.net/d/dg1xpz/elektronik/avr/rc5_empf.html
Und hier das gleiche für den Sender:
http://www.qsl.net/d/dg1xpz/elektronik/avr/rc5_send.html
Es freut mich, dass du die Denkanstöße umgesetzt und dich auch mit der
Theorie beschäftigt hast. Das ein Prototyp einer Platine nicht auf
Anhieb funktioniert ist wohl schon jedem passiert. Daraus lernt man und
versucht es beim nächsten mal besser zu machen.....
Gruß Otto
Jetzt läuft alles super. Nachdem ich gestern in den Code nach dem Senden
noch 10 Millisekunden Pause eingefügt habe, wird das Signal vom
Empfänger jetzt überall empfangen. Da der Taster nicht Hardwareseitig
entprellt war, gingen vielleicht gleich 2 oder 3 Telegramme ohne große
zeitmäßige Trennung, auf Sendung. Durch die 10 Millisekunden kann der
Empfänger nun die einzelnen Telegramme sauber voneinander trennen und
ist entsprechend sensibel geworden. Man kann die Fernbedienung nun auch
nach hinten oder an die Decke richten, sicher empfangen wird trotzdem.
Ob der Empfänger nun also mit 36khz oder 38khz arbeitet, scheint demnach
egal zu sein.