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?

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


