Forum: Mikrocontroller und Digitale Elektronik MC für IR-Fernsteuerung programmieren


von LJay (Gast)


Angehängte Dateien:

Lesenswert?

Hi.

Nach einiger Zeit ohne Zeit ;)
Will ich mein Projekt nun endlich fertig bekommen.
Leider habe ich immer noch keine Lösung für das IR_Problem gefunden.

Mittels der Hilfe einiger User hier aus dem Board habe ich die im
Anhang dargestellte Platine bereits realisiert und programmiert.

Das einzigste Problem zur Zeit ist, dass die Steuerung mittels meiner
Fernseher-FB nicht funktioniert.

Leider kenne ich mich mit Assembler oder Basic überhaupt nicht aus,
um das Problem alleine zu finden.

Alle Ansätze der Programmierung halfen nicht weiter.
Es funktioniert alles bis auf das besagte.
Mittels Widerstandsmessung konnte ich auch feststellen, das der
IR-Empfänger meines erachtens funktioniert und richtig angeschlossen
ist.

Ich vermute daher, das es einzig und allein am Programmcode liegt.

Wenn sich jemand mal den Code anschauen könnte und evtl. bei der
Problemlösung hilft, wäre ich demjenigen sehr verbunden.

Hoffe auf gute Hilfe.
Bis dann

( mehr dazu: www.ravers-home.de/pk1/ )

von twice_rock (Gast)


Lesenswert?

in der hilfe von bascom ist der pull-up widerstand am tsop nicht
aufgeführt. wenn dass nicht der fehler ist wirds wohl daran liegen,
dass deine fernbedienung kein rc5 hat. ich musste 5 fb ausprobieren,
bis eine dabei war, mit der es funkioniert hat.

von LJay (Gast)


Lesenswert?

erm, "bascom" ??? Was zum Hänker ist bascom?

Weisst du wie oder wo man herausfindet, ob die FB RC5 benutzt?

von Frankl (Gast)


Lesenswert?

Sage doch mal den Hersteller und das Herstelldatum Deiner IR FB. Wenn
sieh kein Exot ist kann man es wohl herausbekommen. Wenn nicht, geht es
ins Eingemachte.

von LJay (Gast)


Lesenswert?

Der Fernseher ist von DUAL TV8204 82CM Stereo (Schaulandt-Marke), ca. 1
Jahr alt.
Das einzigste was ich zur FB herausbekommen habe ist, dass ein Samsung
Chip drauf ist.

Baujahr: Schätzungsweise 2003

-----------
Kann man dem MC nicht auch bebringen auf die Signale ohne RC5 zu
reagieren?
Es geht schliesslich lediglich um 2 Funktionen? grob gesagt an/aus.
Der MC soll den Motor entweder links- oder rechtsherum steuern.

von anfänger (Gast)


Lesenswert?

ähm...bist du irgendwie blöd??? der code in deinem anhang ist in bascom
geschrieben! du wirst doch wohl wissen, welche programmiersprache du
benuzt!?!?

wenn du den code nicht mal selber geschrieben hast, wirst du es wohl
kaum hinbekommen, jedes fernbedienungsprotokoll detektiert zu
bekommen.

aber nimm erst mal den pullup raus und probiers dann nochmal!

von Markus (Gast)


Lesenswert?

@anfänger:
Wenn sein Code in Bascom geschrieben ist, warum steht im Kommentar dann
"FastAVR" drin? Bascom ist doch nicht der einzige Basic-Compiler für
den AVR.

@LJay:
Man kann natürliche beliebige Fernbedienung benutzen, aber wenn es
keine fertigen Funktionen gibt, dann muß man die Dekodierung halt
selber programmieren. Ich habe das so gemacht, daß ich die Werte vom
TSOP in den PC eingelesen und dort dargestellt habe und anhand dessen
im Internet nach dem Protokoll gesucht habe. Damit kann man dann eine
eigene Funktion dafür schreiben.

Du könntest natürlich auch einfach eine programmierbare Fernbedienung
nehmen und diese auf einen RC5-Code einstellen.

Markus

von anfänger (Gast)


Lesenswert?

oh, hehe, stimmt. hab mir den code nicht genau angeguckt. hab nur die
endung und das symbol von dem file gesehen und daher auf bascom
geschlossen, weils genauso aussieht und der rechner hats auch mit
bascom geöffnet.

sorry - kann passieren :-)

dann kann das mit dem pull-up natürlich auch stimmen.

von LJay (Gast)


Lesenswert?

@Markus:
Ich habe bereits versucht, den Code zu umzuwandeln, das er ein
IR-Signal in den EEPROM speichert und ich den dann am PC auslesen
kann.
Dies ist die einzigste Schnittstelle an meinem PC und nur so könnte
ich Werte auch auslesen. Leider hat dies aber nicht geklappt.
Laut PonyProg ist der EEPROM immer leer.

Ich habe lediglich einen ISP Adapter zur COM1 Schnittstelle um den
ATM zu beschreiben oder eben zu lesen, andere Schnittstellen habe ich
nicht.

von Markus (Gast)


Lesenswert?

Hast Du während des Empfangs in das EEPROM geschrieben? Das geht wohl
nicht (zu langsam). Du mußt zuerst ins RAM schreiben und dann hinterher
die Daten ins EEPROM kopieren.

Markus

von LJay (Gast)


Lesenswert?

