'------------------------------------------------------------------------------- 'Projekt: IR Geber Funktionstester mit dem AVR Starterkit ' 'Hardware:Platine und Zubehör und Display. Jumper gemäß Schaltplan. ' auf X13 wird ein SFH5110-36 (IR Empf.IC) oder ähnl. gesteckt. ' Oszi Y1 auf DPort (X20)auf PD4 (6. von links nach rechts) ' Oszi Y2 an X28 (V7)>PhasendecoderImpuls oder (V6) entprelltes Signal. 'Aufgabe :Sämtliche Fernbedienungen mit den unterschiedlichsten Protokollen ' auf Funktion prüfen. Die Ausgabe erfolgt Akustisch und per LCD ' Display sowie über die Serielle Schnittstelle (COM)an einen PC ' 'Hinweis : ' Taste [S] selektiert die Betriebsart mit LED V5. ' V5 aus (Default) ist der Betrieb mit dem selbst entwickelten Decoder. ' V5 an ist der selektive Decoder von BASCOM nur für RC5 Code. ' Taste [R] dient nur einem Hardware Reset. 'NS081115 '------------------------------------------------------------------------------- $regfile = "m16def.dat" 'zu jedem Modell passende Datei '$prog &HFF , &HE4 , &HD9 , &H00 'Setzt Fusbits auf 8MHz int RC Oszil. ' I I I FBX- Fusebit eXtended ' I I FBH- Fusebit High 'JTAG = disabled ' I FB- 'intern RC Oszillator 8 MHz ' LB- LockBit $baud = 38400 'gewünschte Baudrate vorgeben 'DatenDirektionRegister Port B Ddra = &B0000_0011 Porta = &B0010_1100 Ddrb = 255 'alle PortB als Ausgang deklarieren Portb = 0 '255 'alle PullUp ein. Ddrc = &B1111_1111 'das Gleiche mit Port C (Display) Portc = &B0111_0000 'nur andere Schreibweise Ddrd = &B1100_0000 'D4+5 für LCD-LED Beleuchtung Outp. Portd = &B1111_1111 'PD4=H/PD5=L Dim I As Integer 'Variable für intern. Zähler vom Timer Dim D As Integer 'eine Integer- Variable (D) wird 'dimensioniert.Der Inhalt kann nun 'während der Laufzeit verändert werden Dim Prz As Byte 'ProtokollZähler Dim Txt As String * 8 'Stringvariable für Text Dim 3pp As Word 'Global für PulsPause Zeit in mSek Dim Baz As Byte 'BitAnzahl wenn =255 dann kein Signal Dim Bce As Word 'BinärCode des IR Signals Config Rc5 = Pind.4 'BASCOM RC5 Decoder Configurieren '------------------LCD configurieren------------------------------------------ Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , _ Db6 = Portc.6 , Db7 = Portc.7 , E = Portd.6 , Rs = Portd.7 Config Lcd = 16 * 2 Initlcd : Cls : Cursor Off '----------------------------------------------------------------------------- Declare Sub Uirdec(adr As Byte , Bef As Word) 'eigenes Sub deklarieren Enable Interrupts '--------------------------------------------------------------------------- 'hier bekommen die Ports einen selbst ernannten Namen. Meistens aus der 'Zeichnung entnommen dann hat man eine gute Wiedererkennung. S1 Alias Pind.5 'Taste [S] S2 Alias Pind.2 'Taste [2] S3 Alias Pind.3 'Taste [3] 'S4 Alias Pind.4 'Taste [R] (wegen Doppelbelegung) V7 Alias Portb.4 'linke LED der Viererkette V6 Alias Portb.5 '2. LED von links nach rechts V5 Alias Portb.6 '3. LED V4 Alias Portb.7 'rechte LED der Viererkette Ho Alias Portb.0 'Hold für Ein/Aus Mimik Of Alias Portb.1 'Off für Ein/Aus Mimik A0 Alias Porta.0 'SCL zum Testen der TWI-Buchse A1 Alias Porta.1 'SDA zum Testen der TWI-Buchse 'Irs Alias PortB.4 Ire Alias Pind.4 'IR-Empfängerdiode Upperline Lcd "IR Geber Tester " Print "IR Geber Tester " Lowerline Lcd " Nico Schweig " Print "--Nico Schweig--" + Chr(10) Waitms 1000 '----------------------------Hauptroutine------------------------------------ Do 'Betriebsart Entscheidung durch Taste [S] LED V5 zeigt das an. Prz = 0 Select Case V5 Case 0 'Voreingestellt (Default) Call Uirdec(baz , Bce) 'eigener Decoder aufrufen- Case 1 Getrc5(baz , Bce) 'wenn V5 an, dann BASCOM RC5-Decoder Bce = Bce And &B01111111 'filtert TogleBit heraus. End Select 'in BAz steht Geräteadresse(TV/SAT/HiFi) If Baz < 255 Then 'Wenn Decoder anspricht ist BAz < &HFF Incr D 'dann wird eine Ausgabe gemacht Incr Prz Select Case V5 Case 0 Txt = Str(3pp) + " mS" If Baz => 50 And Bce => 99 Then Txt = "DENON" If Baz < 50 And 3pp => 52 Then Txt = "SIRCS" If Baz = 10 And 3pp < 12 Then Txt = "RC5/Moto" If Baz = 11 And 3pp < 12 Then Txt = "RC5/Moto" If Baz = 12 And 3pp < 12 Then Txt = "RC5/Moto" Case 1 Txt = "RC5" End Select 'IF 3PP < 19 then Txt="SIRC" 'IF 3PP > 99 then Txt="DENON" Cls Upperline : Lcd "Code:" ; Txt Lowerline : Lcd Baz ; "Bit/Data" ; Bce Print "Messung: " ; D Print Bin(baz) ; " / " ; Bin(bce) Print Baz ; " Bit/Data: " ; Bce Print "Protokoll: " ; Txt Print Chr(10) End If 'Tasterabfrage mit Entprellung durch "Debounce" Debounce S1 , 0 , Tast1 , Sub 'S1 ["1"] Debounce S2 , 0 , Tast2 , Sub 'S2 ["2"] Debounce S3 , 0 , Tast3 , Sub 'S3 ["3"] Loop '---------------------Ende der Hauptroutine---------------------------------- 'Alles an Programmiercode, was hiernach folgt, sind Nebenroutinen in die der 'Mikrocontroller entweder von sich aus (Interrupt,Timer u.s.w) springt, oder 'durch ein Ereignis (Debounce,Sub- oder Funktion u.s.w) ausgelöst wird. Nach 'der Abarbeitung der Unterroutinen springt der Mikrocontroller immer wieder 'an die Stelle zurück, von der aus er ausgetreten ist. Tast1: V5 = Not V5 Return Tast2: Select Case V5 Case 0 Print "Uni Decoder V0812" Lowerline : Lcd "UniDecoder V0812" Case 1 Print "RC5 Decoder 7.8.1" Lowerline : Lcd "RC5 Decoder7.8.1" End Select Return Tast3: Select Case V5 Case 0 Print "Fernsehzentrale KH" Case 1 Print "Fernsehzentrale KH" End Select Return Sub Uirdec(adr As Byte , Bef As Word) Local 1mz As Word '1. Monostabiler Zähler (Puls/Pausen) Local 3mz As Word , 3su As Word '3.Mono & Summe Taktrate Dim Tar(50)as Word 'Timer Array (Impulsweite) Local Byw As Word 'Bit Wertigkeit Local Bis As Byte 'BiStabiler Schalter f.Entprellung If Ire = 1 Then 'Vorabfrage des IR-Eingangspin Adr = &HFF 'wenn kein Signal ansteht Exit Sub 'sofort wieder beenden. End If Const 1mt = 900 '1.MonoTime für Puls/Pausenerkennung Bis = 0 'Bist.Schalter auf Null=L(IRE)gesperrt 1mz = 0 : 3mz = 0 'alle Zähler zurück setzen Byw = 1 'Niederwertigstes Bit 8192=14Bit(RC5) V7 = 1 'LED7 zu Testzwecken mit Scope 3pp = 0 'Summe Adr = 0 Bef = 0 'ab hier beginnt die eigentliche Routine Do 'System verharrt in Do-Loop Schleife 'bis Until- Bedingung erfüllt 'pro Durchlauf 33µS Incr 1mz 'Puls/Pausenkennung (Monost.Multiv.) Incr 3mz 'Impulsbreitenmessung Select Case Ire 'IR EingangsPin selektieren Case 0 If Bis = 1 Then 'Bistabiler Zustand, verhindert Bis = 0 'mehrfachschalten. 1mz = 0 'Puls/Pausen- Reset V7 = 0 : For I = 1 To 15 : Next I : V7 = 1 'nur zur Indikation für Oszi Incr Adr 'Array-Zähler der Impulse Tar(adr) = 3mz : 3pp = 3pp + 3mz 'Impulsbreite in Array+Summe ermitteln 3mz = 0 'Zähler Reset End If 'Ende der negativen Flanken Steuerung. Case 1 If Bis = 0 Then 'Pos. Flankenschalter. Bis = 1 1mz = 0 'Puls/Pausen- Reset End If 'Ende der pos. Flankensteuerung. End Select Loop Until 1mz => 1mt 'wenn überläuft, dann Ausstieg V7 = 1 : For I = 1 To 35 : Next I : V7 = 0 'nur zur Darstellung der Pausenerkennung 3mz = 3pp / Adr 'arithmetisches Mittel For I = 1 To Adr 'das Array durchlaufen lassen Bis = Adr -i : Bis = Bis + 1 'das letzte Bit war das Niedrigste, If Tar(bis) => 3mz Then Bef = Bef + Byw 'deshalb addieren wir das höchste Bit 'Print I;"/";Bis;"/";ByW 'mit dem niederwertigsten BitWert und Byw = Byw * 2 'multiplizieren immer ein Bit höher. Next I Byw = Byw * 2 : Bef = Bef + Byw 'das hochwertigste Bit zusetzen(immer 1) 3pp = 3pp - 1mt 'ermittelte Zeit noch PP-Zeit abziehen. 3pp = 3pp / 43 'die Anzahl der Takte/ Zeitfaktor 'der empirisch ermittelt wurde und von 'der Taktfrequenz abhängig ist. End Sub End