PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Der universelle IR Fernbedienungs-Empfänger



for_ro
03.10.2007, 20:02
Hallo zusammen,
nachdem hier immer wieder wegen der Infrarot-Fernbedienung gefragt wird, stelle ich mal meinen universellen Empfänger vor.
Das Programm habe ich als Attachment beigefügt und hoffentlich ausreichend kommentiert.
Den Auswertungs-Code für Sony SIRCS habe ich hier auch eingefügt.

Erkannt werden folgende Codes:

Denon
Japan
JVC
NEC
NCR17
RC5
RC6
RCA
RECS80
Sharp
Sharp1
SIRCS
Unbekannt01
Unbekannt02

Ich hoffe, dass das Prinzip klar wird, sodass man sich auch eigene Routinen dazu schreiben kann.




If Flanken_index = 26 And Imp_array(2) < 26 And Imp_array(2) > 22 And Imp_array(3) > 4 And Imp_array(3) < 8 Then '----------------------------------------------------------------Sony
If Print_pc = 1 Then Print #1 , "SIRCS: Start "
I = 4
While I < Flanken_index
Shift Daten , Right
If Imp_array(i) > 4 And Imp_array(i) < 8 Then
nop
Elseif Imp_array(i) > 9 And Imp_array(i) < 14 Then
Daten.31 = 1
Else
Exit While
End If
Incr I
If Imp_array(i) < 5 Or Imp_array(i) > 7 Then
Exit While
End If
Incr I
Incr Bit_count
Wend
If I >= Flanken_index Then
If Imp_array(i) > 9 And Imp_array(i) < 14 Then
Shift Daten , Right
Daten.31 = 1
Incr Bit_count
End If
Shift Daten , Right , 20
Temp_daten = Daten
Befehl = Temp_daten And &B01111111
Shift Temp_daten , Right , 7
Geraet = Temp_daten And &B00011111
If Print_pc = 1 Then Print #1 , ": Gerät=" ; Geraet ; ", Befehl=" ; Befehl ; ", I=" ; I ; ", Flanken_index=" ; Flanken_index ; ", Daten=" ; Bin(daten)
Gosub Clear_scr
Locate 1 , 1 : Lcd "SIRCS "
Locate 2 , 1 : Lcd "Geraet=" ; Geraet ; ", Befehl=" ; Befehl
End If
End If


Hoffentlich können einige von euch etwas damit anfangen.

Gruß

Rolf

Rofo88
03.10.2007, 20:40
Sieht nicht schlecht aus auch wenns etwas groß geraden ist.

Für solche Beispielcodes/Sammlungen gibts auch einen eigenen Bereich auch wenn der nicht sonderlich gut gefüllt ist (Download im oberstem Menü)

-tomas-
07.10.2007, 12:39
zum gleichen Thema siehe auch den RC5-Softcode
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=20209
läuft wie bei Dir als ISR im Hintergrund, Auswertung der Flanken erfolgen jedoch gleich in der ISR (anderes Konzept, Main Loop weniger zeitkritisch)...

-tomas-
08.10.2007, 08:10
wir sollten für unseren IR Fernbedienungs-Empfänger Code auf RN-Wissen https://www.roboternetz.de/wissen/index.php/Kategorie:Quellcode_Bascom eine Seite anlegen - das Thema wird hier öfter angerissen

roboterheld
08.10.2007, 10:50
wir sollten für unseren IR Fernbedienungs-Empfänger Code auf RN-Wissen https://www.roboternetz.de/wissen/in.....ategorie:Quellcode_Bascom eine Seite anlegen - das Thema wird hier öfter angerissen


finde ich auch, gerade weil es um selbsterstellten code geht der das signal zu fuss auswertet ohne die routine von bascom.

for_ro
08.10.2007, 11:33
Für solche Beispielcodes/Sammlungen gibts auch einen eigenen Bereich auch wenn der nicht sonderlich gut gefüllt ist (Download im oberstem Menü)

Ich habe das gleich am Feiertag hier hochgeladen:
https://www.roboternetz.de/phpBB2/dload.php?action=category&cat_id=30
aber es erscheint immer noch nicht.
Keine Ahnung wie man das mal überprüfen kann.

Gruß

Rolf

roboterheld
08.10.2007, 11:42
hallo, habe den bascom-code für mich umgesetzt, einen atmega32 mit 8mhz.