hmmm...
ich bin wie ihr bestimmt gemerkt habt, eher ein supernoob.
Mit den Bauteilen, Schaltplänen usw. komm ich schon ganz gut zurecht,
allerdings nicht mit der Sprache "Basic" oder assembler, das is mir
zu hoch :(

Kann also da nicht viel machen.

von LJay (Gast)


Lesenswert?

hmmm... schade, komme so leider einfach nicht weiter.

von Markus (Gast)


Lesenswert?

Wenn Du ein Problem hast, dann solltest Du es auch konkret benennen.
Keiner schreibt Dir hier auf Zuruf Code für die Samsung-Fernbedienung.

Wenn Du Dich mit Basic noch nicht richtig auskennst, dann muß Du es
eben lernen. Es gab doch sicher auch eine Zeit, in der Du Dich nicht
mit Elektronik ausgekannt hast. Da hast Du ja auch nicht rumgejammert,
sondern hast Dich eben eingearbeitet.

Wo liegt denn Dein konkretes Problem? Weißt Du nicht, wie man Daten ins
RAM schreibt oder wie man Fehler sucht oder ... ?

Markus

von LJay (Gast)


Lesenswert?

nee schon klar. sorry, so sollte das natürlich nich rüberkommen.

Das Problem liegt immer noch an dem IR-Signal.
Testweise würde ich nun versuchen - wie bereits erwähnt - ein
beliebiges Signal meiner FB in den RAM zu speichern um es per PonyProg
auslesen und evtl. weiter verwerten zu können.

Um aber genau diesen Schritt in Basic umsetzen zu können, würde ich
mich schon gern mit der Materie auseinandersetzen wollen.
Nur wo fange ich da am besten an?
Kennt jemant nen Tutorial oder Anleitung um solch ein Problem vom
Ansatz her zu beheben und dabei Basic etwas zu lernen?

Bei den Hauptaufgaben im Beruf, kann ich immo zeitlich leider nicht
komplett mir Basic anlernen, damit ich dieses "kleine" Problem gelöst
bekomme.
Das Projekt war eigentlich als einmalige Sache gedacht.

von Joern Gerhard (Gast)


Lesenswert?

Hier findest du sehr gute Grundlageninfos zu IR und den verschiedenen
FB-Codes:
http://www.xs4all.nl/~sbp/knowledge/ir/ir.htm

Und hier findest du die Info, wie du auch OHNE Oszi und OHNE besondere
Schnittstellen mal eben die Codes deiner FB herausfinden kannst:
http://www.riccibitti.com/quickdesigns.htm

Viel Spass!

cu joern

von FranzK (Gast)


Lesenswert?

Hallo,

ich hatte dasselbe Problem. Habe mir dann einen Lirc-Sensor gebaut, und
den an den PC gehangen. Mit dem WinLirc Programm unter Windoof gibt es
einen RAW-Modus der zeigt dir an wie die Signale und die Zeitverhalten
aussehen. Praktisch ein fast Oszi als textuelle Ausgabe. Damit konnte
ich dann relativ einfach einige meiner Fernbedienungen entschlüsseln.
Der Lirc Sensor iat ja auch kein Problem der wird über COM-Üort mit dem
PC verbunden.
Die Routinen für den MC konnte ich dann problemlos schreiben und die
Signale meiner nicht RC5 Fernbedienungen erkennen!

Gruß Franz

von LJay (Gast)


Lesenswert?

hmmm. danke erstmal für eure Tipps.

Hab mir die sites angeschaut. Will nicht behaupten das ich alles
verstanden habe, aber wirklich weiter gebracht hat es mich auch nicht.
Ich kenn mich leider absolut nicht mit Basic oder C aus, daher wird es
schwer, irgend welche Bits auszulesen und weiterzuverarbeiten.

Ich suche bereits seit 3 Tagen nach ner Art Funktion-Referenz oder
Manual zu basic, leider vergebens.
Denn selbst einige Funktionen in meinem aktuellen Code sind mir nicht
ganz schlüssig.

von LJay (Gast)


Lesenswert?

... seit nunmehr mehr als 4 Monaten bin ich an dem "Projekt" dran
(www.ravers-home.de/pk1/) und es wird leider nicht fertig.

Momentan bin ich eher in der Stimmung das aufzugeben und den Ausflug
in die Feinelektronik und MC Programmierung abzuhaken...

Ich würde mich bereiterklären, demjenigen einen "Obulus" zu zahlen,
der
mir den passenden und funktionierenden Code zu der Schaltung liefern
kann.

von Markus (Gast)


Lesenswert?

Hallo LJay,

für FastAVR gibt es doch beim Hersteller eine Dokumentation mit allen
Befehlen. Ist sie Dir zu unübersichtlich oder verstehst Du die
englischen Texte nicht? Falls letzteres, dann würde ich
http://www.rowalt.de/mc/index.htm empfehlen, da gibts einen Einstieg in
Bascom für AVR auf Deutsch. Bascom ist ebenfalls ein Basic-Compiler (wie
FastAVR) und kann in der Demoversion Code bis 2KB erzeugen (mehr
Speicher hat Dein 2313 sowieso nicht).

Keiner stört sich daran, wenn Du blöde Fragen stellst. Aber zur Zeit
stellst Du kaum Fragen, sondern bist einfach von den Problemen
überwältigt. Die Lösung ist, daß Du da systematisch rangehst:

Wie viel verstehst Du denn allgemein vom Programmieren? Hast Du
verstanden was Schleifen und Variablen sind? Kennst Du den Unterschied
zwischen Flash, RAM und EEPROM?

Welche Befehle in Deinem bisherigen Programm verstehst Du denn nicht?

Hast Du mittlerweile ein Diagramm gefunden, in dem gezeigt wird, wie
der Code von Samsung-Fernbedienungen aussieht?

Markus

von Joline (Gast)


Lesenswert?

Hallo LJay,

bist Du sicher, dass der IR-Empfänger auch richtig angeschlossen ist?
Auf Deiner Site auf dem Schaltplan hast Du Pin 2 als Data benutzt. Es
gibt natürlich verschiedene IR-Empfänger. Und manche (viele ?) benutzen
aber Pin 3 dafür.

Joline

von LJay (Gast)


Lesenswert?

Hi.

>für FastAVR gibt es doch beim Hersteller eine Dokumentation mit
> allen
>Befehlen. Ist sie Dir zu unübersichtlich oder verstehst Du die
>englischen Texte nicht? Falls letzteres, dann würde ich
>http://www.rowalt.de/mc/index.htm empfehlen, da gibts einen
>Einstieg in
>Bascom für AVR auf Deutsch. Bascom ist ebenfalls ein Basic-Compiler
>(wie
>FastAVR) und kann in der Demoversion Code bis 2KB erzeugen (mehr
>Speicher hat Dein 2313 sowieso nicht).
Habe bisher keine Docu zu FastAVR gefunden, wenn dann nur Assembler.

>Wie viel verstehst Du denn allgemein vom Programmieren? Hast Du
>verstanden was Schleifen und Variablen sind? Kennst Du den
>Unterschied
>zwischen Flash, RAM und EEPROM?
Wenn ich euch jetzt sage, dass ich Fachinformatiker bin, lacht ihr
ich aus. ;)
Beherrschen tu ich leider nur CFML, PHP und den Webkram.
C/C++ hab ich nur leichtes Schulniveau.
Komme also gut klar mit Schleifen, IF-Else usw..
Unterschied zwischen Flasch, RAM und EEProm kann ich mir zwar wage
vorstellen, aber wenn ich ehrlich bin, würd ich eher meinen, das ich
die nicht so genau auseinanderhalten kann.

