Hoi,

Ik ben van plan om een interpreter programma te schrijven voor een IR ontvanger.

opstelling: afstandsbediening panasonic VEQ2213 -------> tsop1736 -----> PIC16F628

Nu is het probleem dat ik niet echt weet welk protocol deze afstandsbediening gebruikt.

Ik vermoed dit protocol, ik weet wel niet meer vanwaar ik het heb, was zo een site met hele lijst van ir codes van alle merken:

T = 400µs tot 450µs
header: 10T hoog, 4T laag
32 bits group
16 bits data

0 = 1T hoog, 1T laag
1 = 1T hoog, 3T laag
afsluitbit = 1T hoog

zoiets dus: http://www.geocities.com/SiliconValley/Lakes/3947/TECHNICS.HTML

De group en data komt overeen met een lib file van een afstandsbediening met gelijkaardige versie: http://lirc.sourceforge.net/remotes/panasonic/VEQ2249

Maar volgens deze site ziet het er zo uit: http://users.telenet.be/davshomepage/panacode.htm

Of wordt dat protocol niet meer gebruikt?

Iemand die weet welk ir protocol en ir codes gebruikt worden voor een panasonic VEQ2213 afstandsbediening?

Stel dat het het protocol is dat ik hierboven heb beschreven is dit een juiste/goede/efficiënte manier van ontcijferen met een µC ?

signaal aanleggen op een interruptpoort = RB0/INT
1) zodra RB0/INT laag wordt => interrupt service routine
2) stel timer0 in en begin met tellen
3) polling tot RB0 hoog wordt
4) sla waarde van de timer op in een register, r0
5) clear timer0 en begin met tellen
6) polling tot RB0 laag wordt
7) sla waarde van de timer op in register r1
8) controleer of r0 ongeveer 10T is en r1 ongeveer 4T is, indien zo is dit de header en kunnen we verder gaan
---
nu de bits inlezen en ontcijferen
9) timer0 clearen en begin met tellen
10) polling tot RB0 hoog wordt
11) sla waarde van de timer op in register, r0
12) timer0 clearen en begin met tellen
13) polling tot RB0 laag wordt
14) sla waarde van de timer op in register, r1
15) bepalen aan de hand van de waarde in r0 en r1 of het een 0 of 1 is en deze bit opslaan in het gepaste register
16) ga terug naar 9, dit blijft zo tot timer0 een interrupt geeft (overflow) = einde code

Alvast bedankt.

Met vriendelijke groeten.

Ben al wat begonnen met programmeren, eerste keer dat ik een PIC gebruik.

target: PIC16F628

Nu wil ik een externe klok gebruiken en ik lees in de datasheet het volgende:

The configuration bits can be programmed (read as ’0’)
or left unprogrammed (read as ’1’) to select various
device configurations. These bits are mapped in
program memory location 2007h.
The user will note that address 2007h is beyond
the user program memory space. In fact, it belongs
to the special configuration memory space (2000h
– 3FFFh), which can be accessed only during programming.

bit 4,1-0:FOSC2:FOSC0: Oscillator Selection bits(4)

001 = XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN

Stel ik dit dan zo in?
bsf 2007h,0
bcf 2007h,1
bcf 2007h,4

en stel dat ik bv bit13 wil instellen is dit dan ook zo: bcf/bsf 2007h,13

greets

Die bits moet je in je config aangeven.
Dat kun je niet in je code doen.

Kijk even naar de template voor de 16F628.
Die staat op de Microchip site.

In een van de eerste regels staat zoiets:

__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _INTOSCIO & _BOR_ON

In feite staat het er al:

"The user will note that address 2007h is beyond
the user program memory space. In fact, it belongs
to the special configuration memory space (2000h
– 3FFFh), which can be accessed only during programming."

Je kunt het dus alleen bij het programmeren wijzigen.

Je kunt het instellen in je programmer software (MPLAB) of met de __CONFIG instructie.

Op deze site kun je heel veel vinden over remote controls. Er staat ook heel goed op welke codes apparaten gebruiken vooral bij de oudere Pronto's...
http://www.remotecentral.com/

Bedankt, ik heb die configuration bits gevonden.