wenn ich die fb-taste 1x drücke erscheint auch der code von der fb.

dann geht es nicht weiter. ich kann die fb-drücken, es tut sich nichts.
bin ich irgendwie aus der schleife rausgeworfen worden.

wer erkennt hier den fehler?



$crystal = 8000000
$regfile = "m32def.dat"
$hwstack = 32
$swstack = 32
$framesize = 64


Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2

Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
Dim Befehl As Word , Geraet As Word , Neg_befehl As Word , Neg_geraet As Word , Nrc17_start As Byte
Dim Daten_pruefung As Byte , Parity As Byte , Hersteller As Word , System As Byte , Produkt As Byte , Modus As Byte
Dim Imp_array(200) As Byte , Daten As Long , Daten1 As Long , Temp_daten As Long , Code_found As Byte
Dim Timer0_startwert As Word , I As Byte
Dim Print_pc As Byte
Dim Zeit As Byte

Zeit = 3
Const Std_pulse = 5
Const Std_pulse_min = Std_pulse - 2
Const Std_pulse_max = Std_pulse + 2

Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Timer0_startwert = 161 'bei mir 16000000/8/(256-56) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs

Config Int0 = Change 'externer interrupt, bei mir Int0 auf portd.2
On Int0 Get_rc_isr
Enable Int0
Ddrd.2 = 0 'ausgang des RC-empfängers
Portd.2 = 1

$baud = 19200 'Vorsicht: Wenn's langsam geht, kann dies die erkannten Flankenzeiten beeinflussen

Print_pc = 1 'auf 1 setzen, um über Print auszugeben

Enable Interrupts

Do
If Code_found = 1 Then 'Jetzt geht es an die Erkennung des Codes
Flanken_index = Flanken_anzahl
Daten = 0
Daten1 = 0
Bit_count = 0
Code_found = 0

'RC5 hat immer gerade Anzahl Flanken, bei mir immer zwischen 16 und 26
'Imp_array(1) enthält die Pause seit dem letzten Befehl, ist also uninteressant
'Imp_array(2) ist das Ende der ersten Start-1
'Imp_array(3) ist der Anfang der zweiten Start-1

If Flanken_index > 15 And Flanken_index < 27 And Flanken_index.0 = 0 And Imp_array(2) > 6 And Imp_array(2) < 11 And Imp_array(3) > 6 And Imp_array(3) < 11 Then
If Print_pc = 1 Then Print "RC5: "
I = 4 ' Imp_array(4) ist das Toggle-bit
Daten.0 = 1
While I < Flanken_index ' Loop bis zur letzten Flanke, immer beim wichtigen Flankenwechsel in der Mitte des Impulses
Shift Daten , Left ' Daten (Ergebnis) nach links schieben, 0 einfügen
Daten.0 = Daten.1 ' Das letzte Bit wie das vorletzte setzen
If Imp_array(i) > 6 And Imp_array(i) < 11 Then ' kurzer Impuls (also kein Wechsel 0->0 oder 1->1)
Incr I ' nächste Flanke
If Imp_array(i) < 7 Or Imp_array(i) > 10 Then ' kein kurzer Impuls => Fehler (wenn in der Mitte ein kurzer war, dann muss noch ein kurzer kommen)
Exit While ' Abbruch
End If
Elseif Imp_array(i) < 19 And Imp_array(i) > 15 Then 'langer Impuls (also Wechsel 1->0 oder 0->1)
Toggle Daten.0 ' also letztes bit umschalten
Else
Exit While ' sonst Abbruch
End If
Incr I ' nächste Flanke
Incr Bit_count ' zählt die Anzahl der korrekt gelesenen Bits
Wend
If I >= Flanken_index Then 'Wenn kein Abbruch
If Imp_array(i) < 19 And Imp_array(i) > 15 Then 'Falls am Ende noch ein bit-Wechsel 1->0 kommt
Shift Daten , Left 'Daten (Ergebnis) nach links schieben, 0 einfügen
Incr Bit_count
End If
Temp_daten = Daten 'Daten zwischenspeichern
Befehl = Temp_daten And &B00111111 'Befehl sind die letzten 6 bits
Shift Temp_daten , Right , 6 'Befehls-bits rausshiften
Geraet = Temp_daten And &B00011111 'Gerät sind die ersten 5 bits
If Print_pc = 1 Then Print ": Ger=" ; Geraet ; ", Bef=" ; Befehl
Cls
Locate 1 , 1 : Lcd "RC5"
Locate 2 , 1 : Lcd "Ger=" ; Geraet ; ", Bef=" ; Befehl
End If
End If

