Bascom RC5 Empfänger Probleme

tenor

Mitglied
30. Sep. 2012
169
0
16
44
Sprachen
  1. BascomAVR
Hallo,
meine Aquariumsteuerung nimmt langsam gestallt an und nun wollte ich sie um eine IR Fernbedienung erweitern :)
Ich verwende den TSOP 1136 von Pollin (http://www.pollin.de/shop/downloads/D120295D.PDF).
Die Beschaltung habe ich direkt aus dem Datenblatt mit dem 4,7uF und den 100 Ohm Widerstand.

Dazu habe ich folgenden Beispielcode verwendet:
Code:
'**********************************************************
'* RC5 Tester
'* Stand: 11.08.2007
'*
'**********************************************************

$regfile = "attiny2313.dat"                  ' AT Tiny2313

$crystal = 8000000                           ' 8 MHz
$lib "mcsbyte.lbx"                           ' Code etwas kleiner

Config Lcdpin = Pin , _
  Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , _
  E = Portb.4 , Rs = Portb.5

Config Lcd = 16 * 2                          ' 16*2 LCD
Config Lcdbus = 4                            ' 4-Bit-Modus
Config Rc5 = Pind.2                          ' IR-Empfänger TSOP1736 an PD.2
Config Pind.3 = Output                       ' PD.3 als Kontroll-LED als Ausgang

Dim Adress As Byte
Dim Command As Byte

'--- Hauptprogramm ---

Enable Interrupts
Cursor Off                                   ' kein Cursor auf LCD anzeigen
Cls                                          ' LCD löschen
Lcd "RC5-Tester V1.0"                        ' Einschaltmeldung
Lowerline
Lcd "by blinki 08/07"
Wait 2                                       ' soviel Zeit muß sein ;-)
Cls
Lcd "Adress :"
Lowerline
Lcd "Command:"
Do
  Getrc5(adress , Command)                   ' RC5-Fernbedienung einlesen
  If Adress < 255 Then
    Portd.3 = 1                              ' Kontroll-LED ein
    Command = Command And &B01111111         ' Togglebit löschen
    Locate 1 , 10
    Lcd Adress
    Locate 2 , 10
    Lcd Command
  Else
    Portd.3 = 0                              ' Kontroll-LED aus
    Locate 1 , 10
    Lcd "   "
    Locate 2 , 10
    Lcd "   "
  End If
  Waitms 200
Loop

Egal welche FB ich dran halte, es tut sich nichts. Die Else Abfrage habe ich mal raus genommen, dann bekomme ich immer nur 255 als Adresse
und 127 als Command, was ja normal sein soll wenn man nichts empfängt.

Tja.. wie mache ich nun weiter??
Liegt es an der Hardware oder an der Fernbedieung? Den Code schließe ich mal aus.
Ich habe eine Universalfernbedieung getestet und dabei einen Philips Code verwendet, aber kein Unterschied..
Ansonsten habe ich schon Probleme damit herauszufinden ob meine FB´s den RC5 Code senden.

Den Ansatz mit dem Programm das alle Codes erkennen kann, (Link war hier in einem anderen Beitrag) ist zwar gut, allerdings ist das mit
dem externen interrupt ja nicht so der Hit. Der bringt doch meine ganze Uhrzeit durcheinander, oder nicht?

Weiß zufällig jemand ob der Telekom Entetain Receiver RC5 sendet?

Besten Dank schon mal!


EDIT:
Ich verwende den Atmega 644 und nicht den tiny.
Habe nur den Original Code rein kopiert
Oszillator 16MHz
 
Hallo tenor,

du verwendest einen anderen Prozessor mit doppelter Taktfrequenz.

Hast du denn beides angepasst ?

Gruß
Pirx
 
Hm,
Wie soll man das anpassen?
Wusste jetzt nicht das die taktfrequenz für irda relevant ist.
Wie muss den die Anpassung aussehen?
 
Hallo!

So ganz verstehe ich das jetzt nicht. :hmmmm:

Welchen Programmcode hast du denn nun verwendet?
Wenn du einen Mega644 mit 16MHz genommen hast, dann musst du ja auch einen anderen Programmcode genommen haben.

Wenn du also Hilfe benötigst, dann solltest du auch den richtigen Code (am Besten einen kompilierfähigen) hier einstellen!
Momentan klingt es für mich so als wäre dies nur ein "Beispielprogramm", welches du als Einstieg verwendet hast.


Was z.B. Pirx gemeint hat ist folgendes:
Code:
$regfile = "m644def.dat"

$crystal = 16000000


Gruß,
Cassio
 
ja sorry, habe ich erst hinterher gesehen, daher nochmal editiert:
Die def und crystal habe ich angepasst.

hier der momentane Code, da habe ich zum testen die IF Anweisung noch entfernt:
Code:
$regfile = "m644def.dat"
$crystal = 16000000
$lib "mcsbyte.lbx"

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Const TIMSK = TIMSK0                                        'configure lcd screen
Config Rc5 = Pinc.0


Config Porta = Output                                       'LCD Display

Dim Adress As Byte
Dim Command As Byte

Enable Interrupts
Cursor Off                                   ' kein Cursor auf LCD anzeigen
Cls                                                         ' LCD löschen
Lcd "Adress :"
Lowerline
Lcd "Command:"
Do
  Getrc5(adress , Command)                   ' RC5-Fernbedienung einlesen
    Command = Command And &B01111111                        ' Togglebit löschen
    Locate 1 , 10
    Lcd Adress
    Locate 2 , 10
    Lcd Command
Loop

Mit If Anweisung s.o. ist es leider auch kein Unterschied.

Ich habe gelesen das der Timer0 für Getrc verwendet wird, daher habe ich zum testen ein neues Projekt erstellt und das nicht in das alte integriert.

besten Dank!
 
RC5 legt das seriell zu sendende Paket (Bitfolge) Manchester-codiert auf eine 36,?? kHz Carrier-Frequenz. Der TSOP filtert diese Manchester-Codierte Bitfolge wieder aus dem Carrier raus, und leitet diese an den Controller weiter (hast Du so angeschlossen). Der Algorythmus (getrc5) muß jetzt also die zeitlich aufeinander folgenden Halbbits (Flanken) auswerten, und zu den entsprechenden Bytes zusammenbasteln. Serielle Informationen werden immer irgendwie getimt - entweder synchron, oder asynchron. Da das hier ohne Clocksignal läuft, muß der Empfänger (wenn er sich erstmal synchronisiert hat) also mit entsprechenden Zeitintervallen arbeiten. Da getrc5 das ganze in Software löst, muß Bascom zur Berechnung der entsprechenden Intervalle wissen, wie schnell der Controller (in Wirklichkeit läuft). Für den Controller selbst sind das ja nur Maschienenzyklen. Takte. Die Information, welchen Controller Du verwendest, gibst Du hier an:
...
Code:
...
$regfile = "attiny2313.dat"                  ' AT Tiny2313
...
...
Die Geschwindigkeit hier:
...
Code:
...
$crystal = 8000000                           ' 8 MHz
...
...

Was ist das hier eigentlich für eine Bibliothek, und was macht die?
...
Code:
...
$lib "mcsbyte.lbx"                           ' Code etwas kleiner
...
...
 
Besten dank für die Erklärung!
Dann sollte das ja jetzt so passen.
Somit scheint mein Fehler in der Fernbedieung zu liegen...
Dachte so eine Universalfernbedienung sendet auch RC5.

Muss ich erstmal sehen wo ich noch so eine auftreiben kann.
Oder kann Bascom noch andere Codes?



Wie ich es verstanden habe, soll der COde schlanker werden.
http://avrhelp.mcselec.com/index.html?mcsbyte.htm

Wie gesagt, habe das als übungsbeispiel so übernommen.
 
Hallo!

Du solltest du IF-THEN Abfrage ruhig wieder einbauen, sonst befeurst du dein Display viel zu schnell mit neuen Daten......
was doch gar nicht notwendig ist.
Also das "IF Adress < 255 THEN" war schon OK, nur die Displayausgabe im ELSE solltest du weglassen.

Das Problem ist zur Zeit auch, dass du vielleicht gar keine RC5-fähige Fernbedienung zu Hause hast.
Zumindest bist du dir nicht sicher.

Hast du ggf. ein Oszilloskop zur Hand, um mal den Eingang des PIN`s zu messen?

Ansonsten kannst du auch eine LED z.B. an PORTC.1 betreiben, welche auf den PINC.0 reagiert.
So könntest du sehen, ob die Signale vom Eingangspin überhaupt ankommen und verarbeitet werden.


Grüße,
Cassio
 
Ah... Cassio hat deutlich mehr Bascom-Erfahrung...

was soll die Zeile mit config TIMSK machen? Die Hilfe hilft mir diesbezüglich nicht weiter...
Bist Du bei der jetzigen Version sicher, daß 1. das Display das so schnell anzeigen kann, 2. Du das so schnell lesenkannst?
Du kannst getrc5 auch zwingen, Timer2 zu verwenden wenn der Controller den hat (der 644 hat einen). Dafür gibts einen entsprechenden Parameter, siehe Hilfe.
Verwendet die Display-Ausgabe einen Timer? (oder wertet die irgendein Busy-Flag aus?)

Zum Thema: Bist Du sicher, daß der Controller mit 16MHz läuft? Welche Taktquelle hast Du wie angeschlossen? Entsprechende FuseBits gesetzt? Default ist bei den Controllern ein System-Clock-Prescaler mit 8 aktiviert. Diesen kann man über die CKDIV8-Fuse abschalten.
 
ok, das ist ein Argument, dann kommt die If Anfrage wieder rein ;)

Ich habe ein 16 MHz Quarzoszillator angeschlossen und in der eigentlichen Programmfunktion arbeitet der das Teil als Aquarium Kontroller mit Uhr und diese läuft ziemlich genau ;)
Daher sollte das mit den Fuse Bits passen. Habe damit experimentiert bis ich die Uhr vernünftig zum laufen gebracht habe.
Denke also das der Controller auch mit 16 MHz arbeitet.

Das mit der LED ist ein guter Tip, das werde ich heute mal ausprobieren.

Const TIMSK = TIMSK0
Ohne diese Zeile wollte er den Code nicht kompilieren.
Entsprechend der Fehlermeldung habe ich noch andere mit dem Problem gefunden (der Code war ja für den Tiny).
Anscheinend heißt TIMSK nur beim Tiny so und beim 644 eben TIMSK0.

Was Timsk genau macht weiß ich leider auch nicht, sind halt Parameter aus den *.def Dateien.
 
ups, mein Fehler gewesen. Da stand ja const Timsk...
TIMSK ist das Timer/Counter Interrupt Mask Register. Darin werden die Timer betreffenden Interrupts ermöglicht/scharfgeschaltet. Das ist in unterschiedlichen Controllern unterschiedlich - nur indem Du da jetzt 'ne neue Konstante nimmst, bringt das nichts.
Eigentlich solltest Du in 'ner Hochsprache da gar nicht ran müssen - dafür sollte es doch entsprechende enable-Instruktionen geben, die sich dann halt das entsprechende Register und das entsprechende Bit selbst raussuchen...

In älteren und/oder kleineren Controllern sind uU alle Timer betreffende Interrupt-Befähigungsflags in einem Register untergebracht (eben TIMSK). Bei neuueren und/oder größeren würde das mit der umfangreicheren Anzahl der Interrupts nicht mehr reichen, deswegen hat dort jeder Timer ein eigenes TIMSK-Register. Insbesondere sind also die Bits innerhalb des Registers (zwischen alt - neu) nicht gleich angeordnet. Ich würde mich nichtmal drauf verlassen, daß bei verschiedenen "neuen" Controllern äquivalente Flags in äquivalenten Bits stecken. Genau um das zu umgehen gibts ja für jeden Controller eine eigene Definitionsdatei.
 
Hallo!

Die Aussage verstehe ich jetzt nicht! :hmmmm:





Hier mal ein Auszug aus dem Datenblatt, wofür TIMSK0 steht:
Anhang anzeigen 4955


Grüße,
Cassio


Wenn ich TIMSK nicht gleich TIMSK0 setze, will Bascom den Code nicht kompilieren, daher noch die Zuweisung.
Ist natürlich möglich das auch das, das Problem bei meiner Schaltung ist.

Nach dem Entfernen dieser Zuweisung bekomme ich halt folgende Fehlermeldung:

.equ not found, probably using functions that are not supported by the selected chip[TIMSK]
 
Nach dem Entfernen dieser Zuweisung bekomme ich halt folgende Fehlermeldung:

.equ not found, probably using functions that are not supported by the selected chip[TIMSK]


Hallo!

Na ups....
scheint wohl eine Tippfehler in der DEF.DAT zu sein.

OK, dann verstehe ich das nun auch. :wink:


Mach nun erst mal den Test mit der LED, wenn du kein Scope oder LA zur Hand hast um das Signal zu messen.


Gruß,
Cassio



EDIT:
Nee, an der m644def.dat liegt es aber nicht. :hmmmm:
 
Hi,

Ich habe ein 16 MHz Quarzoszillator angeschlossen und in der eigentlichen Programmfunktion arbeitet der das Teil als Aquarium Kontroller mit Uhr und diese läuft ziemlich genau ;)
Daher sollte das mit den Fuse Bits passen. Habe damit experimentiert bis ich die Uhr vernünftig zum laufen gebracht habe.
Denke also das der Controller auch mit 16 MHz arbeitet.
Läuft die Uhr über den Systemtakt (16MHz) oder über ein extra Uhrenquarz (32,768kHz) am TOSC1/2 :confused:

Wenn du ein extra Uhrenquarz dran hast dann heißt das also noch lange nicht das dein Systemtakt auch wirklich auf 16MHz läuft.

Gruß
Dino
 
Wo wird denn versucht, auf das Register TIMSK zuzugreifen? In der externen Prozedur getrc5? Ist die nicht für die neueren/größeren Prozessoren vorgesehen? Mit welcher Bascom-Version arbeitest Du eigentlich?

So, wie das da steht, generierst Du eine neue Konstante (TIMSK), der du den derzeitigen Inhalt von TIMSK0 zuweist das sollte 0 sein. die Adresse von Register TIMSK0 zuweist, soweit ok.
Danach machst Du den RC5-scharf, welcher wohl auf das interrupt-Flag zugreifen will (Spekulation) -> aber in Deiner Konstante landet, die konstant 0 bleibt...
(abgesehen davon, daß man immer noch nicht beim korrekten Bit im (kopierten) Register landen würde - die heißen ja noch nicht mal gleich...)

Da die entsprechenden Flags aber an einer anderen Position im Byte stehen können, kann dort eh nicht direkt auf die Position zugegriffen werden. Bleibt der Bitname, aber auch die Bitnamen sind ggf unterschiedlich. Wenn Bascom (bzw config RC5 bzw getrc5) das also berücksichtigt, ist es inkonsequent, nicht gleich die möglichen unterschiedlichen Register zu berücksichtigen.
Impliziert das nicht irgendwann das nächste Problem, daß vielleicht der verwendete Interruptvektor nicht mehr paßt? (die Konstanten, hinter denen sich die Einsprungadressen verbergen heißen ja vielleicht auch anders...)
 
Nein, ich habe keinen extra Uhrenquarz ich nutze dafür schon den Oszillator.
Prescale = 256
Timervorgabe = 3036

getrc benötigt doch einen Timer so wie ich das verstanden habe, daher wird da auch wohl der TIMSK verwendet.

Meine Bascom Version ist 2.07
 
Grlg....
Der Mega644 hat (wie viele andere neuere Controller) aber gar kein einzelnes TIMSK-Register, sondern mehrere - für jeden Timer ein eigenes...
...
TIMSK ist das Timer/Counter Interrupt Mask Register. Darin werden die Timer betreffenden Interrupts ermöglicht/scharfgeschaltet. Das ist in unterschiedlichen Controllern unterschiedlich - nur indem Du da jetzt 'ne neue Konstante nimmst, bringt das nichts.
Eigentlich solltest Du in 'ner Hochsprache da gar nicht ran müssen - dafür sollte es doch entsprechende enable-Instruktionen geben, die sich dann halt das entsprechende Register und das entsprechende Bit selbst raussuchen...

In älteren und/oder kleineren Controllern sind uU alle Timer betreffende Interrupt-Befähigungsflags in einem Register untergebracht (eben TIMSK). Bei neuueren und/oder größeren würde das mit der umfangreicheren Anzahl der Interrupts nicht mehr reichen, deswegen hat dort jeder Timer ein eigenes TIMSK-Register. Insbesondere sind also die Bits innerhalb des Registers (zwischen alt - neu) nicht gleich angeordnet. Ich würde mich nichtmal drauf verlassen, daß bei verschiedenen "neuen" Controllern äquivalente Flags in äquivalenten Bits stecken. Genau um das zu umgehen gibts ja für jeden Controller eine eigene Definitionsdatei.
 
Interessante Ausführung Lota, leider kenne ich mich da leider noch nicht gut genug mit aus, hoffe das gibt sich nochmal.
Also schau ich mir noch mal Code an der schon mit einem neueren AVR gemacht wurde.

Den Test mit der Diode habe ich eben gemacht.
Es kommt auf jeden Fall was am AVR an. Die Diode "glimmt".
Wenn ich eine Taste drücke, dann flackert sie richtig.
 
Nein, ich habe keinen extra Uhrenquarz ich nutze dafür schon den Oszillator.
Prescale = 256
Timervorgabe = 3036


Hallo Tenor!

Warum machst du es uns nicht ein wenig einfacher und stellst dein komplettes Programm hier mal ein?
Es macht doch keinen Sinn, dass wir uns hier von einer Überlegung zur Anderen hangeln, weil wir den kompletten Ablauf nicht kennen.


Hast du denn den TIMER0 ohne RC5 schon in Verwendung?
In der BASCOM-Hilfe steht doch extra:
This statement is based on the AVR 410 application note. Since a timer is needed for accurate delays and background processing TIMER0 is used by this statement.

The interrupt of TIMER0 is also used by this statement.

Der TIMER0 muss also mindestens beim Aufruf von GETRC5() "frei" sein und zur Verfügung stehen!


Wenn dein Uhrentakt über TIMER0 erzeugt wird und du diesen (logischer Weise) permanent benötigst, wird das mit RC5 auch nicht funktionieren.


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)