Forum: Mikrocontroller und Digitale Elektronik RC5 senden mit Attiny2313


von Engi (Gast)


Lesenswert?

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.

von Frank S. (_frank_s_)


Lesenswert?

Hallo Engi,

laut dem Beispiel auf
http://www.qsl.net/d/dg1xpz/elektronik/avr/rc5_send.html

könnte die Belegung von PortB

Ddrb.3 = 1                    'Pin PB0 ist Ausgang
Portb.3 = 0                   'PB0 definiert aus

evtl. helfen.

MfG von der Spree

von Engi (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Hallo,

hast du DDRB.3 mittlerweile auf Ausgang gesetzt?

Gruß Otto

von Karl H. (kbuchegg)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Es könnte daran liegen, dass im Beispiel ein AT90S2313 verwendet wurde, 
dessen Ports im Gegensatz zum ATTINY nur als Stromsenke arbeiten können.

von Otto (Gast)


Lesenswert?

Hast du deine LED auch genauso wie im o. g. Link angeschlossen?

von Engi (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Du hast aber gelesen, das sich die Ausgänge des Controllers in deinem 
Link (originalschaltung) anders verhalten, als die des von dir 
eingesetzten?

von Otto (Gast)


Lesenswert?

Jast du die Transistorschsltung aus dem Beispiel verwendet oder die LED 
zwischen PB3 und GND angeschlossen?

von Engi (Gast)


Lesenswert?

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.

von Engi (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

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?

von Engi (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Engi (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.