>Welche Befehle in Deinem bisherigen Programm verstehst Du denn
>nicht?
Also in meinem Code versteh ich die Funktionen usw. schon recht gut,
nur eben nicht genau. Also ich kann mir vorstellen was diese tun(
ist ja vom Namen meistens abzuleiten).
Mich hatte die RC5() Funktion interessiert. Dachte, wenn ich wüsste
wie genau die funzt, könnte ich di umschreiben für Samsung.

>Hast Du mittlerweile ein Diagramm gefunden, in dem gezeigt wird, wie
>der Code von Samsung-Fernbedienungen aussieht?
Das einzigste was ich dazu gefunden habe ist folgendes:
http://users.skynet.be/bk317494/011/011_waves.htm
Damit kann ich aber nichts abfangen, da ich das nicht kappiere.

>bist Du sicher, dass der IR-Empfänger auch richtig angeschlossen
>ist?
ziemlich, würde aber nichts ausschliessen.
Allerdings wurde das bereits alles schon 100mal getestet und
durchgesehen von anderen und von mir.
Habe auch mit nem Multimeter getestet gehabt, ob denn überhaupt ein
Signal am IR-Empfänger ankommt. Getestet durch den HIGH-LOW Pegel an
den Pins. (Hatte Anleitung zum testen) und das klappte.
Es sollte also nunmehr alles korrekt angeschlossen und eingebaut sein.

>Auf Deiner Site auf dem Schaltplan hast Du Pin 2 als Data benutzt.
>Es gibt natürlich verschiedene IR-Empfänger. Und manche (viele ?)
>benutzen aber Pin 3 dafür.
Das stimmt glaube auch nicht mehr...
Habe es so angeschlossen, wie es im Datenblatt des TSOP stand.

von Markus (Gast)


Lesenswert?

> Habe bisher keine Docu zu FastAVR gefunden, wenn dann nur Assembler.

Kennst Du das hier http://www.fastavr.com/FastAVR.pdf ? Das
Inhaltsverzeichnis ist hinten.

> Wenn ich euch jetzt sage, dass ich Fachinformatiker bin, lacht ihr
> mich aus. ;)

Nein, ich kenn das Niveau der Ausbildung von meinen Lehrlingen.

> Unterschied zwischen Flasch, RAM und EEProm kann ich mir zwar wage
> vorstellen, aber wenn ich ehrlich bin, würd ich eher meinen, das ich
> die nicht so genau auseinanderhalten kann.

http://www.mikrocontroller.net/wiki/Flash-ROM
http://www.mikrocontroller.net/wiki/EEPROM
http://www.mikrocontroller.net/wiki/RAM

> Mich hatte die RC5() Funktion interessiert. Dachte, wenn ich wüsste
> wie genau die funzt, könnte ich di umschreiben für Samsung.

Die interne Funktionsweise ist da meistens nicht beschrieben. Und
Sourcecode wird meist auch nicht mitgeliefert. Andererseits sind die
Protokolle auch relativ verschieden, so daß man das nicht einfach
anpassen kann.

> http://users.skynet.be/bk317494/011/011_waves.htm
> Damit kann ich aber nichts abfangen, da ich das nicht kappiere.

Es gibt in dem Diagramm Low- und Highpegel. Für einen Highpegel wird
das Signal mit (z.B. 36kHz) gesendet, bei einem Lowpegel nicht. Um die
36kHz brauchst Du dich aber nicht zu kümmern, das macht der TSOP
alleine. Du bekommst am Ausgang einfach fertige Low- und Highpegel
(wobei der TSOP die glaub invertiert wenn ich mich recht erinnere). Für
einen ersten Test kannst Du einfach mal eine LED am Microcontroller
anschließen und in einer Endlosschleife die Werte vom TSOP an der LED
ausgeben. Dann blinkt die LED im Rhythmus der IR-Signale von der
Fernbedienung.