End If
Loop

End

Tim0_isr:
Timer0 = Timer0_startwert
Incr Impuls_laenge 'bei jedem Überlauf um 1 erhöhen
If Impuls_laenge = 200 Then 'Kein Impuls für 20ms und in Get_rc_isr schon mindestens 14 Flanken gespeichert
If Flanken_anzahl > 13 Then
Code_found = 1 'Auswertung im Hauptprogramm starten
End If
End If
Return

Get_rc_isr:
If Impuls_laenge > 0 Then
Incr Flanken_anzahl
If Flanken_anzahl > 200 Then Flanken_anzahl = 200
If Impuls_laenge > 255 Then Impuls_laenge = 255
Imp_array(flanken_anzahl) = Impuls_laenge
Impuls_laenge = 0
End If
Return

for_ro
08.10.2007, 13:13
So auf den ersten Blick sehe ich nur, dass du die Variable Flanken_anzahl nicht zurücksetzt.
Also am Ende von

If Code = 1 Then
...
Flanken_anzahl=0
End If

Sonst hängt er immer hinten dran.

Gruß

Rolf

misch
05.05.2009, 22:44
Hallo For_ro,
Habe versucht den code für ein AtMega 8 mit 8MHz anzupassen leider ohne Erfolg.
Ich habe eine RC5 FB und eine Sony
ist es Möglich hierzu Hilfe zu bekommen ?

Danke & Gruß
Michael

for_ro
06.05.2009, 16:09
Hallo For_ro,
Habe versucht den code für ein AtMega 8 mit 8MHz anzupassen leider ohne Erfolg.
Ich habe eine RC5 FB und eine Sony
ist es Möglich hierzu Hilfe zu bekommen ?

Danke & Gruß
Michael
Hallo,
es ist immer möglich, Hilfe zu bekommen, aber ein paar Angaben wären hilfreich.
Wie sieht dein Code aus und was funktioniert nicht?

Gruß

Rolf

misch
06.05.2009, 21:06
Hallo Rolf,
Danke das Du mir helfen möchtest!

Der code für RC5 lässt sich fehlerfrei compilieren läuft aber nicht !
sobald ich den Sony code inzufüge lässt sich das Programm nicht kompilieren
es rescheinen folgende Fehlermeldungen


Error 211 in line 208 external routine not found
Error 61 in line 208 label not found

Hier mein verwendeter code.
Gruß
Michael

for_ro
06.05.2009, 21:33
Sorry, in meinem M128 hatte ich den zweiten USART benutzt, daher die
Print #1, ...
Die müssen bei deinem M8 raus. Habe dir mal so eine Version angehängt.
Probier es mal aus.

Gruß

Rolf

for_ro
06.05.2009, 22:06
Du musst unten noch das
Gosub Clear_scr durch ein einfaches
Cls
ersetzen, da du ein anderes LCD benutzt.

Außerdem denke ich, dass du den Timer_startwert etwa auf 156 erhöhen solltest, damit der Timer ungefähr im 10KHz Takt überläuft.

Gruß

Rolf

misch
06.05.2009, 23:37
Hallo Rolf,
Vielen vielen .......Dank !!! Funktioniert !!
Sony OK
Philips OK aber nicht alle Tasten warum ?
mit dem Getrc5(adress , Command) funktionieren alle Taten auf der FB
mit deiner routine geht der Code 107.. 110 ( rot grün gelb blau )
und 80...87 Pfeiltasten nicht .. schade denn genau die wolte ich verwenden.

Gruß
Michael

for_ro
07.05.2009, 00:01
Das liegt wohl daran, dass deine FB den extended-RC5 Code sendet. Den habe ich damals nicht mit rein programmiert. Normaler RC5 geht für die Befehle nur von 0-63.
Ich kann mir das am Wochenende mal ansehen, ob ich das auf die Schnelle noch hinkriege.

Gruß

Rolf

for_ro
07.05.2009, 23:49
Hallo Michael,
tatsächlich sind nur zwei kleine Änderungen nötig.
Hier habe ich dir mal die neue Version für RC5 gemacht:

