Ik ben opzoek naar ASM Code t.b.v. een PIC, waarmee ik de code verkrijg van het ontvangen IR RC5 signaal.

Ik heb natuurlijk al gezocht, en heb ook al van alles gevonden.
Maar helaas, of mijn 'MPASM' Compiler kan er geen wijs uit, of de code zit in een compleet programma verwezen.

Alvast bedankt.

En de code die je had van San Bergmans, http://www.xs4all.nl/~sbp/projects/ircontrol/picir/rc5.htm
is de meest uitgebreide die ik ooit ben tegengekomen. Paginas met uitleg en eenvoudig om te zetten naar MPASM en eventueel naar een andere PIC zoals de 627.

Ik ben er denk ik een half uur mee bezig geweest. Later heb ik de state machine aangepast om hem in de background (in een interrupt routine) te draaien voor een 8 kanaals LED-dimmer met afstandsbediening, dus aan die code heb je ook niks.

Ik zou zeggen: leer programmeren op die PIC (knipperledje, iets met een schakelaar,...) en kijk dan nog eens naar die code. Verwacht je dat wij hier een .HEX file voor jouw toepassing posten ?

Op 24 oktober 2005 20:47:13 schreef JoWi:
Ik ben er denk ik een half uur mee bezig geweest.

Fijn dat JIJ zo goed bent... :)

Ik ben er al vele uren mee bezig, en het enige wat ik zie zijn fout meldingen...

Ik zou zeggen: leer programmeren op die PIC (knipperledje, iets met een schakelaar,...) en kijk dan nog eens naar die code.

Daar ben ik natuurlijk mee begonnen, en dat lukt allemaal...

Verwacht je dat wij hier een .HEX file voor jouw toepassing posten ?

Ik hoopte op een stukje code waarin de toets code wordt gedecodeerd.
En ik heb liever een stuk .ASM dan .HEX :)

Bedankt, dat ziet er veel belovend uit !

Ik ben bezig met de eerste link:
http://www.sprut.de/electronic/pic/projekte/rc5test/index.htm
Deze reageert ook op andere dan een RC5 afstandsbediening.
Heeft iemand ervaring met deze RC5 ontvanger ?

[Bericht gewijzigd door MMSoft op ]

Het werkt nog niet betrouwbaar !

Na veel zoeken en proberen twijfel ik aan 2 dingen.

1e De IR opnemer die ik gebruik, komt uit een oude Philips TV.
Dat ding werkt op 5 volt, en geeft een RC5not signaal.
Ik bedoel hiermee, als er geen IR signaal is, dan staat er op de uitgang 5 volt.
Zodra er een IR signaal wordt ontvangen, dan wordt de uitgang wisselend naar 0 getrokken.
Is dit goed, of moet dit anders om werken ?
Ik ben al bezig geweest om de PIC ingang te inverteren, even als de interrupt anders om te laten reageren, maar dit alles wil nog steeds niet.

2e De afstandsbediening die ik gebruik is type RC 2592/00B 3104 207 09522, nu vraag ik mij af, of deze niet een RC6 i.p.v. RC5 signaal uitzend.

Wie kan hier iets over vertellen ?

[Bericht gewijzigd door MMSoft op ]

Ik ben er net achtergekomen dat de afstandsbediening die ik gebruik Wel een RC5 signaal uitzend.

Rest er nog de vraag, of het een RC5 of RC5not signaal moet zijn. En hoe ik evt. dit signaal kan inverteren.
Dat inverteren heb ik geprobeerd met een 4010 maar helaas werkt dit ook niet.

met 1 transistor kan je dat signaal wel omdraaien
een PNP basis aan de RC5not de rest spreekt voor zich weerstandje naar gnd tussen de weerstand en de transistor heb je dan een RC5

Maar een NAND moet toch ook werken ?
Ook weet ik niet of het signaal nu wel of niet goed is.
Daarom ben ik opzoek naar iemand die hier ervaring mee heeft.

Het geheel werkt zo onbetrouwbaar op dit moment.

Op 28 oktober 2005 22:07:54 schreef MMSoft:
Is dit goed, of moet dit anders om werken ?

Dat is standaard, alle IR ontvangers die ik ken zijn actief-laag.