Nun ist es aber nicht so, daß Highpegel=1 und Lowpegel=0, sondern die
Bits sind codiert (und zwar bei jedem Protokoll anders). Bei dem
Samsung Protokoll kommt zuerst ein Highpegel von 0,56ms Dauer und dann
ein Lowpegel mit 0,56 oder 1,69ms Dauer. 0,56ms stehen für ein 0-Bit,
1,69ms stehen für das Highbit.

Damit man den Anfang und das Ende der Übertragung erkennen kann gibt es
noch spezielle Start- und Stopbits. Die Zeiten dafür stehen ebenfalls im
Diagramm. Dazwischen sind (http://users.skynet.be/bk317494/011/011.htm)
32 Datenbits.

Hier geht es ständig um Zeiten, also mußt Du die Dauer der Low- und
Highpegel messen können. Das macht man z.B. mit einem Timerinterrupt.
Du schreibst also z.B. eine Funktion, die 10.000 mal pro Sekunde (vom
Timerinterrupt) aufgerufen wird. Damit kannst Du die Zeiten mit 0,1ms
Auflösung messen. Einen Artikel über Timerinterrupts in Bascom gibts
hier: http://www.rowalt.de/mc/avr/avrboard/05/avrb05.htm

Markus

von LJay (Gast)


Lesenswert?

>Kennst Du das hier http://www.fastavr.com/FastAVR.pdf ? Das
>Inhaltsverzeichnis ist hinten.
Kannte ich noch nicht. Habe wohl beim googln flasche Suchbegriffe
benutzt...
Werd mir das heute Nacht mal zu Gemüte ziehen und auch versuchen,
ob ich das mit dem LED zum anzeigen der Signale hinbekomme.

> Wenn ich euch jetzt sage, dass ich Fachinformatiker bin, lacht ihr
> mich aus. ;)
> Nein, ich kenn das Niveau der Ausbildung von meinen Lehrlingen.
Traurig aber wahr.
Zumal bei mir noch von "Nachteil" war, dass ich in einer Internet-
Service Agentur ausgebildet wurde (praktischer Teil). Somit habe ich
keine Berührung mit den hohen Programmiersprache gehabt.
Lediglich Webanwendungen in CFML (ColdFusion) und PHP (incl. html usw.)
kann ich jetzt perfekt coden...

Ich bin sehr dankbar für deine Infos und Links.
Das scheint mir auf alle Fälle etwas weiter zu helfen.
Werde mir, wie gesagt, das heute Nacht mal alles genau anschauen.
Mal sehen wie es morgen aussieht.

von LJay (Gast)


Lesenswert?

also auf der Site mit den Timerinterrupts versteh ich kaum ein Wort.
Alles böhmische Dörfer...

Ich würde diese Schleife halt so ansatzweise coden:
Do
  For i=0 To 10000
    If PORTD.2 = 0 Then
      Reset PORTB.2
    Else
      Set PORTB.2
    End If
  Next
Loop

Das scheint allerdings vollkommen daneben zu sein.
###############
Testcode:
$Device= 2313      ' used device
$Stack = 28      ' stack depth
$Clock = 3.6864      ' adjust for used crystal
$Source= On      ' basic source in Asm
$Timer0= Timer

DDRB  = &b00001100
DDRD  = &b0000011
PORTB = &b10101111
PORTD = &b1111100

'PORTD.2 = IR-Empfaenger
'PORTB.2 = LED gruen

Dim i As Integer

Do
  For i=0 To 10000
    If PORTD.2 = 0 Then
      Reset PORTB.2
    Else
      Set PORTB.2
    End If
  Next
Loop

von Markus (Gast)


Lesenswert?

Ein Timer ist einfach ein selbständig laufender Zähler, der völlig
unabhängig vom laufenden Programm vor sich hin zählt. Man muß die
Quelle konfigurieren, d.h. spezielle I/O-Pins oder über einen Vorteiler
vom Systemtakt abgeleitet. Da wir hier Zeit messen wollen, wird das vom
Systemtakt abgeleitet. Damit er nicht mit 4MHz zählt, nehmen wir einen
Vorteiler, z.B. durch 8. In Bascom:

Config Timer0 = Timer , Prescale = 8

Wir wollen im Interrupt eine Funktion aufrufen, deren Namen muß der
Compiler natürlich wissen. In Bascom:

On Timer0 MeineTimerFunktion

Wir müssen den Timer0 dann erstmal aktivieren. In Bascom:

Enable Timer0

und dann überhaupt noch die Interrupts an sich einschalten.

Enable Interrupts

Jetzt zählt der Timer brav vor sich hin und löst bei jedem Overflow
(wenn er zu 255 eins dazuzählen soll) einen Interrupt aus. Allerdings
paßt die Geschwindigkeit noch nicht so ganz und mit dem Vorteiler
alleine geht das auch nicht viel besser (der ist zu grob). Deswegen
geht man her und startet den Zähler nicht bei 0, sondern bei einem
anderen Wert, z.B. bei 210. Dann muß er immer nur von 210 bis 255
zählen. Diese Wert muß man aber bei jedem Durchgang neu setzen, d.h.
das muß in der Interruptroutine passieren. In Bascom etwa so:

MeineTimerFunktion:
  Timer0 = 210

  ' Hier dann die Werte vom TSOP lesen

Return


Markus

von LJay (Gast)


Lesenswert?

Mensch, wenn es solche Ausführungen nur mal im Netz geben würde.
Das war doch schon verständlich, selbst für mich.