If Flanken_index > 15 And Flanken_index < 27 Then '!!!! geändert
Locate 1 , 1
If Print_pc = 1 Then Print "RC5: "
I = 2 '!!!! geändert Imp_array(4) ist das Toggle-bit
Daten.0 = 1
While I < Flanken_index ' Loop bis zur letzten Flanke, immer beim wichtigen Flankenwechsel in der Mitte des Impulses
Shift Daten , Left ' Daten (Ergebnis) nach links schieben, 0 einfügen
Daten.0 = Daten.1 ' Das letzte Bit wie das vorletzte setzen
If Imp_array(i) > 6 And Imp_array(i) < 11 Then ' kurzer Impuls (also kein Wechsel 0->0 oder 1->1)
Incr I ' nächste Flanke
If Imp_array(i) < 7 Or Imp_array(i) > 10 Then ' kein kurzer Impuls => Fehler (wenn in der Mitte ein kurzer war, dann muss noch ein kurzer kommen)
Exit While ' Abbruch
End If
Elseif Imp_array(i) < 19 And Imp_array(i) > 15 Then 'langer Impuls (also Wechsel 1->0 oder 0->1)
Toggle Daten.0 ' also letztes bit umschalten
Else
Exit While ' sonst Abbruch
End If
Incr I ' nächste Flanke
Incr Bit_count ' zählt die Anzahl der korrekt gelesenen Bits
Wend
If I >= Flanken_index Then 'Wenn kein Abbruch
If Imp_array(i) < 19 And Imp_array(i) > 15 Then 'Falls am Ende noch ein bit-Wechsel 1->0 kommt
Shift Daten , Left 'Daten (Ergebnis) nach links schieben, 0 einfügen
Incr Bit_count
End If
Temp_daten = Daten 'Daten zwischenspeichern
Befehl = Temp_daten And &B00111111 'Befehl sind die letzten 6 bits
Shift Temp_daten , Right , 6 'Befehls-bits rausshiften
Geraet = Temp_daten And &B00011111 'Gerät sind die ersten 5 bits
If Temp_daten.6 = 0 Then '!!!! neu
Befehl = Befehl + 64 '!!!! neu
End If '!!!! neu
If Print_pc = 1 Then Print ": Ger=" ; Geraet ; ", Bef=" ; Befehl
Cls
Locate 1 , 1 : Lcd "RC5"
Locate 2 , 1 : Lcd "Ger=" ; Geraet ; ", Bef=" ; Befehl
End If
End If


Gruß

Rolf

misch
08.05.2009, 22:12
Hallo Rolf,

100% Super läuft.
Vielen herzlichen Dank für deine Mühe !!

Gruß
Michael

LIGHT_MASTER
16.05.2009, 23:35
Hallo...

Ich bin neu hier und hab versucht den tester nach zu bauen.. allerdings ohne erfolg...

Könnt ihr mir vielleicht sagen was ich falsch mache??!!

Danke Schon mal im vorraus...
Gruß Flo


' '************************************************* *****************************
'
' AT Mega 8535 & LCD 16*2 Anschluß & TSOP 1736
'
'------ Standard-Init von BASCOM ------------------------------

$regfile = "m8535.dat"
$crystal = 8000000
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 ' default use 32 for the SW stack
$framesize = 100 ' default use 40 for the frame space

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.6 , Rs = Porta.7
Config Lcd = 16 * 2

Cls

Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
Dim Befehl As Word , Geraet As Word , Neg_befehl As Word , Neg_geraet As Word , Nrc17_start As Byte
Dim Daten_pruefung As Byte , Parity As Byte , Hersteller As Word , System As Byte , Produkt As Byte , Modus As Byte
Dim Imp_array(200) As Byte , Daten As Long , Daten1 As Long , Temp_daten As Long , Code_found As Byte
Dim Timer0_startwert As Word , I As Byte
Dim Print_pc As Byte
Dim Zeit As Byte

Zeit = 3
Const Std_pulse = 5
Const Std_pulse_min = Std_pulse - 2
Const Std_pulse_max = Std_pulse + 2

Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Timer0_startwert = 78 '161 'bei mir 16000000/8/(256-56) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs

Config Int0 = Change 'externer interrupt, bei mir Int0 auf portd.2
On Int0 Get_rc_isr
Enable Int0
Ddrd.2 = 0 'ausgang des RC-empfängers
Portd.2 = 1