Dan blijft er nog maar 1 ding over, er is iets mis gegaan met het omzetten van de code.

Ik bedoel, de code is geschreven voor een PIC16F84, en ik gebruik een PIC16F627

Edit:
Wat moet er gewijzigd worden ?

Het Configword dat ik gebruik:
__CONFIG b'11111101110000'
Ziet iemand hier een fout in ?

[Bericht gewijzigd door MMSoft op ]

Op 29 oktober 2005 10:56:44 schreef MMSoft:
Dan blijft er nog maar 1 ding over, er is iets mis gegaan met het omzetten van de code.

check http://www.voti.nl/swp/n_index.html "16x84 to 16F628"

Ik hebt het gelezen en gecontroleerd, maar zie de fout
nog niet.

Ik heb de Analoge comperators op onderstaande manier uitgeschakeld


; Port A/B auf Ausgabe stellen

Init
	movlw	B'11111111'
	movwf	PORTA
	movwf	PORTB		; Anzeige dunkel
	bsf     STATUS, RP0	; auf Bank 1 umschalten
	movlw	B'11110000'	; PortA RA0-RA3 output
	movwf	TRISA
	movlw	B'00000000'	; PortB alle output
	movwf	TRISB
	bcf     STATUS, RP0	; auf Bank 0 zurückschalten

       ;Analoge comparators instellen
        MOVLW   B'00000111'  
        MOVWF   CMCON           ;Comparators uitschakelen

	clrf	gr_e
	clrf	co_e

Het werkt wel enigzins, maar het werkt niet stabiel.
De code's die ik krijg zijn wisselvallig.
Ook komen er code's op het display als er een andere IR signaal wordt ontvangen (ander merk afstandsbediening).

Is er niemand die ooit met zoiets bezig geweest is, en dan met een PIC16F62x, of dezelfde problemen herkend ?

Ik zie in het schema dat de ir ontvanger niet is voorzien van een weerstand en elco (zie datasheet tsop ontvangers). Zonder dit zal je zeker errors krijgen!

Gtz,

Rik.

http://www.picbasic.nl/ onder tab Projecten: RC5/RC6 codes op LCD uitlezen

Bedankt, maar helaas gebruik ik Assembler i.p.v. Basic.

Edit:
Ik hoop dat het met Assembler ook gaat lukken, anders
zal ik zeker overwegen om over te schakelen op Basic.

[Bericht gewijzigd door MMSoft op ]

Om het een en ander te testen heb ik nu even een SAA3049P RC5 Encoder IC aangesloten, en die werkt perfect.
Dus mijn IR opnemer werkt goed.

Rik_J ik had je post over het hoofd gezien !

Inderdaad dat was het probleem, nu werkt het prima !

Iedereen Bedankt !

Edit:
Weerstand: 470 Ohm
ELCO: 1 U

[Bericht gewijzigd door MMSoft op ]

Toch nog een vraag:

Ik probeer Pen RA7 als uitgang, aan te sturen bij toetscode 0506 (05=VCR, Toest 6).

Ik gebruik voor de vergelijking 'if_then.inc' van
Willie Worteltje


   include "if_then.inc" 

;----------------------------------------

(Init)
	movlw	B'01110000'	; PortA RA0-RA3,RA7 output
	movwf	TRISA

;----------------------------------------

pollen
	call	empfangen	;IR empfangen

	movfw	gr_e		; gruppenadresse 
	andlw	0x0F
	movwf	Ziffer3		;low Teil Gruppe

	swapf	gr_e,w		; gruppenadresse
	andlw	0x0F
	movwf	Ziffer4		; high Teil Gruppe

	movfw	co_e
	andlw	0x0F
	movwf	Ziffer1		; low Teil commando

	swapf	co_e,w		; commando
	andlw	0x0F
	movwf	Ziffer2		; high Teil commando

;if Ziffer3=0 and Ziffer4=5 and Ziffer1=6 and Ziffer2=0 then ....        
       IREQVT   Ziffer3,0h
       GOTO     M1 
       GOTO     EINDE
       
M1     IREQVT   Ziffer4,5h
       GOTO     M2
       GOTO     EINDE

M2     IREQVT   Ziffer1,6h
       GOTO     M3 
       GOTO     EINDE