Ich habe das mal getestet:
1
$Device= 2313      ' used device
2
$Stack = 28        ' stack depth
3
$Clock = 3.6864      ' adjust for used crystal
4
$Source= On        ' basic source in Asm
5
6
Config Timer0 = Timer , Prescale = 8
7
8
On Timer0 MeineTimerFunktion
9
10
Enable Timer0    
11
12
Enable Interrupts
13
14
MeineTimerFunktion:
15
  Timer0 = 210
16
Return

Dabei hat mich jetzt verwundert das das gruene LED an geht.
Ca. alle 18-20 Sekunden geht nun das grüne LED an/aus.
Dabei kann ich im Code nichts finden, was dieses bewirken sollte?!

Wie kann ich nun errechnen und festlegen, dass diese Schleife genau
im 0,1ms-Takt durchläuft um die TSOP auszuwerten?
Und wie kann ich denn den TSOP jetzt abfragen?
In welcher Form liegt der Rückgabewert dann vor? (als Bytes, oder)
Sprich: Ich bekomme dann jede 0,1 ms einen Wert wie z.B.
"0001","0011" usw. und müsste nun wissen, welcher dieser Werte
zuerst der Startbit ist um dann alles was danach folgt als IR-Code
anzusehen (Befehl der FB), bis der Stop-Bit kommt.
Versteh ich das richtig?

von LJay (Gast)


Lesenswert?

ahh sry, das lag wohl an mir, das das oben nicht gefunzt hat.
Mein FastAVR hat wohl irgendwie immer den alten code gecached gehabt
und mir nicht den neuen compiliert.
Damit konnte ich nie wirklich diesen Timerinterrupt testen.

Nachdem ich das nun geschafft habe, das er nicht mehr cached, kann
er den Code wie im thread drüber angegeben nicht compilieren wegen
Fehlern.
Werde mir jetzt Bascom downloaden und hoffe, das es damit geht.

Ich hatte fälschlich vermutet, das du zwar immer Bascom schreibst
aber das auch normales BASIC ist und ich das mit FASTAvr auch
compilieren kann... naja

von LJay (Gast)


Lesenswert?

Ok, also folgender Code konnte mit Bascom compiliert werden und ergab
keine Fehler.
1
Config Timer0 = Timer , Prescale = 8
2
3
On Timer0 MeineTimerFunktion
4
5
Enable Timer0
6
7
Enable Interrupts
8
9
MeineTimerFunktion:
10
  Timer0 = 210
11
Return

Womit ich nun bei den Fragen bin, die ich 2 Posts vorher gestellthabe.

von Markus (Gast)


Lesenswert?

Was machst Du denn im Hauptprogramm? Im ersten Moment würde ich da noch
nichts machen (leere Do Loop Schleife).

Zur Zeitberechnung: Der Zähler zählt mit Takt/Prescaler, also bei Dir
3,686MHz / 8 = 460,75kHz. Du willst 10kHz haben. Das gibt dann
460kHz/10kHz = 46 Schritte. Der Überlauf passiert bei 256, also muß er
bei 256-46=210 mit dem Zählen anfangen.

Einlesen: Du mußt das Portpin auf Input schalten (über das Data
Direction Register, DDRx) und dann den Wert einlesen (Pin-Kommando).
Eine Beschreibung für Bascom findet sich hier:
http://www.rowalt.de/mc/avr/avrboard/03/avrb03.htm

Allerdings bekommst Du da nur den aktuellen Wert vom TSOP, nicht die
Bitfolge. Die mußt Du selber auswerten. Das mache ich so: Du
vergleichst den aktuellen und den vorigen Wert. Ist der Wert gleich,
dann hat sich der Zustand nicht geändert und Du addierst zur Dauer
0,1ms hinzu. Hat sich der Zustand geändert, dann speicherst Du die
Dauer ab (oder wertest sie gleich aus) und setzt die Dauer wieder auf
0.

Am Anfang liest Du immer 0 (weil kein Signal da ist). Du wartest, daß
eine 1 kommt und fängst dann mit dem Zählen an. Das Startbit-High
sollte 4,5ms sein, also solltest Du ungefähr(!) bis 45 zählen können.
Danach 45 Interrupts lang low, damit hast Du ein gültiges Startbit
erkannt. Danach eben die Datenbits messen und auswerten. Du mußt die
einzelnen Bits selbst zu einem Byte zustammenbauen. Die notwendigen
Kommandos heißen AND, OR und Shift.

Markus

von Markus (Gast)


Lesenswert?

Bei den meisten Sprachen gibts in der Sprachdefinition keine
Hardwarezugriffe. Deswegen macht das jeder Compiler anders. Ich kenne
FastAVR nicht so genau, deswegen kann ich zu den Unterschieden nichts
sagen.

Markus

von LJay (Gast)


Lesenswert?

axo 10KHz = 10000ms ?!

Werd das mal probieren.

PS: Hab garkeine DO/LOOP im obigen Quelltext gehabt.

von LJay (Gast)


Lesenswert?

Bei folgendem Code bekomm ich beim compilieren den Fehler
[error]
Error : 31    Line :   18    Invalid datatype  , in File : TEST1.BAS
[/error]

Zeile 18 = "If Portd.2 = Zustand Then"
1
Ddrb = &B11111100
2
Portb = &B00001111
3
Ddrd = &B1001011
4
Portd = &B0000000
5
6
Dim Zustand As Byte
7
Dim Dauer As Integer
8
9
Config Timer0 = Timer , Prescale = 8
10
On Timer0 Meinetimerfunktion
11
12
Enable Timer0
13
14
Enable Interrupts
15
16
Meinetimerfunktion:
17
  Timer0 = 210                                             
18
'Startposition
19
  If Portd.2 = Zustand Then                                 'Wenn
20
aktuelles signal = letztem Signal
21
   Dauer = Dauer + 1                                        'Dauer um