$baud = 19200 'Vorsicht: Wenn's langsam geht, kann dies die erkannten Flankenzeiten beeinflussen

Print_pc = 0 'auf 1 setzen, um über Print auszugeben

Enable Interrupts

Do
If Code_found = 1 Then 'Jetzt geht es an die Erkennung des Codes
Flanken_index = Flanken_anzahl
Daten = 0
Daten1 = 0
Bit_count = 0
Code_found = 0

'RC5 hat immer gerade Anzahl Flanken, bei mir immer zwischen 16 und 26
'Imp_array(1) enthält die Pause seit dem letzten Befehl, ist also uninteressant
'Imp_array(2) ist das Ende der ersten Start-1
'Imp_array(3) ist der Anfang der zweiten Start-1

If Flanken_index > 15 And Flanken_index < 27 And Flanken_index.0 = 0 And Imp_array(2) > 6 And Imp_array(2) < 11 And Imp_array(3) > 6 And Imp_array(3) < 11 Then
Locate 1 , 1
If Print_pc = 1 Then Print "RC5: "
I = 4 ' Imp_array(4) ist das Toggle-bit
Daten.0 = 1
While I < Flanken_index ' Loop bis zur letzten Flanke, immer beim wichtigen Flankenwechsel in der Mitte des Impulses
Shift Daten , Left ' Daten (Ergebnis) nach links schieben, 0 einfügen
Daten.0 = Daten.1 ' Das letzte Bit wie das vorletzte setzen
If Imp_array(i) > 6 And Imp_array(i) < 11 Then ' kurzer Impuls (also kein Wechsel 0->0 oder 1->1)
Incr I ' nächste Flanke
If Imp_array(i) < 7 Or Imp_array(i) > 10 Then ' kein kurzer Impuls => Fehler (wenn in der Mitte ein kurzer war, dann muss noch ein kurzer kommen)
Exit While ' Abbruch
End If
Elseif Imp_array(i) < 19 And Imp_array(i) > 15 Then 'langer Impuls (also Wechsel 1->0 oder 0->1)
Toggle Daten.0 ' also letztes bit umschalten
Else
Exit While ' sonst Abbruch
End If
Incr I ' nächste Flanke
Incr Bit_count ' zählt die Anzahl der korrekt gelesenen Bits
Wend
If I >= Flanken_index Then 'Wenn kein Abbruch
If Imp_array(i) < 19 And Imp_array(i) > 15 Then 'Falls am Ende noch ein bit-Wechsel 1->0 kommt
Shift Daten , Left 'Daten (Ergebnis) nach links schieben, 0 einfügen
Incr Bit_count
End If
Temp_daten = Daten 'Daten zwischenspeichern
Befehl = Temp_daten And &B00111111 'Befehl sind die letzten 6 bits
Shift Temp_daten , Right , 6 'Befehls-bits rausshiften
Geraet = Temp_daten And &B00011111 'Gerät sind die ersten 5 bits
If Print_pc = 1 Then Print ": Ger=" ; Geraet ; ", Bef=" ; Befehl
Cls
Locate 1 , 1 : Lcd "RC5"
Locate 2 , 1 : Lcd "Ger=" ; Geraet ; ", Bef=" ; Befehl
End If
End If
Flanken_index = 0
Flanken_anzahl = 0
Impuls_laenge = 0
End If

