- Codice: Seleziona tutto
signed char ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned bit flag_discesa; flag_salita; inizio_ricezione; alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;
void interrupt(void){
if(intcon.gpif){
if((gpio.f4==1)&&(alto==0))
{
gpio.f1=1;
INTCON.T0IE=1;
tmr0=0;
stop_tempo=0;
tempo_trascorso=0;
alto=1;
start=0;
}else if ((gpio.f4==0)&&(alto==1))
{
incremento_byte++;
gpio.f1=0;
tempo_trascorso=tmr0;
tmr0=0;
INTCON.T0IE=0;
stop_tempo=1;
alto=0;
start=1;
if(tempo_trascorso<10)
{
ricevo[incremento_byte]=0;
}
if(tempo_trascorso>16)
{
ricevo[incremento_byte]=1;
}
}
intcon.gpif=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main() { ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
basso=0;
start=0;
stop=0;
flag_discesa=0;
leggi=0;
flag_salita=0;
inizio_ricezione=0;
tempo_trascorso=0;
CMCON = 7; //Disabilita comparatore
ADCON0 = 0b000000000; //Disabilita convertitore A/D
ANSEL = 0b00000000; //Tutte le porte in digitale
TRISIO = 0b00010000; //Tutti i pin in OUT tranne gpio3
OPTION_REG=0b00000101; //abilita presaler 1:64 in modo da avere un incremento del tmr0 ogni 64uS
ioc=0b010000;
INTCON.GPIE =1; //abilita interrupt generale
INTCON.T0IE=1;
intcon.GIE=1;
gpio.f5=0;
gpio.f3=0;
gpio.f2=0;
gpio.f1=0;
gpio.f0=0;
while(1){
////////////////////////////controlla impulso start di 13ms////////////////////////////////////////////////////////////
/*if(gpio.f4==0)
{
tmr0=0;
flag_discesa=1;
}
if((gpio.f4==1)&&(flag_discesa==1))
{
flag_salita=1;
}
if((gpio.f4==0)&&(flag_salita==1))
{
tempo_trascorso=tmr0;
}
if(tempo_trascorso>200)
{
inizio_ricezione=1;
flag_salita=0;
flag_discesa=0;
tempo_trascorso=0;
}*/
if(incremento_byte>20)
{
leggi=1;
incremento_byte=0;
intcon.gie=0;
}
if(leggi==1)
{
gpio.f2=1;
stop++;
gpio.f5=ricevo[incremento_byte];
delay_ms(500);
gpio.f2=0;
delay_ms(500);
incremento_byte++;
}
}
}
PIC e ricezione telecomando infrarossi
Moderatore:
Paolino
35 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
0
voti
il codice sotto funziona (naturalmente è da perfezionare), ora la domanda è: con questo codice riesco solo a creare un array di 25 elementi, con più elementi ho la memoria piena, è possibile ovviare a questo problema?
0
voti
Ora il problema è fare attivare un uscita del PIC in base al tasto premuto.
Il salvataggio del dato trasmesso dal telecomando è ok(controllato con oscilloscopio e led di controllo).
L'unica aggiunta al codice di prima è la somma dell'array. Ho preso solo gl'ultimi 8 bit
Se faccio il debug sul PC con mikroc sembra tutto ok, ma nella realtà non va.
Il salvataggio del dato trasmesso dal telecomando è ok(controllato con oscilloscopio e led di controllo).
L'unica aggiunta al codice di prima è la somma dell'array. Ho preso solo gl'ultimi 8 bit
Se faccio il debug sul PC con mikroc sembra tutto ok, ma nella realtà non va.
- Codice: Seleziona tutto
signed short ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned short dato;
unsigned bit inizio_ricezione; alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;
void interrupt(void){
if(intcon.gpif){
if((gpio.f4==1)&&(alto==0))
{
gpio.f1=1;
INTCON.T0IE=1;
tmr0=0;
stop_tempo=0;
tempo_trascorso=0;
alto=1;
start=0;
}else if ((gpio.f4==0)&&(alto==1))
{
incremento_byte++;
gpio.f1=0;
tempo_trascorso=tmr0;
tmr0=0;
INTCON.T0IE=0;
alto=0;
if(tempo_trascorso<10)
{
ricevo[incremento_byte]=0;
}
if(tempo_trascorso>16)
{
ricevo[incremento_byte]=1;
}
}
intcon.gpif=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main() { ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
dato=0;
basso=0;
start=0;
dato=0;
stop=0;
leggi=0;
inizio_ricezione=0;
tempo_trascorso=0;
CMCON = 7; //Disabilita comparatore
ADCON0 = 0b000000000; //Disabilita convertitore A/D
ANSEL = 0b00000000; //Tutte le porte in digitale
TRISIO = 0b00010000; //Tutti i pin in OUT tranne gpio3
OPTION_REG=0b00000101; //abilita presaler 1:64 in modo da avere un incremento del tmr0 ogni 64uS
ioc=0b010000;
INTCON.GPIE =1; //abilita interrupt generale
INTCON.T0IE=1;
intcon.GIE=1;
gpio.f5=0;
gpio.f3=0;
gpio.f2=0;
gpio.f1=0;
gpio.f0=0;
while(1){
////////////////////////////controlla impulso start di 13ms////////////////////////////////////////////////////////////
if(dato==224)
{
gpio.f0=1;
}
if(incremento_byte>25)
{
leggi=1;
incremento_byte=0;
intcon.gie=0;
}
if(leggi==1)
{
gpio.f2=1;
gpio.f5=ricevo[incremento_byte];
delay_ms(500);
gpio.f2=0;
delay_ms(500);
incremento_byte++;
if(incremento_byte>25)
{
dato=ricevo[24]+(ricevo[23]*2)+(ricevo[22]*4)+(ricevo[21]*8)+(ricevo[20]*16)+(ricevo[19]*32)+(ricevo[18]*64)+(ricevo[17]*128);
incremento_byte=0;
leggi=0;
alto=0;
intcon.GIE=1;
}
}
}
}
1
voti
Ciao
sorecaro adesso non entro nel merito del programma, invece mi permetto un suggerimento: prima di re-inserire il codice in un Post, controlla più volte, magari lo fai già, però verifica meglio.
Scrivo questo perché ne ho visti tre nelle ultime due ore.
Non è un problema e non lo è proprio in assoluto ma credo diventi sconveniente per l'OP, in tal caso tu, ma vale in generale, perché ogni volta viene segnalato il codice con un comportamento indesiderato e se qualcuno volesse indagare quasi non farebbe in tempo trovandosi ad "inseguire" l'indicazione successiva.
La "fretta" di cercare il supporto degli interlocutori, comprensibile ma, senza prendersi il tempo di riguardare con calma ( ... vedi ad esempio abilitazione interrupt ...), potrebbe stancare chi magari fosse disposto a dare una mano.
Questa è solo una mia osservazione, non scrivo sia sistematico ma può accadere.
Saluti
Scrivo questo perché ne ho visti tre nelle ultime due ore.
Non è un problema e non lo è proprio in assoluto ma credo diventi sconveniente per l'OP, in tal caso tu, ma vale in generale, perché ogni volta viene segnalato il codice con un comportamento indesiderato e se qualcuno volesse indagare quasi non farebbe in tempo trovandosi ad "inseguire" l'indicazione successiva.
La "fretta" di cercare il supporto degli interlocutori, comprensibile ma, senza prendersi il tempo di riguardare con calma ( ... vedi ad esempio abilitazione interrupt ...), potrebbe stancare chi magari fosse disposto a dare una mano.
Questa è solo una mia osservazione, non scrivo sia sistematico ma può accadere.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
sorecaro ha scritto:riesco solo a creare un array di 25 elementi, con più elementi ho la memoria piena, è possibile ovviare a questo problema?
Certo, fino ad un certo punto.
Invece di
- Codice: Seleziona tutto
signed char ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Puoi usare
- Codice: Seleziona tutto
long long ricevo //numero di 32 bit;
//Per inserire uno 0:
ricevo = ricevo << 1;
//Per inserire un 1:
ricevo = ricevo << 1;
ricevo |= 1;
//Per estrarre l'ultimo numero inserito:
num = ricevo & 1;
ricevo = ricevo >> 1:
Così usi solo 4 byte invece di 32.

0
voti
0
voti
Dopo varie prove ora riesco ad attivare due uscite con il telecomando.(come al solito sbagliavo io a fare i conti)
L'unico problema che sto riscontrando è che a volte il PIC si blocca nella routine di interrupt e non fa più nulla. Dico questo perché nel codice ho inserito l'uscita gpio.f1 come flag di controllo, se dopo aver premuto il tasto la porta gpio.f0 rimane a 0 il PIC si blocca, non riceve più nessun dato, ma se ritorna a 1 allora tutto ok. Come posso fare per uscire in modo forzato da questa situazione??
L'unico problema che sto riscontrando è che a volte il PIC si blocca nella routine di interrupt e non fa più nulla. Dico questo perché nel codice ho inserito l'uscita gpio.f1 come flag di controllo, se dopo aver premuto il tasto la porta gpio.f0 rimane a 0 il PIC si blocca, non riceve più nessun dato, ma se ritorna a 1 allora tutto ok. Come posso fare per uscire in modo forzato da questa situazione??
- Codice: Seleziona tutto
unsigned short ricevo[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned short dato;
unsigned bit inizio_ricezione; alto; basso;
unsigned bit stop_tempo; leggi; stop; start;
unsigned char tempo_trascorso;
unsigned char incremento_byte;
void interrupt(void){
if(intcon.gpif){
if((gpio.f4==1)&&(alto==0))
{
gpio.f1=1; /////////flag controllo
INTCON.T0IE=1;
tmr0=0;
stop_tempo=0;
tempo_trascorso=0;
alto=1;
start=0;
}else if ((gpio.f4==0)&&(alto==1))
{
incremento_byte++;
gpio.f1=0; //flag controllo
tempo_trascorso=tmr0;
tmr0=0;
INTCON.T0IE=0;
alto=0;
if(tempo_trascorso<10)
{
ricevo[incremento_byte]=0;
}
if(tempo_trascorso>16)
{
ricevo[incremento_byte]=1;
}
}
intcon.gpif=0;
}
}
/////////////////////////////////////8//////777//////////////////////////////////////////////////////////////////////////
void main() { ///////
incremento_byte=0;
stop_tempo=0;
alto=0;
basso=0;
start=0;
dato=0;
stop=0;
leggi=0;
inizio_ricezione=0;
tempo_trascorso=0;
CMCON = 7; //Disabilita comparatore
ADCON0 = 0b000000000; //Disabilita convertitore A/D
ANSEL = 0b00000000; //Tutte le porte in digitale
TRISIO = 0b00010000; //Tutti i pin in OUT tranne gpio3
OPTION_REG=0b00000101; //abilita presaler 1:64 in modo da avere un incremento del tmr0 ogni 64uS
ioc=0b010000;
INTCON.GPIE =1; //abilita interrupt generale
INTCON.T0IE=1;
intcon.GIE=1;
gpio.f5=0;
gpio.f3=0;
gpio.f2=0;
gpio.f1=0;
gpio.f0=0;
while(1){
if(incremento_byte>25)
{
intcon.gie=0;
dato=(ricevo[24]+(ricevo[23]*2)+(ricevo[22]*4)+(ricevo[21]*8)+(ricevo[20]*16)+(ricevo[19]*32)+(ricevo[18]*64)+(ricevo[17]*128));
incremento_byte=0;
leggi=0;
alto=0;
if(dato==184)/////////TASTO SINISTRO/////////////////////////////////
{
gpio.f0=1;
Delay_ms(1000);
gpio.f0=0;
intcon.GIE=1;
}
if (dato==164)/////////TASTO DESTRO/////////////////////////////////
{
gpio.f2=1;
delay_ms(1000);
gpio.f2=0;
intcon.gie=1;
}
}
}
}
35 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 3 ospiti

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)