22
0,1ms erhoehen
23
   Set Portb.2                                              'LED gruen
24
aus
25
  Else
26
   Zustand = Portd.2                                        'neuer
27
Zustand = Wert vom TSOP
28
   Dauer = 0                                                'Dauer
29
wieder auf 0 (1:0,1ms)
30
   Reset Portb.2                                            'LED gruen
31
an
32
  End If
33
Return
34
35
Do
36
Loop

Was ist daran falsch?
Wird das in Bascom anders als im FastAVR gemacht?
Da hab ich das so verstanden.

von Markus (Gast)


Lesenswert?

10kHz = 0,1ms
1s/10.000 = 0,1ms

Ich hab doch extra den Link
http://www.rowalt.de/mc/avr/avrboard/03/avrb03.htm
angegeben, weil da drinsteht, wie man in Bascom mit den I/O-Pins
arbeitet.

Markus

von LJay (Gast)


Lesenswert?

hab mir die seite durchgelesen und eben noch einmal...
Habe demnach doch meine I/Os richtig benutzt im code...

von LJay (Gast)


Lesenswert?

also deinem letzten Post entnehme ich, das ich wohl etwas falsch gemacht
habe.
Habe nun die Seite mit der Erklärung zu I/O-Pins mehrmals durchgelesen
und kann keinen Fehler bei mir entdecken.

Wenn ich meinen Code so anschaue, würde ich davon ausgehen, dass bei
jeder "1" die über PORTD.2 (IR-Signal) reinkommt, das LED angeht.

Ist da sooo falsch? Hab ichw as falsch verstanden?

von Markus (Gast)


Lesenswert?

Bekommst Du die Fehler beim Übersetzen noch?

Markus

von LJay (Gast)


Lesenswert?

Nun nicht mehr... habe aus "Dim Zustand As Byte" = "Dim Zustand As
Bit" gemacht.
Da ich ja nur 1 oder 0 brauche, was ja in einem Bit dargestellt werden
kann.

Ich habe nun mal ein ganz simples Programm geschrieben und wollte
damit testen, ob überhaupt der Zustand am TSOP mal geändert wird.
Wenn ich richtig der Annahme gehe das an Portd.2 ja immer nur der
Wert 1 oder 0 vorliegen kann, könnte ich ja nun sagen:
Wenn Portd.2 = 1, dann schalte das LED an.
Somit sollte also mein LED sofort eingeschaltet werden, wenn auch
nur einmal der Wert 1 (High) am TSOP anliegt. Das LED müsste dann
anbleiben.
Nur funktioniert selbst das nicht mal - kann es sein, das ich
zwischenzeitlich den TSOP wieder falch angeschlossen habe oder
defekt ist, oder ist mein Testcode einfach nur falsch?
1
Ddrb = &B11111100
2
Portb = &B00001111
3
Ddrd = &B1001011
4
Portd = &B0000000
5
6
Config Timer0 = Timer , Prescale = 8
7
On Timer0 Meinetimerfunktion
8
9
Enable Timer0
10
11
Enable Interrupts
12
13
Meinetimerfunktion:
14
  Timer0 = 210
15
  If Portd.2 = 1 Then
16
   Reset Portb.2
17
  End If
18
Return
19
20
Do
21
Loop

von Markus (Gast)


Lesenswert?

Wie Du dort http://www.rowalt.de/mc/avr/avrboard/03/avrb03.htm übersehen
hast, wird im Bascom ein I/O-Pin mit dem PIN-Kommando gelesen. Deine
Abfrage muß also

If Pind.2 = 1 then

heißen. Die Bascom-Hilfe sagt dazu:
'reading the PORT, will read the latch, that is the value
'you have written to the PORT.
'This is not the same as reading the logical values on the pins!
'When you want to know the logical state of the attached hardware,
'you MUST use the PIN register.

Markus

von LJay (Gast)


Lesenswert?

ahhh aaaaxxo.
Das war mal wieder son typisches "Der Fehler liegt im Detail" ;).
Nun flakert die LEd ein wenig, sobald ich eine Taste der FB drücke.
Das ist doch schonmal ein Fortschritt.

Dann werde ich morgen nochmal meinen Code mit dem merken von Zustand
und Dauer testen.

von LJay (Gast)


Lesenswert?

bin nun am schreiben der "Zähl"-Funktion.
Ist aber leider nicht so, wie ich es mir dachte.
Komischerweise bekomme ich es nicht hin, das ich einen "globalen"
Zähler hochzähle.

Dies ist mein Ansatz, von dem ich glaube, das er der Lösung am
nächsten kommt:
Demnach sollte jeweils nach 1 Sekunde ein LED an bzw. aus gehen.
Immer blinkend im 1Sekunden-Takt.
1
Ddrb = &B11111100
2
Portb = &B00001111
3
Ddrd = &B1001011
4
Portd = &B0000000
5
6
Dim Ir As Bit      'Pind.2 signal=0 / kein signal=1
7
Dim I As Long      'Schleifenzaehler
8
I = 0
9
10
On Timer0 Zeitmesser
11
Config Timer0 = Timer , Prescale = 8
12
13
Enable Timer0
14
Enable Interrupts
15
16
Zeitmesser:
17
' 1 Ueberlauf = 0,1ms
18
  Timer0 = 210      'Startposition
19
  Ir = Not Pind.2    'IR = TSOP Zustand (1=High/0=Low) da TSOP das
20
invertiert liefert
21
22
  If I = 10000 Then    'bei 1 Sekunde LED an/aus schalten (1000ms = 1s /
23
10000*0,1ms = 1s)
24
      Portb.3 = Not Portb.3