'-------------------------------------------------------------------------------------------------------------------------------------------
'SIRCS
'26, 255 23 6 6 5 6 6 5 6 6 6 5 6 6 6 5 6 12 5 6 6 6 5 6 6 11
' (0) (0) (0) (0) (0) (0) (0) (1) (0) (0) (0) (1)
' (Startbit) (L BEFEHL M) (L ADRESSE M)
'----------------------------------------------------------------Sony
If Flanken_index = 26 And Imp_array(2) < 26 And Imp_array(2) > 22 And Imp_array(3) > 4 And Imp_array(3) < 8 Then
If Print_pc = 1 Then Print "SIRCS: Start "
I = 4
While I < Flanken_index
Shift Daten , Right
If Imp_array(i) > 4 And Imp_array(i) < 8 Then
nop
Elseif Imp_array(i) > 9 And Imp_array(i) < 14 Then
Daten.31 = 1
Else
Exit While
End If
Incr I
If Imp_array(i) < 5 Or Imp_array(i) > 7 Then
Exit While
End If
Incr I
Incr Bit_count
Wend
If I >= Flanken_index Then
If Imp_array(i) > 9 And Imp_array(i) < 14 Then
Shift Daten , Right
Daten.31 = 1
Incr Bit_count
End If
Shift Daten , Right , 20
Temp_daten = Daten
Befehl = Temp_daten And &B01111111
Shift Temp_daten , Right , 7
Geraet = Temp_daten And &B00011111
If Print_pc = 1 Then Print ": Gerät=" ; Geraet ; ", Befehl=" ; Befehl ; ", I=" ; I ; ", Flanken_index=" ; Flanken_index ; ", Daten=" ; Bin(daten)
Cls
Locate 1 , 1 : Lcd "SIRCS"
Locate 2 , 1 : Lcd "Geraet=" ; Geraet ; ", Befehl=" ; Befehl
End If
Flanken_index = 0
Flanken_anzahl = 0
Impuls_laenge = 0
End If
'-------------------------


Loop

End

Tim0_isr:
Timer0 = Timer0_startwert
Incr Impuls_laenge 'bei jedem Überlauf um 1 erhöhen
If Impuls_laenge = 200 Then 'Kein Impuls für 20ms und in Get_rc_isr schon mindestens 14 Flanken gespeichert
If Flanken_anzahl > 13 Then
Code_found = 1 'Auswertung im Hauptprogramm starten
End If
End If
Return

Get_rc_isr:
If Impuls_laenge > 0 Then
Incr Flanken_anzahl
If Flanken_anzahl > 200 Then Flanken_anzahl = 200
If Impuls_laenge > 255 Then Impuls_laenge = 255
Imp_array(flanken_anzahl) = Impuls_laenge
Impuls_laenge = 0
End If
Return

for_ro
17.05.2009, 01:39
Bist du denn sicher, dass deine Fernbedienung RC5 oder SIRCS sendet?
Außerdem denke ich, dass du den Startwert des Timer0 auf etwas in Richtung 160 ändern solltest.

Gruß

Rolf

LIGHT_MASTER
17.05.2009, 01:50
Hallo Rolf...

Danke für deine antwort...

Ja.. Ich bin mir ganz sicher das sie RC5 Senden da ich sie selber gebaut und programmiert habe....

Und mit dem Befehl GetRC5 kann ich sie auch abfragen....

Den Startwert hab ich auf 160 gestellt aber es geht immer noch nicht... das LCD zeigt mir nichts an....

Ich würde es ausserdem gerne auf einem MEGA 8535 laufen lassen wenn das ginge...


Ach ja... welcher Code ist jetzt eigentlich "nur" für RC5 und welcher ist universal??

Ich bräuchte den universalen wenns geht :-)

Danke schon mal im vorraus....

Gruß Flo

for_ro
17.05.2009, 02:03
Im ersten Post ist das Programm für die dort angegebenen IR-Codes.
Dort sind immer Blöcke enthalten, die jeweils einen bestimmten Code entschlüsseln. In deinem Programm waren nur die Blöcke für RC5 und SIRCS enthalten.
Wenn es gar nicht funktioniert, kannst du mal testweise diese Zeilen

If Code_found = 1 And Flanken_anzahl > 0 Then
Disable Int0
Cls
Lcd Flanken_anzahl ; ":" 'Jetzt geht es an die Erkennung des Codes
For I = 1 To Flanken_anzahl
Lcd Imp_array(i) ; " "
Next I
anstelle der Zeile
If Code_found = 1 Then 'Jetzt geht es an die Erkennung des Codes
direkt hinter dem Do ein.
Sollte dir auf dem LCD die Anzahl der Flanken und die Längen ausgeben.

Gruß

Rolf

LIGHT_MASTER
17.05.2009, 02:14
Hallo Rolf...

Für mich sind nur Unbekannt 1, unbekannt 2 und japan interessant....

könntest du mir vielleicht helfen das ich das auf einem Mega8 mit 2*16 LCD bei 8 MHz zum laufen kriege??

gruß Flo

for_ro
17.05.2009, 09:41
Für mich sind nur Unbekannt 1, unbekannt 2 und japan interessant....

Woher weißt du das?
Hast du die Zeilen mal eingebaut und eine Ausgabe bekommen?