M3     IREQVT   Ziffer2,0h
       GOTO     M4  
       GOTO     EINDE

M4     
       BSF	PORTA,7         ;Toets 6 van VCR ingedrukt  

EINDE
       call	pause		;2ms warten
       goto	pollen

Dit werkt niet, wat doe ik fout ?

IREQVT If Register1 == Value

Dit Commando staat in de include "if_then.inc" file
Zie: http://home.versatel.nl/edithenwilliam/william.htm
(Macro: if_then.inc)

Ik ben alweer een stukje verder.
Als ik nu op een bepaalde toets druk, dan wordt er een uitgang hoog gemaakt, deze wordt weer laag zodra er op een ander toets gedrukt wordt.

Nu moet het echter zo werken dat de uitgang zolang hoog is als dat ik de toets ingedrukt houd.
Dus als ik de toets weer loslaat, dan moet de uitgang weer afvallen.

Ik ben er al druk mee bezig geweest, maar helaas...

Wie ziet er een oplossing ?

Ik ben bezig met deze code (zie Downloads):
http://www.sprut.de/electronic/pic/projekte/rc5test/index.htm

Omdat deze code http://www.xs4all.nl/~sbp/projects/ircontrol/picir/rc5.htm
de mogelijkheid heeft om te zien of er een toets is ingedrukt, ben ik met deze code aan de slag gegaan.

Omdat mijn Compiler (MPASM) deze code niet begrijp, heb ik deze zo goed mogelijk omgezet.
Helaas krijg ik dit nog niet werkend.
Dit is de code die ik nu heb:


LIST P=16F627           
include <P16F627.INC>    
CONFIG   B'11111101110000'

SCAN_STATE      EQU     0x0C             ;Scan state pointer
DIGIT1          EQU     0x0D             ;Pattern of left most digit
DIGIT2          EQU     0x0E
DIGIT3          EQU     0x0F
DIGIT4          EQU     0x10             ;Pattern of right most digit
SCAN_DELAY      EQU     0x11             ;Scan delay counter (5ms pace)
CLR_DELAY       EQU     0x12             ;Display clear delay counter
DP_DELAY        EQU     0x13             ;Decimal point delay counter
IR_STATE        EQU     0x14             ;IR receiver state machine
BIT_TIMER       EQU     0x15             ;Bit timer
IR_SHIFT        EQU     0x16             ; ,$17,$18,$19 IR shift register
#SCAN_DISP2     EQU    0x00             ;????

;Constants
TIMER_UPDATE    EQU     -50+3           ;Timer update value (2 dead cycles)
MS5_COUNT       EQU     100             ;Number of counts to 5ms
CLR_TIME        EQU     100             ;Display clear timeout (20ms/count)
DP_TIME         EQU     3               ;Decimal point timeout (20ms/count)
HALF_TIME       EQU     900/50          ;Number of timer counts per half bit
IR_STATE_1      EQU     0               ; ?????????????????????? 



RESET           GOTO    INIT            ;Get the system going

;-----------------------------------------------------------------------------
;
;Segment patterns
;
;-----------------------------------------------------------------------------

HEX2SEGMENTS    ANDLW   B'00001111'     ; Use only lower nibble
                ADDWF   PCL,F           ;Add offset to current PC

SEGMENTS        RETLW   B'11000000'     ;0
                RETLW   B'11111001'     ;1
                RETLW   B'10100100'     ;2
                RETLW   B'10110000'     ;3
                RETLW   B'10011001'     ;4
                RETLW   B'10010010'     ;5
                RETLW   B'10000010'     ;6
                RETLW   B'11111000'     ;7
                RETLW   B'10000000'     ;8
                RETLW   B'10010000'     ;9
                RETLW   B'10001000'     ;A
                RETLW   B'10000011'     ;B
                RETLW   B'11000110'     ;C
                RETLW   B'10100001'     ;D
                RETLW   B'10000110'     ;E
                RETLW   B'10001110'     ;F

;-----------------------------------------------------------------------------
;
; Scan display routine
;
;-----------------------------------------------------------------------------