25
      I = 0      'I zurücksetzten
26
  End If
27
  Incr I      'I incrementieren (+1)
28
Return
29
30
31
32
Do
33
Loop

von LJay (Gast)


Lesenswert?

...oder ist das hier besser?
1
Ddrb = &B11111100
2
Portb = &B00001111
3
Ddrd = &B1001011
4
Portd = &B0000000
5
6
Dim Ir As Bit      'Pind.2 signal=0 / kein signal=1
7
Dim I As Long      'Schleifenzaehler
8
I = 0
9
10
On Timer0 Zeitmesser
11
Config Timer0 = Timer , Prescale = 8
12
13
Enable Timer0
14
Enable Interrupts
15
16
Zeitmesser:
17
' 1 Ueberlauf = 0,1ms
18
  Timer0 = 210      'Startposition
19
  Ir = Not Pind.2    'IR = TSOP Zustand (1=High/0=Low) da TSOP das
20
invertiert liefert
21
Return
22
23
24
25
Do
26
  If Timer0 = 255 Then
27
    Incr I
28
  End If
29
30
  If I = 10000 Then
31
    Portb.3 = Not Portb.3
32
    I = 0
33
  End If
34
Loop

von Markus (Gast)


Lesenswert?

Die erste Lösung ist schon die richtige. Die zweite Lösung wird nicht
funktionieren, da der Timer0 ja mit Takt/8 läuft ist es Zufall ob Du
ihn gerade bei 255 erwischt. Meist wirst Du ihn nicht erwischen und
deswegen wird das eher zufällig tun.

Markus

von LJay (Gast)


Lesenswert?

hmmm nur funzen beide nicht.
Bei der ersten scheint es so, als würde "I" nicht incrementiert
werden.
Selbst wenn ich nach "IF I = 10" frage, geht er nicht in die
IF-Anweisung.
I scheint also nicht hochgezählt zu werden.
Allerdings versteh ich nicht wieso.
Habe in allen Beispielen die ich gefunden habe, das auch so gesehen...

von Markus (Gast)


Lesenswert?

So auf die Schnelle weiß ich auch nicht an was das liegt. Rumprobieren
würde ich mal mit
i = i + 1 (statt Incr i) und
Portb.3 = Not Portb.3
durch eine Lösung ersetzen, bei der Du nicht versuchst, aus dem Ausgang
wieder zu lesen.

Markus

von LJay (Gast)


Lesenswert?

hab ich bereits alles schon probiert.
Bisher ging nichts.

I = i + 1 // geht nicht
Portb.3 = 1 //geht nicht
Reset portb.3 // geht alles nicht

Er geht nicht in die If Anweisung, da I anscheinend immer gleich
bleibt.

von LJay (Gast)


Lesenswert?

Ich hab ma getestet:
Wenn I < 10 dann grünes LED an!
Wenn I > 10 dann LED aus!

Dabei bleibt das LEd die ganze Zeit an!!
1
If I < 10 Then
2
   Reset Portb.2
3
Else
4
   Set Portb.2
5
End If

von LJay (Gast)


Lesenswert?

hab die ursache mit hilfe aus nem anderen thread gefunden!

Die "DO/Loop" Schleife muss vor der Timerfunktion stehen!

Sowas triviales aber auch, da soll erstmal einer drauf kommen... ;)

von LJay (Gast)


Lesenswert?

ach mist...
Seit stunden zerbrech ich mir den Kopf, wie ich denn nun die Pegel
des TSOP auslesen und ordentlich verwerten kann.

1. Problem: 0,1ms Genauigkeit ist zu grob. Ich brauch 0,001 ms
da z.B. eine digitale 0 der FB über 1,125ms (2*0,56ms) lang gesendet
wird.

2. Problem: nach vielen versuchen und vielem leider ergebnislosem
googlen bekomm ich es nicht mal hin, das Startbit als solches im
programm zu erkennen und zu merken.

3. Ich befprchte schon jetzt, dass 2KB Bascom-Code nicht ausreichen
werden. Leider kann ich aber nicht mehr Speichern im AT2313

Der Ablauf des Programms müsste ja wie folgt aussehen.
Warten auf Signal:
Wenn Startbit -> nachfolgende Signale = IR-Code (Befehl)
bis Stopbit.

IR-Code ermitteln und in Varaible speichern ->
Befehl unterscheiden : 1. vorwärts, 2. rückwärts, 3.garnichts (alle
anderen befehle ignorieren)

Beim "zusammensetzen" des Befehls hab ich mir auch schon Gedanken
gemacht.
Wenn ich mehrere 0 und 1 reinbekomme und bei jedem Pegel messen muss
wie lange er gesendet wurde um darauf wiederum zu erkennen ob es
eine digitale 0 oder 1 ist um diese wiederum zu merken und zu den
vorhergehenden anzufügen, wie kann ich dann einen Befehl in einen
"String" zusammensetzen der nach und nach erst zusammengefügt wird
und am ende aus aneinandergereihten 0 und 1 besteht?

Der Befehlt müsste doch in einer variablen stehen und ungefähr so
aussehen "IR_befehl = '00011101000110101010101010000000'"
Wenn ich richtig verstanden habe, ist der Befehl bei dem Samsung code
32Bit. (plus 1 stop- und 1 startbit)
http://users.skynet.be/bk317494/011/011_waves.htm

Langsam wird mir das auch echt unangenehm, da ich laufend frage,
dann die lösung bekomme und es teste. Wenn es funzt versuch ich
den code weiter zu entwickeln und hab dabei gleich die nächste
hürde die ich zu meistern habe und schon bin ich wieder im Forum...
Sry nochmal für meinen schwierigen Fall von Unwissenheit.