Gruß

Rolf

LIGHT_MASTER
17.05.2009, 13:58
Hallo Rolf...

Nun ja... wissen tu ich es nicht genau aber da die Fernbedieung aus einer LED steuerung stammt die zu 100% in fernost gerfertigt worden ist, kann man denke ich davon ausgehen das UNBEKANNT1, UNBEKANNT2 und JAPAN die wohl am naheliegendsten codes sind...


Gruß Flo

for_ro
17.05.2009, 14:21
Bleibt noch die Antwort auf meine zweite Frage:
Hast du die Zeilen mal eingebaut und bekommst du eine Ausgabe?
Kannst du Ausgabe auch zum PC schicken oder nur auf dein kleines LCD ausgeben?

Gruß

Rolf

LIGHT_MASTER
17.05.2009, 14:23
Ausgabe krieg ich gar keine.... weder auf dem PC noch auf dem LCD

Gruß Flo

for_ro
17.05.2009, 15:01
dann probier mal diese vereinfachte Version:


' '************************************************* *****************************
'
' AT Mega 8535 & LCD 16*2 Anschluß & TSOP 1736
'
'------ Standard-Init von BASCOM ------------------------------

$regfile = "m8535.dat"
$crystal = 8000000
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 ' default use 32 for the SW stack
$framesize = 100 ' default use 40 for the frame space

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.6 , Rs = Porta.7
Config Lcd = 16 * 2

Cls

Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
Dim Befehl As Word , Geraet As Word , Neg_befehl As Word , Neg_geraet As Word , Nrc17_start As Byte
Dim Daten_pruefung As Byte , Parity As Byte , Hersteller As Word , System As Byte , Produkt As Byte , Modus As Byte
Dim Imp_array(200) As Byte , Daten As Long , Daten1 As Long , Temp_daten As Long , Code_found As Byte
Dim Timer0_startwert As Word , I As Byte
Dim Print_pc As Byte
Dim Zeit As Byte

Zeit = 3
Const Std_pulse = 5
Const Std_pulse_min = Std_pulse - 2
Const Std_pulse_max = Std_pulse + 2

Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Timer0_startwert = 78 '161 'bei mir 16000000/8/(256-56) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs

Config Int0 = Change 'externer interrupt, bei mir Int0 auf portd.2
On Int0 Get_rc_isr
Enable Int0
Ddrd.2 = 0 'ausgang des RC-empfängers
Portd.2 = 1

$baud = 19200 'Vorsicht: Wenn's langsam geht, kann dies die erkannten Flankenzeiten beeinflussen

Print_pc = 0 'auf 1 setzen, um über Print auszugeben

Enable Interrupts

Do
If Code_found = 1 Then 'Jetzt geht es an die Erkennung des Codes
Flanken_index = Flanken_anzahl
Daten = 0
Daten1 = 0
Bit_count = 0
Code_found = 0
Print Flanken_anzahl ; ":" 'Jetzt geht es an die Erkennung des Codes
For I = 1 To Flanken_anzahl
Print Imp_array(i) ; " "
Next I
End If
'RC5 hat immer gerade Anzahl Flanken, bei mir immer zwischen 16 und 26
'Imp_array(1) enthält die Pause seit dem letzten Befehl, ist also uninteressant
'Imp_array(2) ist das Ende der ersten Start-1
'Imp_array(3) ist der Anfang der zweiten Start-1


'-------------------------


Loop

End

Tim0_isr:
Timer0 = Timer0_startwert
Incr Impuls_laenge 'bei jedem Überlauf um 1 erhöhen
If Impuls_laenge = 200 Then 'Kein Impuls für 20ms und in Get_rc_isr schon mindestens 14 Flanken gespeichert
Code_found = 1 'Auswertung im Hauptprogramm starten
End If
Return

Get_rc_isr:
If Impuls_laenge > 0 Then
Incr Flanken_anzahl
If Flanken_anzahl > 200 Then Flanken_anzahl = 200
If Impuls_laenge > 255 Then Impuls_laenge = 255
Imp_array(flanken_anzahl) = Impuls_laenge
Impuls_laenge = 0
End If
Return

LIGHT_MASTER
17.05.2009, 15:06
Geht auch nicht

for_ro
17.05.2009, 15:28
Überprüf mal deine Hardware.

Gruß

Rolf

Bumbum
21.03.2011, 13:06
Hallo,

