Jump to content
PLC Forum


Sign in to follow this  
Jago

Telecomando Rc5 - Aiuto su PIC basic

Recommended Posts

Jago

Ciao a tutti, ho bisogno del vostro aiuto. Ho realizzato un interfaccia per gestire un lettore CDrom da computer nei suoi comandi basilari (come CD Audio Player) secondo un progetto trovato nel web. Funziona perfettamente con la sua tastierina, ma lo scoglio rimane il telecomando. Nel software del PIC16F877A che controlla tutto è previsto (a quanto si evince dalle descrizioni e dalla presenza del modulo ricevente IR) il codice RC5 per usare i "non più comuni" telecomandi dei Philips Cd Player.

Ho trovato un bel circuito per costruirmelo, ma data la mia totale ignoranza sul codice, non riesco ad adattare il sorgente che viene fornito a corredo dello schema.

http://www.picbasic.nl/frameload_uk.htm?ht...5_remote_uk.htm

Ho recuperato i codici del protocollo del system (CD player = 20) dei 5 tasti necessari (NEXT 32, PREW 33, STOP 54, PLAY 53, EJECT 45) ma appena provo a inserirli e a compilare il tutto, niente… sembra non funzionare. E' inutile… sono impreparato totalmente e la mia ostinazione non è sufficiente.

Qualcuno può aiutarmi nel mio intento. Grazie 1000 di tutto.

Share this post


Link to post
Share on other sites

GiRock

Sei sicuro di non aver cancellato il valore di OSCCAL dal PIC12F629 durante la fase di programmazione???

Purtroppo questo è un inconveniente a cui tutti non pensano se non dopo aver fatto il danno, senza quel valore, il PIC è come morto ed il tuo telecomando non può far girare il programma...

Fortunatamente per quel modello esiste un circutino che rileva il valore ottimale di calibrazione, lo schema e la spiegazione la trovi quì: RECALIBRATE OSCCAL VALUE PIC12F629...

P.S. Una volta rilevato il valore, lo devi leggere nelle prime due locazioni della EEPROM, poi durante la fase di programmazione, lo devi inserire nell'ultima locazione di memoria programma 0x3FF...

Share this post


Link to post
Share on other sites
Jago

Ti ringrazio per la risposta, ma non è tanto un problema di programmazione, quanto di listato da modificare e non ne sono capace. Ne sono certo perché la programmazione (WinPic800) con l'HEX allegato al progetto è andata a buon fine. Tant'è che il led del telecomando "lampeggia", ma ovviamente invia codici non adatti al software del receiver che alloggia sulla scheda (RC5 per CD Player e non TV).

Grazie comunque

Share this post


Link to post
Share on other sites
Livio Orsini

Scusa, fammi capire. Tu hai preso l'hexe così com'era e lo hai caricato. Sembra funzionare ma fa quello che vuoi e vorresti apportare le modifiche necessarie.

Prima domanda. Ce l'hai il sorgente?

Seconda domanda. Sai qualche cosa di programmazione e se la rispsota è affermativa, con quali linguaggi?

Share this post


Link to post
Share on other sites
Jago

Buonasera Livio, in effetti sono a digiuno con i linguaggi, ma non mi manca l'inventiva...

In pratica dal sito che ho segnalato del telecomando, ho scaricato sia l'HEX compilato (per comandare il volume e i programmi TV = system 0) sia il sorgente per PIC Basic. Aperto il file con PROTON IDE, con santa pazienza ho cercato nel listato le voci che riguardano i tasti e il relativo codice che sovrintendono (es. SYMBOL VolumeDown = 17; Key Volume-) e ho provato a sostituire il testo con le nuove voci che mi occorrono (es. RC5_Eject = 45). Ho cambiato tutto e anche il famoso SYSTEEM, che se non ho capito male identifica l'apparecchio al quale voglio inviare i codici. Nel caso del mio listato originale era 0 quindi TV e non 20 che sta per CD Player (nel protocollo RC5). Sono riuscito a ricompilare il tutto per il PIC12F629 e a caricarlo tramite il mio programmatore seriale.

Tutto è andato a buon fine, il LED IR lampeggia, ma non sono in grado di capire se il codice è corretto (lo dubito) perché la ricevente ignora qualsiasi tipo di comando.

Penserai che sono un matto, ma per imparare bisogna sbatterci la testa.

Grazie mille.

Share this post


Link to post
Share on other sites
GiRock

Se devi comandare un CD Player, System deve essere uguale a 20 come mostrato nella riga seguente:

