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.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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 ]
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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 ?
Rik_J
Problems do not concern me. I want solutions, not excuses!
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.
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