PS: glaubt evtl. jemand, das dies besser (evtl. nur) mit C zu
realisieren ist? (hoffentlich nicht, denn dann kenn ich schon meine
nächste Frage dazu..)

[das das auch immer so kompliziert sein muss]

von LJay (Gast)


Lesenswert?

Mit der Fernbedienung vom Fernseher und dem ganzen IR-Code auslesen usw.
hab ichs aufgegeben. Da hät ich noch in nem Jahr dran gesessen.

Hab nun meine Universal-FB ausm schrank geholt und nen RC5 code
eingestellt. (SupportPlus mit TV-Code 360 [philips])

mit folgendem code funzt es schonmal so wie ich es ungefähr haben
wollte.
Lautstärke- (code 17) lässt motor linksrum drehen
Lautstärke+ (code 16) lässt motor rechtsrum drehen
Mute (code 13) lässt ihn stoppen.

Für Verbesserungsvorschläge bin ich immer dankbar.
An der Stelle auch nochmal ein fettes DANKE an alle die mir geholfen
habe.

Sollte ich alles fertigbekommen (inkl. Hardware und einbau des Geräts)
werde ich es hier bescheid geben und natürlich auf
www.ravers-home.de/pk1/ dokumentieren.
1
Ddrb = &B11111100
2
Portb = &B00001111
3
Ddrd = &B1001011
4
Portd = &B0000000
5
6
'Portd.0 = Relais 1
7
'Portd.1 = Relais 2
8
'PIND.2 = IR
9
'Portb.2 = LED gruen
10
'Portb.3 = LED gelb
11
12
$lib "mcsbyte.lbx"
13
14
Config Rc5 = Pind.2
15
16
Enable Interrupts
17
18
Dim Address As Byte , Command As Byte
19
20
Do
21
  Getrc5(address , Command)
22
23
  'Adresse = ist TV siehe
24
http://home.t-online.de/home/Holger.Heinemann/homepage.htm?rc5.htm
25
  If Address = 0 Then
26
     Command = Command And &B01111111
27
28
     If Command = 16 Then    '16=Lautstärle +
29
         Set Portb.2
30
         Set Portd.0
31
         Reset Portb.3
32
         Reset Portd.1
33
     End If
34
     If Command = 17 Then     '17=Lautstärle -
35
         Set Portb.3
36
         Set Portd.1
37
         Reset Portb.2
38
         Reset Portd.0
39
     End If
40
41
     If Command = 13 Then    'MUTE
42
      Set Portb.2
43
      Set Portb.3
44
      Set Portd.0
45
      Set Portd.1
46
     End If
47
  End If
48
Loop
49
End

von LJay (Gast)


Lesenswert?

Ich werd verrückt!!!!!!!!!!!!!!!!!!!

Nur mal zum Spass hab ich die richtige FB vom aktuellen Fernseher
rangehalten, mit der ich von Anfang an alles machen wollte, und alle
Tasten wie wild gedrückt.

Auf einmal geht das LED an! :o

Das kann nicht wahr sein: nach ner weile rumprobieren stellt sich
heraus, das diese FB auch RC5 benutzt nur nicht mit standartisierter
Code-Tabelle.

Nunja, hab einfach das Prog immer verändert bis ich alle Codes der
FB-Tasten heraushatte.
Bin bis 50 gekommen (bei 38Tasten).
Nun kann ich doch die FB Taste nehmen die eh am Gerät liegt und muss
nicht noch eine weitere hinlegen, nur um den Motor zu bedienen. puhhh

Damit evtl. andere was von meiner Kenntnis haben hier die Code-Tabelle
für eine RC5 taugliche FB zum Fernseher 16:9 82cm DUAL TV 8204
(Schaulandtmarke).
(N/A = nicht belegt)

RC5-Befehlscode | FB-Taste
0  |  N/A
1  |  (SMART)
2  |  N/A
3  |  N/A
4  |  N/A
5  |  MIX
6  |  P100
7  |  N/A
8  |  DOUB
9  |  N/A
10  |  SUB
11  |  HOLD
12  |  (CONTROLS)
13  |  N/A
14  |  UPDATE
15  |  REV
16  |  0
17  |  1
18  |  2
19  |  3
20  |  4
21  |  5
22  |  6
23  |  7
24  |  8
25  |  9
26  |  -/--
27  |  Programm - (Pfeiltaste runter)
28  |  Programm + (Pfeiltaste hoch)
29  |  N/A
30  |  N/A
31  |  N/A
32  |  PP
33  |  Power
34  |  N/A
35  |  Volume +
36  |  16:9
37  |  Volume -
38  |  SWAP
39  |  o - rot (kleine runde Taste)
40  |  OK
41  |  AV
42  |  MENU
43  |  MUTE
44  |  N/A
45  |  o - grün (kleine runde Taste)
46  |  o - gelb (kleine runde Taste)
47  |  N/A
48  |  o - rosa (kleine runde Taste)
49  |  TV/TX
50  |  o - blau (kleine runde Taste)
Auf meiner HP werd ich das demnächst noch mit nem Bild der FB besser
darstellen.

von LJay (Gast)


Lesenswert?

...eine Frage noch: wie kann ich das ganze per Taster resetten?
Ich hatte z.B. beim testen den Fall, das wohl beide Komandos (auf/zu)
gleichzeitig verarbeitet wurden, was laut code zwar nicht möglich ist,
aber egal..

Ergo: Wenn das Board mal spinnt oder dergleichen, würd ich das gern
über einen taster (ist bereits eingebaut) resetten können.

Jemand ne Idee ob und wie das geht?

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.