Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Codici IR con PIC18F2455

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Codici IR con PIC18F2455

Messaggioda Foto Utentewizard » 9 gen 2021, 18:50

Buonasera, sto provando a leggere i codici di un telecomando tramite un ricevitore IR TSOP1730.
Ho provato a realizzare il progetto su un Arduino Nano utilizzando la libreria IRremote di shirriff z3t0 (versione 2.8.0) (https://github.com/Arduino-IRremote/Arduino-IRremote) ed ho verificato che il tutto funziona senza problemi. Tramite la stampa di Arduino sono riuscito a identificare il protocollo di comunicazione implementato (NEC) ed i codici assegnati ad ogni tasto.

Per varie esigenze devo però realizzare il tutto su un PIC18F2455 (ho usato Arduino in via preliminare solo per capire quale fosse il protocollo di comunicazione e quali fossero i codici dei vari tasti). Il circuito è esattamente lo stesso: output pin del ricevitore collegato direttamente al pin del micro che deve leggerlo più ovviamente alimentazione e massa (che ho collegato direttamente ai 5V e al GND di Arduino per non introdurre differenze tra i 2 progetti).
Per il codice ho fatto uso della libreria IRremote che a detta dell'autore "It is an port by Marco Koehler of the IRremote library for the Arduino from Ken Shirriff." (https://github.com/Waitsnake/Pic-IRremote).
Il clock del micro è preso dall'oscillatore interno a 8MHz senza prescaler applicati. A tal proposito ho modificato il file di libreria IRremoteInt.h nel seguente modo:

Codice: Seleziona tutto
#define SYSCLOCK 8000000   // 12000000


Codice: Seleziona tutto
static void ir_delayMicroseconds(int time)
{
    unsigned long tm_val = MAX_TMR_VAL - (time*DELAY_TICKS_PER_US);
    /*using timer 1 for a delay during ir-sending*/
    T1CON = 0b10000100; // 0b10100100


Nei commenti dei pezzi di codice sopra riportati vi sono i valori originali per SYSCLOCK e T1CON che io ho modificato per adeguarli alla mia frequenza dell'oscillatore ed al prescaler.

Di seguito il mio codice, molto simile a quello dell'esempio della libreria.

Codice: Seleziona tutto
#include <xc.h>
#include <pic18f2455.h>
#include <stdlib.h>
#include <stdio.h>
#include "pic_config.h"
#include "ir_code_define.h"
#include "../../../../../../Program Files (x86)/Microchip/xc8/v1.38/lib_aggiunte/Pic_IRremote_master/IRremote.h"

#pragma config FOSC = INTOSCIO_EC

decode_results dec_results;

void main()
{
    OSCCON = 0x72;
    RCON = 0x13;
   
    ADCON0bits.ADON = 0;        // A/D converter module is disabled
    ADCON1 = 0x0F;
   
    TRISBbits.TRISB0 = 0;
    TRISBbits.TRISB1 = 0;
    TRISBbits.TRISB3 = 0;
   
    PORTBbits.RB0 = 0;
    PORTBbits.RB1 = 0;
    PORTBbits.RB3 = 0;
   
    ir_enableIRIn();
   
    while(1)
    {
        PORTBbits.RB1 = 1;
       
        if (ir_decode(&dec_results))
        {
            if (dec_results.decode_type == NEC)
            {
                PORTBbits.RB3 = 1;
                switch(dec_results.value)
                {
                    case KEY_LIGHT_ON:
                        PORTBbits.RB0 = 1;
                        break;
                    case KEY_LIGHT_OFF:
                        PORTBbits.RB0 = 0;
                        break;
                    case KEY_BLACK_OFF:
                        PORTBbits.RB0 = 0;
                        break;
                    case KEY_RED_ON:
                        PORTBbits.RB0 = 1;
                        break;
                    default:
                        PORTBbits.RB0 = 0;
                        break;
                }
            }
           
            ir_resume(); // Receive the next value
        }       
    }
}


// XC8 way of interrupt handler definition
void __interrupt() InterruptHandlerHigh(void)
{
    ir_interruptService();
}


Il comportamento che osservo è il seguente: appena premo un qualsiasi pulsante, breakkandomi sulla riga if (dec_results.decode_type == NEC) osservo che il dec_results.decode_type vale -1 ovvero protocollo di comunicazione UNKNOWN.

Potreste aiutarmi a capire per quale motivo tra i 2 micro vi è questo differente comportamento?
Dov'è che sbaglio con il PIC?
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[2] Re: Codici IR con PIC18F2455

Messaggioda Foto Utentelelerelele » 10 gen 2021, 12:51

non conosco arduino, a che freq lavora? magari è solo un problema di frequenze diverse. Mi pare altrresì che il clock del PIC sia inviato ad i timer con un divisore 4. Non so se questo possa influire.....

hai debuggato per vedere se e quale segnale vine rilevato all'ingresso? suppongo lo invii il ricevitore.

Il ricevitore, lo hai pilotato nel modo corretto, con le frequenze corrette?

Per darti info specifiche dovrei conscere bene il ricevitore, che non conosco.

saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[3] Re: Codici IR con PIC18F2455

Messaggioda Foto Utentewizard » 10 gen 2021, 13:29

lelerelele ha scritto:non conosco arduino, a che freq lavora? magari è solo un problema di frequenze diverse. Mi pare altrresì che il clock del PIC sia inviato ad i timer con un divisore 4. Non so se questo possa influire.....

Arduino Nano lavora a 16MHz.
Esatto, il clock del PIC viene inviato ai timer con un divisore 4.
Tuttavia entrambe le librerie effettuano le operazioni su base temporale 50us.
Di seguito un commento della libreria Arduino (ma che si ritrova anche in quella per il PIC) che riporta quanto suddetto.

Codice: Seleziona tutto
// Interrupt Service Routine - Fires every 50uS
// TIMER2 interrupt code to collect raw data.
// Widths of alternating SPACE, MARK are recorded in rawbuf.
// Recorded in ticks of 50uS [microseconds, 0.000050 seconds]


lelerelele ha scritto:hai debuggato per vedere se e quale segnale vine rilevato all'ingresso? suppongo lo invii il ricevitore.

Il segnale che viene rilevato dal PIC è l'output del ricevitore. Mi sento di poter dire che sta funzionando correttamente perché ho effettuato la seguente prova.
Ho collegato in contemporanea l'uscita del ricevitore IR al pin di Arduino e al pin del PIC. Premendo un qualsiasi pulsante del telecomando, Arduino mi ritorna il codice corretto mentre il PIC mi tira fuori qualcosa di sconosciuto.

lelerelele ha scritto:Il ricevitore, lo hai pilotato nel modo corretto, con le frequenze corrette?
Per darti info specifiche dovrei conscere bene il ricevitore, che non conosco.

Il ricevitore non credo debba essere pilotato in maniera particolare da me. Cioè è un oggetto che tira fuori qualcosa quando pilotato dal telecomando.
Questo è il suo datasheet (molto piccolo) https://www.batronix.com/pdf/tsop17xx.pdf


Ad ogni modo, essendo il ricevitore lo stesso tra Arduino e il PIC ed essendo i collegamenti praticamente uguali, la prima cosa che mi viene da pensare è che ci possa essere qualche problema a livello di frequenze o di tempi. Il riconoscimento del protocollo di comunicazione infatti si basa tutto sulla ricezione di certi dati entro certi limiti temporali.
Nell'esempio d'uso della libreria comunque l'autore usa una frequenza del micro di 12MHz con prescaler settato a 4.
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[4] Re: Codici IR con PIC18F2455

Messaggioda Foto Utentelelerelele » 10 gen 2021, 16:10

Sto guardando l'impostazione del T1CON, non mi trovo, se arresti l'esecuzione del programma, con un punto di debug nel momento che il timer dovrebbe contare il ritardo, proseguendo di un passo, questo avanza?
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[5] Re: Codici IR con PIC18F2455

Messaggioda Foto Utentewizard » 10 gen 2021, 17:56

Sembra che sia riuscito a risolvere il problema :D
L'errore stava in questa define:
Codice: Seleziona tutto
#define SYSCLOCK 8000000


Ho cambiato 8000000 con 2000000 ed ho risolto.
Avevo frainteso cosa fosse SYSCLOCK. Non è la Fosc ma la Fosc/4.

Ora devo solo capire se posso velocizzare l'attivazione del carico perché dal momento in cui premo il pulsante al momento in cui viene acceso il LED (di prova) passa qualche secondo.
Suggerimenti? :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[6] Re: Codici IR con PIC18F2455

Messaggioda Foto Utentelelerelele » 10 gen 2021, 18:10

se riesci a fare il debug, metti un punto quando hai individuato il codice, avanzi un passo per volta, e vedi se si pianta da qualche parte.

Oppure, riesci ad usare un pin per accendere un led? Metti la chiamata al led, in punti cruciali, vedendo se appena individuato il codice risponde....
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 26 ospiti