SCAN_DISP       MOVLW   MS5_COUNT       ;Reload scan delay
                MOVWF   SCAN_DELAY
                MOVLW   B'11111111'      ;Switch off all Anode drivers
                MOVWF   PORTA            ;during the switch
                MOVF    SCAN_STATE,W    ;Jump to next display's routine
                MOVWF   PCL

;-------------------------------------------------------------SCAN DISPLAY 1--

SCAN_DISP1      MOVF    DIGIT1,W        ;Get pattern of left most digit
                MOVWF   PORTB           ; and send it out
                MOVLW   B'11111110'     ; Switch left most digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP2     ;Next time do SCAN_DISP2
                MOVWF   SCAN_STATE
                RETURN

;-------------------------------------------------------------SCAN DISPLAY 2--

SCAN_DISP2      MOVF    DIGIT2,W        ;Get pattern of 2nd left digit
                MOVWF   PORTB            ;and send it out
                MOVLW   B'11111101'     ; Switch 2nd left digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP3     ;Next time do SCAN_DISP3
                MOVWF   SCAN_STATE

                DECF    DP_DELAY,F      ;Decrement DP_DELAY every 20ms
                BTFSS   STATUS,Z
                RETURN                  ;We're done if counter <> 0 !

                BSF     DIGIT2,7        ;Clear Digit 2's decimal point now
                RETURN

;-------------------------------------------------------------SCAN DISPLAY 3--

SCAN_DISP3      MOVF    DIGIT3,W        ;Get pattern of 2nd right digit
                MOVWF   PORTB           ; and send it out
                MOVLW   B'11111011'     ; Switch 2nd right digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP4     ;Next time do SCAN_DISP3
                MOVWF   SCAN_STATE
                RETURN

;-------------------------------------------------------------SCAN DISPLAY 4--

SCAN_DISP4      MOVF    DIGIT4,W        ;Get pattern of right most digit
                MOVWF   PORTB           ; and send it out
                MOVLW   B'11110111'     ; Switch right most digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP1     ;Next time do SCAN_DISP1 again
                MOVWF   SCAN_STATE

                DECF    CLR_DELAY,F     ;Decrement CLR_DELAY every 20ms
                BTFSS   STATUS,Z
                RETURN                  ;We're done if counter <> 0 !

                MOVLW   B'10111111'     ; Only display 4 dashes
                MOVWF   DIGIT1
                MOVWF   DIGIT2
                MOVWF   DIGIT3
                MOVWF   DIGIT4
                RETURN

;-----------------------------------------------------------------------------
;
; IR receiver state machine
;
;-----------------------------------------------------------------------------

IR_MACHINE      MOVF    IR_STATE,W      ;Jump to present state
                MOVWF   PCL

;---------------------------------------STATE 0, WAIT FOR BEGIN OF START BIT--

IR_STATE_0      BTFSC   PORTA,4         ;Input still high?
                RETURN                  ;Yes! Nothing to do

                MOVLW   HALF_TIME/2-1   ;Wait until we're in the center of the
                MOVWF   BIT_TIMER       ; start pulse
                MOVLW   IR_STATE_1      ;Next stop is state 1
                MOVWF   IR_STATE
                RETURN

;---------------------------STATE 1, START BIT DETECTED, CHECK IF IT IS REAL--

;IR_STATE_1      
                DECFSZ  BIT_TIMER       ;Wait until center of start pulse
                RETURN                  ;Time's not up yet!

                BTFSC   PORTA,4         ;Is the input still low?
                GOTO    IR_ERROR_1      ;Nope! Exit with error

                MOVLW   HALF_TIME       ;Set interval to the center of the
                MOVWF   BIT_TIMER       ; first half of the next bit
                MOVLW   B'00001000'     ; Prepare the shift register
                MOVWF   IR_SHIFT
                CLRF    IR_SHIFT+1
                MOVLW   IR_STATE_2      ;Prepare for next stop
                MOVWF   IR_STATE
                RETURN

;-----------------------------------IR STATE 2, WAIT FOR FIRST HALF OF A BIT--

IR_STATE_2      DECFSZ  BIT_TIMER       ;Wait until center of first half of bit
                RETURN                  ;Keep waiting!

                MOVLW   IR_STATE_3      ;Next state is 3 if input is high
                BTFSS   PORTA,4
                MOVLW   IR_STATE_4      ;Input is low, next state is 4
                MOVWF   IR_STATE
                MOVLW   HALF_TIME       ;Restart bit timer
                MOVWF   BIT_TIMER
                RETURN