Systeem = 20                  ;Fill here the system address (0 = TV) (Don't define Systeem as a constant alias, because that won't work (Works only when it's 0)

Per il resto cambiando la numerazione del codice con quelli che hai preso nella tabella non rimarebbe null'altro da fare, l'unico dubbio è che se l'oscillatore interno non è calibrato correttamente a 4MHz, i tempi di invio degli impulsi risulta falsato e potrebbe non essere riconsciuto, per quello che ti ho chiesto se avevi controllato la correttezza di OSCCAL che non è automatica, solitamente dopo la prima programmazione del PIC che va a buon fine, questo valore viene poi sovrascritto nelle successive e deve essere ripristinato correttamente a meno di non farlo manualmente sempre...

Share this post


Link to post
Share on other sites
Jago

O cribbio!!! Vuoi dire che, anche se il codice era corretto, il fatto che abbia apportato modifiche al circuito per alimentarlo con una batteria CR2025 (3V), ha sballato il clock del PIC?

Forse la domanda è sciocca, ma non è meglio usare dei quarzi esterni?

Proverò a fare la proceduta che mi hai gentilmente indicato. Un po' complessa a dire il vero per un ignorante in materia come me, ma sono di "coccio"....

Anzi, prima di imbattermi in questa nuova sfida, penso che un'occhiata al codice che intendo compilare mi tranquillizzerebbe... ma purtroppo non riesco ad allegare un .txt

Grazie 1000

Share this post


Link to post
Share on other sites
GiRock

Il codice modificato è questo:

;V-2 
;For electronic scheme see website www.picbasic.nl                                      
;           PIC12F629:                  +--v--+                                         
;                                  +5V  [     ]  GND                                    
;                   EJECT key |---/--- >[     ]> -[4k7]---NPN transistor IR LED         
;                    PREV key |---/--- >[     ]< ---/---| key STOP                   
;       pull-up!     NEXT key |---/--- >[     ]< ---/---| key PLAY                   
;                             -         +-----+         -                               
;Er is ook een Nederlandse versie / There is a Dutch version too                        
;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie)                      

DEVICE 12F629
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF;No crystal, no reset
ALL_DIGITAL TRUE

;Normal aliases (constants)
SYMBOL Debounce    = 5      ;mSec: Push button debounce time
SYMBOL CmdNext     = 32      ;Key Next
SYMBOL CmdPrev     = 33      ;Key Previous
SYMBOL CmdEject    = 45      ;Key Eject
SYMBOL CmdPlay     = 53      ;Key Play
SYMBOL CmdStop     = 54      ;Key Stop

;Logical aliases (constants)
SYMBOL AAN         = 0      ;Reversed ON
SYMBOL FALSE       = 0
SYMBOL OFF         = 0
SYMBOL ON          = 1
SYMBOL TRUE        = 1
SYMBOL UIT         = 1      ;Reversed OFF

;Port aliases
SYMBOL IrOut       = GPIO.0  ;Infrared LED. Amplifie via 4k7 resistor to NPN transistor (i.e. BC547 and 47 Ohm to IR-LED)
;         76543210
TRISIO = %11111110
PORTB_PULLUPS ON

;BYTE
DIM Command        AS BYTE  ;Contains the RC5 command code which gonna be send
DIM Cycl_1         AS BYTE  ;For ASM routine
DIM Cycl_2         AS BYTE  ;For ASM routine
DIM Key            AS BYTE  ;Contains the value from the inputs (de push-buttons)
DIM Systeem        AS BYTE  ;Contains the RC5 system code for which device the RC5 code is ment
;BIT
DIM ToggleBit      AS BIT    ;Togglebit from RC5

PORTB = 0
CLEAR
Systeem = 20                  ;Fill here the system address (0 = TV) (Don't define Systeem as a constant alias, because that won't work (Works only when it's 0)

IF GPIO.5 = AAN THEN STOP    ;When the StandBy key is pushed when switch the power on the PIC stops (for re-programming PIC12F629)


;MAIN PROGRAM                                                                                                          
Again:
 REPEAT
   Key = (GPIO & %00111110)  ;Read only the inputs
 UNTIL Key <> 62            ;Wait for key press
 DELAYMS Debounce            ;Debounce time for push-buttons
 IF Key <> (GPIO & %00111110) THEN Again;Not the same? Then it was probably a glitch, scan buttons Again 

 IF (Key & %00000010) = AAN THEN Command = CmdNext
 IF (Key & %00000100) = AAN THEN Command = CmdPrev
 IF (Key & %00001000) = AAN THEN Command = CmdEject
 IF (Key & %00010000) = AAN THEN Command = CmdPlay
 IF (Key & %00100000) = AAN THEN Command = CmdStop

 ToggleBit = ToggleBit ^ 1  ;Toggle the RC5 togglebit

 WHILE (GPIO & %00111110) <> 62;While button is pressed, keep sending signal
   GOSUB RC5_Code            ;Call RC5 assembler routine
   DELAYMS 82                ;Pause between the IR-zendingen
 WEND
GOTO Again


;ASSEMBLER ROUTINE                                                                                                      
RC5_Code:
ASM
;Send a complete RC5 code  
 call    TxEenRC5            ;Header

 btfss   Command,6          ;Inverted command bit
 call    TxEenRC5
 btfsc   Command,6
 call    TxNulRC5

;Togglebit
 btfsc   ToggleBit 
 call    TxEenRC5
 btfss   ToggleBit          
 call    TxNulRC5

;Systembit (A4,3,2,1,0) Address
 btfsc   Systeem,4
 call    TxEenRC5
 btfss   Systeem,4
 call    TxNulRC5

 btfsc   Systeem,3
 call    TxEenRC5
 btfss   Systeem,3
 call    TxNulRC5

 btfsc   Systeem,2
 call    TxEenRC5
 btfss   Systeem,2
 call    TxNulRC5

 btfsc   Systeem,1
 call    TxEenRC5
 btfss   Systeem,1
 call    TxNulRC5

 btfsc   Systeem,0
 call    TxEenRC5
 btfss   Systeem,0
 call    TxNulRC5

;Commandbit (D5,4,3,2,1,0) Data
 btfsc   Command,5
 call    TxEenRC5
 btfss   Command,5
 call    TxNulRC5

 btfsc   Command,4
 call    TxEenRC5
 btfss   Command,4
 call    TxNulRC5

 btfsc   Command,3
 call    TxEenRC5
 btfss   Command,3
 call    TxNulRC5

 btfsc   Command,2
 call    TxEenRC5
 btfss   Command,2
 call    TxNulRC5

 btfsc   Command,1
 call    TxEenRC5
 btfss   Command,1
 call    TxNulRC5

 btfsc   Command,0
 call    TxEenRC5
 btfss   Command,0
 call    TxNulRC5
return 

;*****************************
;Send a 0 (on-off) 
TxNulRC5
 call    LichtAanRC5
 call    LichtUitRC5 
return 

;*****************************
;Send a 1 (off-on)  
TxEenRC5
 call    LichtUitRC5
 call    LichtAanRC5
return 

;*****************************
;IR-LED off 
LichtUitRC5
 movlw   D'100'              ;RC5 has 100 (255 when xtal = 10MHz) time units from IR-LED off
 movwf   Cycl_2 
LichtUit2RC5
 nop                        ;Short delays
 nop 
 nop
 nop
 nop
 nop
 decfsz  Cycl_2,f 
 goto    LichtUit2RC5 
return 

;*****************************
;IR-LED on (pulsing) 
LichtAanRC5
 movlw   D'32'              ;RC5 gives 32 fast IR-LED pulses for a '1'
 movwf   Cycl_1

;32 Cyclussen from a pause and a pulse
LichtAan1RC5
;Pause
 nop
 movlw   D'4'                ;Time for (15 when Xtal = 10MHz) pause between IR-LED blink 
 movwf   Cycl_2 
LichtAan2RC5
 decfsz  Cycl_2,f 
 goto    LichtAan2RC5 
;Pulse 
 bsf     IrOut              ;IR-LED on
 movlw   D'1'                ;Time for (5 when Xtal = 10MHz) IR-LED blink
 movwf   Cycl_2
LichtAan3RC5                  
 decfsz  Cycl_2,f
 goto    LichtAan3RC5 
 bcf     IrOut              ;IR-LED off
 decfsz  Cycl_1,f 
 goto    LichtAan1RC5
return 
ENDASM

;V-2 update to V-1:
;Systeem as constant (SYMBOL) doesn't work (works only when Systeem = 0)
;By V-2 is Systeem a BYTE-variable

Per il resto devi fare come è riportato nella guida che ti ho linkato...

Edited by GiRock

Share this post


Link to post
Share on other sites
Jago

Grazie 1000 del supporto. Ora provvedo a fare quanto hai consigliato. A presto

Share this post


Link to post
Share on other sites
Jago

GiRock, ho provveduto a costruire l'hardware per trovare l'OSCCAL corretto, ma mi chiedevo due cose:

- Quale programma useresti tra IcProg, WinProg e WinProg800. Devo trovare un tutorial per scoprire dove inserire il dato che troverò scritto (se non ho capito male) in testa nell'area EPROM. Ti ricordo che non sono un fulmine di guerra in programmazione (sono un grafico pubblicitario con la malattia dell'elettronica....)

- Se alimento il circiuto di calibrazione con i 3 V reali della pila che sarà usata sul telecomando ottengo un dato più preciso?

Bye e grazie

PS Grazie 1000 per il tuo listato, mi fa piacere anche sapere che la mia intuizione fosse esatta e che, a parte l'etichetta del comando, la mia modifica era uguale alla tua...

Share this post


Link to post
Share on other sites
Jago

SVILUPPI:

ho provato a riprogrammare il chip con l'oscal corretto (almeno credo..., è uguale a quello che ho letto da un processore nuovo di pacca). Il telecomando lampeggia una sequenza, ma non viene riconosciuto.

Per verificare il tutto ho costruito, lo schema era sullo stesso sito che ho linkato del telecomando, una interfaccia con display per verificare i codici e le funzioni inviate. In effetti questa semplice interfaccia funziona egregiamente, tant'è che, con un telecomando originale Philips di un lettore PhotoCD, essa leggeva il System (14) e tutti i tasti premuti (anche in codice binario, vedi sito).

http://www.picbasic.nl/frameload_uk.htm?ht..._display_uk.htm

A questo punto il problema è circostritto nel codice che è presente nel nuovo telecomando che ho costruito e che non viene riconosciuto come "valido RC5" da questa mia nuova interfaccia. Non capendo nulla di programmazione, mi chiedo se qualcuno di voi è così gentile da verificare il listato (vedi il post di GiRock), se contiene i dati corretti (frequenza, intervalli ecc.)

Grazie 1000

Share this post


Link to post
Share on other sites
Jago

Niente, non vuole proprio andare. Ma la mia testardaggine è proverbiale. Provando un'altra stratta mi sono imbattuto in un progetto simile, telecomando 8 canali che trasmette con il protocollo RC5 e forniscono HEX e ASM. Prendo l'ASM e lo modifico in parte (System e KeyCode). Tenete presente che la mia ignoranza, altrettanto proverbiale, mi ha costretto a imparare i rudimenti del codice binario, dell'esadecimale ecc. Penso di aver fatto tutto giusto, ma al momento di compilare per generare il nuovo HEX... sbrang! MPLAB mi colora stringe di rosso e da errore (sui #DEFINE, e su qualche altro comando di cui ignoro totalmente il significato e la sintassi). La cosa strana è che lo fa anche con l'ASM originale del progetto non modificato.

A questo punto brancolo nel buio. Un aiutino?

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

; PROJECT : 8 CHANNEL TX IR REMOTE

; CRYSTAL 4 MHz

; MPLAB : 7.11 , Assembly

; RC5 FORMAT [at]38KHz , 35% DUTY CYCLE

; ADDRESS = 0X14 , System CD Player - System 20 in decimale

; CH1 = 0X20 , Next track 32 in decimale

; CH2 = 0X21 , Prew track 33 in decimale

; CH3 = 0X2D , Eject 45 in decimale

; CH4 = 0X35 , Play 53 in decimale

; CH5 = 0X36 , Stop 54 in decimale

; CH6 = 0X06 , non utilizzato

; CH7 = 0X07 , non utilizzato

; CH8 = 0X08 , non utilizzato

; NOT USE TOGGLE ALWAY = 1

; 16 Dec 2005

;

; FREE TO USE FOR PERSONAL OR EVEN COMERCIAL PRODUCT

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

list P=16F630

#include <P16F630.INC>

__config _WDT_OFF & _XT_OSC & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON

#DEFINE IR PORTC,4

#DEFINE TOG_BIT TOGGLE,1 ; TOGLE BIT NOT USE FOR THIS PROJECT

#DEFINE CH1_CMD 0X20 ; COMMANDO NEXT TRACK

#DEFINE CH2_CMD 0X21 ; COMMANDO PREV TRACK

#DEFINE CH3_CMD 0X2D ; COMMANDO EJECT

#DEFINE CH4_CMD 0X35 ; COMMANDO PLAY

#DEFINE CH5_CMD 0X36 ; COMMANDO STOP

#DEFINE CH6_CMD 0X06 ; CHANNEL 6 COMMAND

#DEFINE CH7_CMD 0X07 ; CHANNEL 7 COMMAND

#DEFINE CH8_CMD 0X08 ; CHANNEL 8 COMMAND

CNT1 EQU 20H

CNT2 EQU 21H

CNT3 EQU 22H

CNT4 EQU 23H

TOGGLE EQU 24H

CMD EQU 25H ; IR COMMAND BUFFER

PREV_PORTA EQU 26H

Temp EQU 27H

ORG 000

GOTO START

ORG 004H

GOTO ISR

START:

BCF IR

CLRF PORTC

CALL DEBOUNCE

;

MOVLW 0X07

MOVWF CMCON ; MAKE ALL GPIO TO DIGITAL I/O

BSF STATUS,RP0

BCF OPTION_REG,7 ; ENABLE WEAK PULL-UP

BSF WPUA,1 ; ENABLE WEAK PULL-UP FOR RA1

BSF WPUA,2 ; ENABLE WEAK PULL-UP FOR RA2

BSF TRISA,1

BSF TRISA,2

BSF IOCA,1

BSF IOCA,2

CLRF TRISC

BCF STATUS,RP0

BCF INTCON,RAIE

MOVF PORTA,W

BSF INTCON,RAIE

BSF INTCON,GIE

MOVLW 0X00

MOVWF PREV_PORTA

BCF TOG_BIT

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

; MAIN LOOP

MAIN:

SLEEP ; GOTO SLEEP MODE(I a sleepy! and need to save my energy)

GOTO MAIN

;

;======================================

; SEND LOGIC 0

;======================================

LOGIC0: MOVLW .32 ; 1

MOVWF CNT1 ; 1

;

LOG0_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

;

;===================================

BCF IR ; 1 MAKE IR LOW 17 uS

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

NOP ; 1

;

DECFSZ CNT1,F ; 1/2

GOTO LOG0_1 ; 2 26 uS

;

CALL DELAY_OFF

RETURN ; 2

;

;======================================

; SEND LOGIC 1

;======================================

LOGIC1: CALL DELAY_OFF ; DELAY 899 uS

MOVLW .32 ; 1

MOVWF CNT1 ; 1

;

LOG1_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

;

;===================================

BCF IR ; 1 MAKE IR LOW 17 uS

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

GOTO $+1

NOP ; 1

;

DECFSZ CNT1,F ; 1/2

GOTO LOG1_1 ; 2

;

RETURN ; 2

;

;======================================

; DELAY FOR NO CARRAIR

; DELAY ABOUT 835 uS

;======================================

DELAY_OFF:

MOVLW 5 ; 1

MOVWF CNT3 ; 1

MOVLW .54 ; 1

MOVWF CNT4 ; 1

DECFSZ CNT4,F ; 1/2

GOTO $-1 ; 2

DECFSZ CNT3,F ; 1/2

GOTO $-5 ; 2

RETURN ; 2

;======================================

; SEND RC5 TO REMOTE

; INPUT : CMD (6 BIT IR COMMAND)

;======================================

SEND_RC5:

; SEND 2 START BIT

CALL LOGIC1

CALL LOGIC1

; SEND TOGGLE BIT

BTFSS TOG_BIT

GOTO $+3

CALL LOGIC1

GOTO $+2

CALL LOGIC0

; SEND ADDRESS 5 BIT FIX AT 10100 (0X14) IT MAY BE CHANGED BY YOU

CALL LOGIC1 ; 1 MSB FIRST BIT 4

CALL LOGIC0 ; 0

CALL LOGIC1 ; 1

CALL LOGIC0 ; 0

CALL LOGIC0 ; 0 LSB BIT 0

;

; SEND COMMAND 6 BIT(00HH LLLL) MSB FIRST

BCF STATUS,C

RLF CMD,F ; AFTER FIRST ROTAGE 0HHL LLL0

RLF CMD,F ; AFTER SECOND ROTAGE HHLL LL00

;

MOVLW 6

MOVWF CNT2

;

RLF CMD,F ; SEND MSB FIRST

BTFSS STATUS,C

GOTO $+3

CALL LOGIC1

GOTO $+2

;

CALL LOGIC0

DECFSZ CNT2,F

GOTO $-7

;

RETLW 0

;

;======================================

; DEBOUNCE SWITCH

; DELAY 15 mS

;======================================

DEBOUNCE:

MOVLW .1 ; 1

MOVWF CNT1 ; 1

DEL_1: MOVLW .20

MOVWF CNT2 ; 1

DEL_2: CLRF CNT3 ; 1

DEL_3: DECFSZ CNT3,F ; 1/2

GOTO DEL_3 ; 2

DECFSZ CNT2,F ; 1/2

GOTO DEL_2 ; 2

DECFSZ CNT1,F ; 1/2

GOTO DEL_1 ; 2

RETLW 0 ; 2

;=======================================

; INTERRUPT SERVICE ROUTINE

; FOR RA PIN CHANGED

;=======================================

ISR:

BTFSS INTCON,RAIF

GOTO END_ISR

BCF INTCON,RAIE

MOVF PORTA,F

BCF INTCON,RAIF

CALL DEBOUNCE ; DEBOUNCE SWITCH

;

MOVF PREV_PORTA,W

XORWF PORTA,W

XORLW 2

BTFSC STATUS,Z

BTFSC PORTA,1

GOTO ISR2

;

MOVLW 0XFE

MOVWF PORTC

BTFSC PORTA,1

GOTO ISR3

MOVLW 7

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X1

;

ISR3:

MOVLW 0XFD

MOVWF PORTC

BTFSC PORTA,1

GOTO ISR4

MOVLW 5

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X1

;

ISR4:

MOVLW 0XFB

MOVWF PORTC

BTFSC PORTA,1

GOTO ISR5

MOVLW 3

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X1

;

ISR5:

MOVLW 0XF7

MOVWF PORTC

BTFSC PORTA,1

GOTO END_ISR

MOVLW 1

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X1

;

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

ISR2:

MOVF PREV_PORTA,W

XORWF PORTA,W

XORLW 4

BTFSC STATUS,Z

BTFSC PORTA,2

GOTO END_ISR

;

MOVLW 0XFE

MOVWF PORTC

BTFSC PORTA,2

GOTO ISR6

MOVLW 8

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X2

;

ISR6:

MOVLW 0XFD

MOVWF PORTC

BTFSC PORTA,2

GOTO ISR7

MOVLW 6

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X2

;

ISR7:

MOVLW 0XFB

MOVWF PORTC

BTFSC PORTA,2

GOTO ISR8

MOVLW 4

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X2

;

ISR8:

MOVLW 0XF7

MOVWF PORTC

BTFSC PORTA,2

GOTO END_ISR

MOVLW 2

MOVWF CMD

CALL SEND_RC5

GOTO END_ISR_X2

;

END_ISR_X1:

BTFSS PORTA,1

GOTO $-1

CALL DEBOUNCE

GOTO END_ISR

;

END_ISR_X2:

BTFSS PORTA,2

GOTO $-1

CALL DEBOUNCE

GOTO END_ISR

;

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

;

END_ISR:

;BTFSS PORTA,1

;GOTO END_ISR

;BTFSS PORTA,2

;GOTO END_ISR

CLRF PORTC

MOVF PORTA,W

MOVWF PREV_PORTA

BCF INTCON,RAIF

BSF INTCON,RAIE

RETFIE

END

Share this post


Link to post
Share on other sites
GiRock

Sbagli l'indentazione del codice, devi scriverlo così come te lo mando, altrimenti il compilatore ti segnala l'errore, però sulla sua funzionalità non saprei ancora dirti nulla, inoltre il PIC è il 16F630 che in MPLAB deve essere selezionato in Configure->Select Device...


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

; PROJECT : 8 CHANNEL TX IR REMOTE

; CRYSTAL 4 MHz

; MPLAB : 7.11 , Assembly

; RC5 FORMAT [at]38KHz , 35% DUTY CYCLE

; ADDRESS = 0X14 , System CD Player - System 20 in decimale

; CH1 = 0X20 , Next track 32 in decimale

; CH2 = 0X21 , Prew track 33 in decimale

; CH3 = 0X2D , Eject 45 in decimale

; CH4 = 0X35 , Play 53 in decimale

; CH5 = 0X36 , Stop 54 in decimale

; CH6 = 0X06 , non utilizzato

; CH7 = 0X07 , non utilizzato

; CH8 = 0X08 , non utilizzato

; NOT USE TOGGLE ALWAY = 1

; 16 Dec 2005

;

; FREE TO USE FOR PERSONAL OR EVEN COMERCIAL PRODUCT

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

	LIST P=16F630

	#INCLUDE <P16F630.INC>

	ERRORLEVEL -302

	__CONFIG _WDT_OFF & _XT_OSC & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON


#DEFINE IR PORTC,4

#DEFINE TOG_BIT TOGGLE,1 ; TOGLE BIT NOT USE FOR THIS PROJECT

#DEFINE CH1_CMD 0X20 ; COMMANDO NEXT TRACK

#DEFINE CH2_CMD 0X21 ; COMMANDO PREV TRACK

#DEFINE CH3_CMD 0X2D ; COMMANDO EJECT

#DEFINE CH4_CMD 0X35 ; COMMANDO PLAY

#DEFINE CH5_CMD 0X36 ; COMMANDO STOP

#DEFINE CH6_CMD 0X06 ; CHANNEL 6 COMMAND

#DEFINE CH7_CMD 0X07 ; CHANNEL 7 COMMAND

#DEFINE CH8_CMD 0X08 ; CHANNEL 8 COMMAND


CNT1 EQU 20H

CNT2 EQU 21H

CNT3 EQU 22H

CNT4 EQU 23H

TOGGLE EQU 24H

CMD EQU 25H ; IR COMMAND BUFFER

PREV_PORTA EQU 26H

Temp EQU 27H


	ORG 000

	GOTO START


	ORG 004H

	GOTO ISR


START:

	BCF IR

	CLRF PORTC

	CALL DEBOUNCE

	;

	MOVLW 0X07

	MOVWF CMCON ; MAKE ALL GPIO TO DIGITAL I/O


	BSF STATUS,RP0


	BCF OPTION_REG,7 ; ENABLE WEAK PULL-UP

	BSF WPUA,1 ; ENABLE WEAK PULL-UP FOR RA1

	BSF WPUA,2 ; ENABLE WEAK PULL-UP FOR RA2

	BSF TRISA,1

	BSF TRISA,2

	BSF IOCA,1

	BSF IOCA,2

	CLRF TRISC


	BCF STATUS,RP0


	BCF INTCON,RAIE

	MOVF PORTA,W

	BSF INTCON,RAIE

	BSF INTCON,GIE



	MOVLW 0X00

	MOVWF PREV_PORTA

	BCF TOG_BIT


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

	; MAIN LOOP

MAIN:

	SLEEP ; GOTO SLEEP MODE(I a sleepy! and need to save my energy)

	GOTO MAIN


	;

	;======================================

	; SEND LOGIC 0

	;======================================

LOGIC0: MOVLW .32 ; 1

	MOVWF CNT1 ; 1

	;

LOG0_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	;

	;===================================

	BCF IR ; 1 MAKE IR LOW 17 uS

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	NOP ; 1

	;

	DECFSZ CNT1,F ; 1/2

	GOTO LOG0_1 ; 2 26 uS

	;

	CALL DELAY_OFF

	RETURN ; 2

	;

	;======================================

	; SEND LOGIC 1

	;======================================

LOGIC1: CALL DELAY_OFF ; DELAY 899 uS

	MOVLW .32 ; 1

	MOVWF CNT1 ; 1

	;

LOG1_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	;

	;===================================

	BCF IR ; 1 MAKE IR LOW 17 uS

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	GOTO $+1

	NOP ; 1

	;

	DECFSZ CNT1,F ; 1/2

	GOTO LOG1_1 ; 2

	;

	RETURN ; 2

	;

	;======================================

	; DELAY FOR NO CARRAIR

	; DELAY ABOUT 835 uS

	;======================================

DELAY_OFF:

	MOVLW 5 ; 1

	MOVWF CNT3 ; 1

	MOVLW .54 ; 1

	MOVWF CNT4 ; 1

	DECFSZ CNT4,F ; 1/2

	GOTO $-1 ; 2

	DECFSZ CNT3,F ; 1/2

	GOTO $-5 ; 2

	RETURN ; 2


	;======================================

	; SEND RC5 TO REMOTE

	; INPUT : CMD (6 BIT IR COMMAND)

	;======================================

SEND_RC5:

	; SEND 2 START BIT

	CALL LOGIC1

	CALL LOGIC1

	; SEND TOGGLE BIT

	BTFSS TOG_BIT

	GOTO $+3

	CALL LOGIC1

	GOTO $+2

	CALL LOGIC0


	; SEND ADDRESS 5 BIT FIX AT 10100 (0X14) IT MAY BE CHANGED BY YOU

	CALL LOGIC1 ; 1 MSB FIRST BIT 4

	CALL LOGIC0 ; 0

	CALL LOGIC1 ; 1

	CALL LOGIC0 ; 0

	CALL LOGIC0 ; 0 LSB BIT 0

	;

	; SEND COMMAND 6 BIT(00HH LLLL) MSB FIRST

	BCF STATUS,C

	RLF CMD,F ; AFTER FIRST ROTAGE 0HHL LLL0

	RLF CMD,F ; AFTER SECOND ROTAGE HHLL LL00

	;

	MOVLW 6

	MOVWF CNT2

	;

	RLF CMD,F ; SEND MSB FIRST

	BTFSS STATUS,C

	GOTO $+3

	CALL LOGIC1

	GOTO $+2

	;

	CALL LOGIC0

	DECFSZ CNT2,F

	GOTO $-7

	;

	RETLW 0

	;


	;======================================

	; DEBOUNCE SWITCH

	; DELAY 15 mS

	;======================================

DEBOUNCE:

	MOVLW .1 ; 1

	MOVWF CNT1 ; 1

DEL_1: MOVLW .20

	MOVWF CNT2 ; 1

DEL_2: CLRF CNT3 ; 1

DEL_3: DECFSZ CNT3,F ; 1/2

	GOTO DEL_3 ; 2

	DECFSZ CNT2,F ; 1/2

	GOTO DEL_2 ; 2

	DECFSZ CNT1,F ; 1/2

	GOTO DEL_1 ; 2

	RETLW 0 ; 2




	;=======================================

	; INTERRUPT SERVICE ROUTINE

	; FOR RA PIN CHANGED

	;=======================================

ISR:

	BTFSS INTCON,RAIF

	GOTO END_ISR


	BCF INTCON,RAIE

	MOVF PORTA,F

	BCF INTCON,RAIF

	CALL DEBOUNCE ; DEBOUNCE SWITCH

	;

	MOVF PREV_PORTA,W

	XORWF PORTA,W

	XORLW 2

	BTFSC STATUS,Z

	BTFSC PORTA,1

	GOTO ISR2

	;

	MOVLW 0XFE

	MOVWF PORTC

	BTFSC PORTA,1

	GOTO ISR3

	MOVLW 7

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X1

	;

ISR3:

	MOVLW 0XFD

	MOVWF PORTC

	BTFSC PORTA,1

	GOTO ISR4

	MOVLW 5

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X1

	;

ISR4:

	MOVLW 0XFB

	MOVWF PORTC

	BTFSC PORTA,1

	GOTO ISR5

	MOVLW 3

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X1

	;

ISR5:

	MOVLW 0XF7

	MOVWF PORTC

	BTFSC PORTA,1

	GOTO END_ISR

	MOVLW 1

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X1

	;

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

ISR2:

	MOVF PREV_PORTA,W

	XORWF PORTA,W

	XORLW 4

	BTFSC STATUS,Z

	BTFSC PORTA,2

	GOTO END_ISR

	;

	MOVLW 0XFE

	MOVWF PORTC

	BTFSC PORTA,2

	GOTO ISR6

	MOVLW 8

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X2

	;

ISR6:

	MOVLW 0XFD

	MOVWF PORTC

	BTFSC PORTA,2

	GOTO ISR7

	MOVLW 6

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X2

	;

ISR7:

	MOVLW 0XFB

	MOVWF PORTC

	BTFSC PORTA,2

	GOTO ISR8

	MOVLW 4

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X2

	;

ISR8:

	MOVLW 0XF7

	MOVWF PORTC

	BTFSC PORTA,2

	GOTO END_ISR

	MOVLW 2

	MOVWF CMD

	CALL SEND_RC5

	GOTO END_ISR_X2

	;

END_ISR_X1:

	BTFSS PORTA,1

	GOTO $-1

	CALL DEBOUNCE

	GOTO END_ISR

	;

END_ISR_X2:

	BTFSS PORTA,2

	GOTO $-1

	CALL DEBOUNCE

	GOTO END_ISR

	;

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

	;

END_ISR:


	;BTFSS PORTA,1

	;GOTO END_ISR

	;BTFSS PORTA,2

	;GOTO END_ISR


	CLRF PORTC

	MOVF PORTA,W

	MOVWF PREV_PORTA

	BCF INTCON,RAIF

	BSF INTCON,RAIE

	RETFIE


	END

Share this post


Link to post
Share on other sites
Jago

Grazie 1000, ora provo a copiare il tuo listato e vedo se riesco a creare l'HEX. A sommi capi cosa intendi per identazione del codice? Ho notato che è apparsa la riga ERROR LEVEL -302, a cosa serve?

Non scomodarti a darmi la spiegazione se la ritieni troppo complessa, ma la mia curiosità è patologica... sarei già felice di sapere che i numeri che ho scritto in HEX e in binario sono corretti...

Grazie grazie, sto imparando un sacco di cose grazie a voi.

Share this post


Link to post
Share on other sites
GiRock

L'indentazione è un sistema comunemente usato dai programmatori di qualsiasi linguaggio per rendere leggibile il codice, MPLAB con l'Assembler predilige avere sulla prima riga le variabili, le costanti e le LABEL (etichette) indicanti subroutine o funzioni tipo Main: etc. da richiamare con i GOTO o le CALL, mentre ERRORLEVEL -302 indica al compilatore di non mostrare gli avvisi concernenti al BANKSEL, comunque è prassi comune anche questa...

Share this post


Link to post
Share on other sites
GiRock

Dimenticavo, i numeri li potevi scrivere direttamente in forma decimale, il compilatore è in grado di distinguerli in vari formati, comunque per esercizio va bene anche così...

Alcuni esempi di formato esadecimale con lo stesso valore:


0x00

H'00'

00H

P.S. Naturalmente io l'ho compilato al primo colpo prima di postartelo, quindi sotto quel punto di vista non ci sono problemi...

Share this post


Link to post
Share on other sites
Jago

Benone, in effetti con le dritte di GiRock sono riuscito a produrre l'HEX con MPLAB e a caricarlo perfettamente sul PIC...

Il risultato? Un pareggio salomonico tra uomo vs macchina.

Mi spiego: il telecomando funziona, trasmette, il ricevitore a display che ho costruito indica il System giusto (20 Cd Player! binario = 10100 :-)) ma i tasti continuano a inviare il codice dei rispettivi Key numerici (1 = Key 1, in binario 1) il tasto 2 (2 = Key 2, in binario 10), tasto 3 (3 = Key 3, in binario 11)... fino al 5 stessa storia. Quindi, per quanto abbia, in modo ammetto superficiale, modificato i #DEFINE con i codici che mi occorrono, niente da fare. A questo punto devo scoprire l'arcano. Tra l'altro, ho notato che il tasto per e vere una trasmissione correttamente decodificabile deve essere premuto e rilasciato molto velocemente, proprio un TIC e VIA! altrimenti se premuto con decisione per un tempo più lungo, la ricevente mi dà LED giallo e non decodifica l'impulso. Perché?

Sul fronte dell'altro telecomando, il precedente progetto iniziale col PIC 12F629 scritto in PICBasic, anche lì niente... ho calibrato l'OSCCAL, l'ho letto e inserito nell'ultimo indirizzo come 34xx (es 3418) la programmazione va a buon fine, ma lui continua a trasmettere codici non decodificabili (LED giallo). Temo proprio che sia sbagliato la frequenza nel listato e che non sia 4 Mhz con carrier a 36K con il pacchetto di bit che deve durare 24.889 ms come impone il protocollo RC5.

Niente, sono una fabbrica di rottami e comincio a credere che ognuno debba fare il proprio mestiere... io sono un grafico pubblicitario (è evidente) e passione a volte non basta.

PS Per GiRock: ho trovato un hardware alternativo per calibrare l'OSCCAL estremamente essenziale, ma credo altrettanto valido di quello che mi hai indicato tu. 2 resistenze, 2 LED, 2 condensatori e un cristallo rubato a un vecchio orologio al quarzo cinese. http://www.sprut.de/electronic/pic/projekte/osccal/osccal.htm (metodo 1).

Mi ributto sui listati. Bye

Share this post


Link to post
Share on other sites
Jago

Sviluppi:

EUREKA! Quando la testardaggine paga...

Sono tornato sul progetto in PicBasic e con santa pazienza, non capendo molto di programmazione, ho confrontato il listato con altri simili trovati in rete. Sono stati commessi degli errori nei tempi e nelle pause. Correggendo le cifre di DELAYMS, Pause e Impulse, tutto ha cominciato a trasmettere con precisione. Anche i comandi sono stati adeguati e recepiti per l'uso con CD Player.

Sono molto contento e il mio nuovo CDplayer/DAC suona che è un piacere.

Ora sotto con la falegnameria per dargli un bell'aspetto. Grazie a tutti, bye

Share this post


Link to post
Share on other sites
Livio Orsini

Grazie a te che hai dato conto di come hai risolto il problema! :clap:

Questo è lo spirito giusto per il forum: si da e si riceve.

Share this post


Link to post
Share on other sites
Jago

Ciao a tutti, scusate se ritorno sull'argomento, ma ho ancora bisogno di "lumi". Il telecomando che ho realizzato con il PIC 12F629 (vedi Post #8 di GiROCK con opportune modifiche nella durata degli impulsi) funziona egregiamente, come ho già detto; ma ha un gran problema: divora la pila anche se inutilizzato. Ho il timore che la funzione "SLEEP" (perdonate la mia rozza imprecisione) non funziona o non è attiva. Potete dirmi se il listato evidenzia qualcosa di anomalo... o meglio dirmi se questa funzione è prevista, e se non lo è indicarmi come introdurla.

Grazie ancora, bye

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...