Heb wel probleempje nu, ik wou al even de frequentie van mijn kristal testen (20MHz)

Maar als ik met de scoop kijk op een uitgang meet ik niets, heb toen in de main code erbij gezet dat ie 2 ledjes moet doen branden PORTA.0 en PORTA.1 om te kijken of hij daar wel zit, maar PORTA.0 en PORTA.1 worden ook niet hoog.

*EDIT*
nevermind, was vergeten de \MCLR aan te sluiten :D

[Bericht gewijzigd door petzer op (82%)]

Ik heb met een digitale scoop kunnen na gaan hoe het protocol eruit ziet.

Let wel dit is de ontvangstzijde:

|header|group(32bits)|data(16bits)|

header:

3.7ms ______
__________|1.72ms|

0:
T ___
___| T

1:
T ______
___| T'

420µs < T < 460µs
1.26ms < T' < 1.38ms

Hmm wordt blijkbaar niet goed weergegeven, nuja het is hetzelfde als andere protocols enkel de pulslengte is verschillend.

Nu ik wil eerst bepalen of de header correct is, ik doe dit zo:

kristal van 4MHz
=> 1 cycle = 1µs
interrupt op de eerste dalende flank
TMR0 clearen en laten tellen tot de input weer hoog is
Ik gebruik als klok voor TMR0 de interne klok (kristal 4MHz) en stel de prescaler in op 32.

Dan telt TMR0 er toch eentje bij om de 32µs?
Dan controleer ik of 3.6ms < T_laag < 3.8ms
Dus door te kijken of 112 =< TMR0 =< 119

En als het niet ertussen ligt => error => ledje doen branden.

Nu geeft ie altijd een error, terwijl ik zeker weet dat T_laag 3.7ms is.
Heb ik een redeneringsfout in mijn timer0 instelling?

Greets

Kan iemand met het volgende helpen?

Ik wil een puls meten en controleren of die tussen 3.5ms en de 4.3ms ligt.

Ik leg een lage puls aan van 3.7ms (ik weet zeker dat deze 3.7ms bedraagt), ik genereer een interrupt, clear mijn timer0 zodat ie opnieuw begint te tellen, ik wacht tot de puls hoog is, als deze hoog is sla ik de waarde van timer0 op en controleer of deze tussen 98 en 120 ligt.

Ik verwacht 103 in TMR0, want prescaler = 32 en de klok is 4MHz.
=> 4Mhz/4 => 1µs => 32µs, maar dit wijkt iets af want ik meet 36µs dus 3.7ms / 36µs = 103

Kan er iemand mijn code controleren? (best met MPLAB openen: http://users.telenet.be/petitke/IR/ir.asm )
Want hij zegt altijd dat het er niet tussen ligt (er gaat immers een "error" led branden)

Waarschijnlijk tel je de overhead van het reloaden van timer0 niet mee. (Deze hangt af van de gebruikte code)
Is timer2 niet veel handiger hiervoor? Die heeft een auto-reload...

"If Timer0 is
written, the increment is inhibited for the following two
cycles"

ik gebruik clrf TMR0 en heb een foutmarge van 2 tellen ingerekend, zelfs méér dan dat.

dan doe ik:
movf TMR0,W ; dit zou normaal geen overhead mogen veroorzaken

Zou het dan aan de manier liggen waarop ik bepaal of het tussen 98 en 120 ligt?

Ik gebruik subwf f,W
in W zit 98 en in f zit dan de waarde van tmr0 op dat ene moment.
Ik weet dat de bewerking via 2s-complement gebeurt, ik heb daarom de prescaler ingesteld op 32 zodat hij na het volledig inlezen van de puls nooit meer kan geven dan 120.
dus:
movlw d'98'
subwf f,W ; f - 98 en resultaat terug naar W
=> ligt f eronder dan heb ik een negatief getal en wordt de C = 0 dus ik check de C
btfss STATUS,C
goto error
doe zo verder ...

dus in W zit dan (f - 98)
en doe ik:
sublw d'22' ; 22 - (f - 98) | (120-98=22)
btfss STATUS,C
goto error
doe zo verder ... als ik hier geraak wilt t zeggen dat 98 =< TMR0 =< 120