;---------------IR STATE 3, FIRST HALF WAS HIGH NOW IT MUST BE LOW FOR A "1"--

IR_STATE_3      DECFSZ  BIT_TIMER       ;Wait until center of 2nd half of bit
                RETURN                  ;Keep waiting!

                BTFSC   PORTA,4         ;Is input high now?
                GOTO    ERROR_          ;Nope! It's an error!

                BSF     STATUS,C    ;A 1 was received, shift it in result
                RLF     IR_SHIFT,F
                RLF     IR_SHIFT+1,F
                MOVLW   HALF_TIME       ;Restart bit timer
                MOVWF   BIT_TIMER
                MOVLW   IR_STATE_2      ;In case we need some more bits
                BTFSC   STATUS,C    ;We're done when Carry is 1
                MOVLW   IR_STATE_5      ;Carry is 1, received entire message
                MOVWF   IR_STATE
                RETURN

ERROR_          MOVLW   IR_ERROR_0      ;Wait until input gets high before
                MOVWF   IR_STATE        ; returning to state 0
                RETURN

;---------------IR STATE 4, FIRST HALF WAS LOW NOW IT MUST BE HIGH FOR A "0"--

IR_STATE_4      DECFSZ  BIT_TIMER       ;Wait until center of 2nd half of bit
                RETURN                  ;Keep waiting!

                BTFSS   PORTA,4         ;Is input high now?
                GOTO    IR_ERROR_1      ;Nope! It's an error!

                BCF     STATUS,C    ;A 0 was received, shift it in result
                RLF     IR_SHIFT,F
                RLF     IR_SHIFT+1,F
                MOVLW   HALF_TIME       ;Restart bit timer
                MOVWF   BIT_TIMER
                MOVLW   IR_STATE_2      ;In case we need some more bits
                BTFSC   STATUS,C    ;We're done when Carry is 1
                MOVLW   IR_STATE_5      ;Carry is 1, received entire message
                MOVWF   IR_STATE
                RETURN

;--------------------------IR STATE 5, MESSAGE RECEIVED, START PROCESSING IT--

IR_STATE_5      MOVLW   CLR_TIME        ;Set display clear timer
                MOVWF   CLR_DELAY
                MOVLW   DP_TIME         ;Flash receive LED
                MOVWF   DP_DELAY

                MOVF    IR_SHIFT,W      ;Get IR command
                ANDLW   B'00111111'     ; The command is only 6 bits wide
                BTFSS   IR_SHIFT+1,4    ;Copy inverted extended bit to b6 of
                IORLW   B'01000000'     ;  command

                RLF     IR_SHIFT,F      ;Shift the entire IR address in
                RLF     IR_SHIFT+1,F    ; 2nd byte of shift register
                RLF     IR_SHIFT,F
                RLF     IR_SHIFT+1,F
                MOVWF   IR_SHIFT        ;Save cleaned up hex IR command number

                MOVLW   IR_STATE_6      ;We've done enough in this state
                MOVWF   IR_STATE        ;Let's do the rest in state 6
                RETURN

;------------------------------IR STATE 6, CONVERT HEX MESSAGE TO 7 SEGMENTS--

IR_STATE_6      SWAPF   IR_SHIFT+1,W    ;Work from left to right
                ANDLW   B'00000001'     ; Address is only 5 bits wide
                CALL    HEX2SEGMENTS
                MOVWF   DIGIT1

                MOVF    IR_SHIFT+1,W    ;Do the same with 2nd digit
                CALL    HEX2SEGMENTS
                ANDLW   B'01111111'     ; Flash dot of this digit
                MOVWF   DIGIT2

                SWAPF   IR_SHIFT,W      ;And with the 3d digit
                CALL    HEX2SEGMENTS
                MOVWF   DIGIT3

                MOVF    IR_SHIFT,W      ;And finally with the last digit
                CALL    HEX2SEGMENTS
                BTFSC   IR_SHIFT+1,5    ;Was the T bit set?
                ANDLW   B'01111111'     ;  Light the dot of this digit if it was
                MOVWF   DIGIT4

                MOVLW   IR_STATE_7      ;Done enough for now. Let's finish it
                MOVWF   IR_STATE        ; in the last state
                RETURN