welchen Empfänger würdet ihr denn empfehlen? Da gibt es ja (soweit ich weiß) verschiedene. Ich würde gerne eine Schaltung per Fernbedienung steuern. (Normale Universal-Fernbedienung für Hifi/TV). Welchen Empfänger kann ich nehmen?

Ein Tipp bei Reichelt wäre gut, denn da kommt auch der ganze Rest her. Danke!

Viele Grüße
Andreas

Ripper121
29.03.2011, 17:06
Was für hardware wird verwendet (Schaltbild)?
Kannst du es so programmieren damit man den code aufnehmen kann egal was für eine fernbedienung es ist... oder die zeiten von High-Low pegeln ausgeben lassen?

oberallgeier
29.03.2011, 17:36
Hi Andreas,


... welchen Empfänger würdet ihr denn empfehlen ... Schaltung per Fernbedienung ... Reichelt ...der SFH5110-36 ist z.B. beim asuro eingebaut. Ich habe drei davon für die Hinderniserkennung in meinem MiniD0 (https://www.roboternetz.de/community/showthread.php?36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01&p=478095&viewfull=1#post478095) - die nutze ich zwischendurch auch zu einer Art Menuesteuerung per IR. Fernbedienung ist bei mir eine alte übriggebliebene mit RC-5-Code. Das MiniD0 liest mir die gesendeten Codes und bei passender Anwahl wird ein bestimmter Menueteil ausgeführt. Siehe Funktion hier (klick). (https://www.roboternetz.de/community/showthread.php?36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01&p=503279&viewfull=1#post503279)

Der SFH~36 läuft mit 36 kHz Modulation und entspricht daher den Daten der üblichen IR-Fernsteuerungen. Ausserdem darf der SFH~ im Gegensatz zu den TSOP´s mit Dauersignal beaufschlagt werden, das erspart (mir jedenfalls) ein klein bisschen Aufwand beim Signalgeber - für ne IR-Fernsteuerung dürfte das aber keine Rolle spielen. Beim "R" gibts den SFH~36 und auch einen 36 kHz-Tsop. Mit letzterem habe ich keinerlei Erfahrung.

Bumbum
29.03.2011, 18:25
Hallo,

irgendwie ist meine Antwort jetzt gerade verschwunden... Ich versuche es nochmal:

@Ripper: Die Hardware steht noch nicht fest, bzw. ist noch in Planung. Als µC verwende ich einen Atmel, vorraussichtlich den AtMega162. Programmiert wird dieser dann in C. Ich bin also recht flexibel bezüglich deinen Fragen.

@Oberallgeier: Ich könnte dann also den SFH5110-36 vom "R" nehmen? Benötige ich dann noch "Zubehör"? z.B. ein Filterglas o.ä.?

Viele Grüße
Andreas

oberallgeier
29.03.2011, 19:59
... Ich könnte dann also den SFH5110-36 vom "R" nehmen? ... "Zubehör ...Ein Filter ist nicht notwendig, das erledigt die Modulation. Die Schaltung dazu gibt es hier (http://oberallgeier.ob.funpic.de/m168d-schaltung-x97.pdf)(musst halt eins von den drei Dingern rauspulen).

tv-schrauber
30.08.2015, 11:18
Hallo for_ro,
ich versuche ,die von dir erstellte Bascm-Routine für die Erkennung des NEC-Code zum Laufen zu bringen.
Wenn ich die Tasten der NEC-FB betätige dann wird mir der korrekte Code bei 2-,3- manchmal auch bei 4 Betätigungen
der FB angezeigt. Dann geht es nicht weiter, so als ob das Programm hängt. Drücke ich dann eine Taste einer RC5-FB
dann kann ich wieder 2 o. 3 Befehle der NEC-FB auslesen. Könntest du mal über den Code schauen ob ich etwas falsch
gemacht habe. Für was wird die Variable "Zeit" benutzt. Im Code wird sie nur immer um "1" erhöht aber nicht weiter damit
gearbeitet. Die LED1 benutze ich als Kontrolle ob das Programm ein "Lebenszeichen" von sich gibt. Die Print-Ausgabe
benötige ich nicht. Ich habe den Code hier im Text eingefügt, da ich nicht weiß wie man das mit dem Sroll-Fenster macht.
Ich danke dir im Vorraus.
Helmut