;----------------------------------IR STATE 7, WAIT FOR INPUT TO RETURN HIGH--

IR_STATE_7
IR_ERROR_0      MOVLW   IR_STATE_0      ;Reset state machine only if input is
                BTFSC   PORTA,4         ; high
                MOVWF   IR_STATE
                RETURN

;-----------------------------------------------------------IR ERROR STATE 1--

IR_ERROR_1      MOVLW   IR_STATE_0      ;Return to IR state 0
                MOVWF   IR_STATE

                RETURN

;-----------------------------------------------------------------------------
;
; Get started
;
;-----------------------------------------------------------------------------

INIT            MOVLW   0x0D            ;Clear memory
                MOVWF   FSR
                MOVLW   0x35             ;Clear a total of 36 RAM addresses
                MOVWF   0x0C
CLRMEM          CLRF    INDF            ;Clear this address
                INCF    FSR             ;Increment pointer
                DECFSZ  0x0C             ;Decrement counter
                GOTO    CLRMEM         ;Repeat until done

                BSF     STATUS,RP0      ;Select bank 1 of register file
                MOVLW   B'11011111'     ;Timer mode without pre-scaler
                MOVWF   OPTION_REG
                MOVLW   B'00010000'     ;Only PA4 is an input
                MOVWF   TRISA
                MOVLW   B'00000000'     ;All Port B are outputs
                MOVWF   TRISB
                BCF     STATUS,RP0      ;Select bank 0 of register file

                ;Analoge comperators instellen
                MOVLW       B'00000111'     ;Bits naar tijdelijk register 
                MOVWF       CMCON           ;Comparators uitschakelen

                MOVLW   B'00000000'     ;Disable all interrupts
                MOVWF   INTCON

                MOVLW   IR_STATE_0      ;Init IR receiver state machine
                MOVWF   IR_STATE

                MOVLW   #SCAN_DISP1     ;Init display scan state
                MOVWF   SCAN_STATE

                CLRF    PCLATH         ;All indirect jumps are on page 0!

                MOVLW   TIMER_UPDATE    ;Get the timer started
                MOVWF   TMR0
                MOVLW   MS5_COUNT       ;Start 5ms counter for display scan
                MOVWF   SCAN_DELAY

                MOVLW   B'10101111'      ;Show rc-5 on display
                MOVWF   DIGIT1
                MOVLW   B'10100111'
                MOVWF   DIGIT2
                MOVLW   B'10111111'
                MOVWF   DIGIT3
                MOVLW   B'10010010'
                MOVWF   DIGIT4
                MOVLW   200             ;Set clear time-out to 4 seconds
                MOVWF   CLR_DELAY

;-----------------------------------------------------------------------------
;
; Main program loop
;
;-----------------------------------------------------------------------------

MAIN

;-----------------------------------------CALL THE IR RECEIVER STATE MACHINE--

                CALL    IR_MACHINE      ;Call the IR receiver state machine

;-----------------------------------------------------SCAN DISPLAY EVERY 5MS--

                DECF    SCAN_DELAY,F    ;Decrement scan delay counter
                BTFSC   STATUS,Z    ;Only scan display if counter = 0
                CALL    SCAN_DISP

;-------------------------------------------------------SYNC MAIN WITH TIMER--

SYNC_           BTFSC   TMR0,7          ;Wait until bit 7 of TMR = 0
                GOTO    SYNC_           ;Not 0 yet!
                MOVLW   TIMER_UPDATE    ;Reload timer again
                ADDWF   TMR0,F

                GOTO    MAIN

;-----------------------------------------------------------------------------
;
; Configuration word
;
;-----------------------------------------------------------------------------

;                .OR     $2007
;                .CW     XT
;               .LI     OFF

;** einde van het programma ****************************************************
                END

Wie ziet de fout(en) ?

Als je doet BUILD NODE krijg je een ERROR/WARNING log.
Als je daar op de regel klikt springt MPLAB naar de betreffende regel toe en kun je daar kijken wat er mis is.
In de omschrijving staat wat er niet klopt