Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Memorizzare codice RFID...

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Memorizzare codice RFID...

Messaggioda Foto Utentericello9 » 5 mag 2011, 21:09

Ciao a tutti, in poche parole cerco di spiegare il mio problema.
Ho collegato alla porta RXD del mio PIC 16f688A l'uscita del modulo RFID reader; al passaggio del transponder il modulo invia al microcontrollore il relativo codice. (ho preso spunto da questo articolo: http://www.settorezero.com/wordpress/im ... tags-rfid/)
Fin qui nessun problema.
A questo punto monitorando l'interrupt sulla seriale riesco a catturare il dato inviato, il mio obiettivo però è quello di riuscire a salvare l'intero codice.
Dal pezzo di programma postato di seguito ad ogni caraterate ricevuto il valore della variabile input si sovrascrive, come posso fare per memorizzare tutti i caratteri?
Penso che dovrei usare un stringa ma in fatto di programmazzione in c sono alle prime armi.

Codice: Seleziona tutto
   if (RCIF)//abbiamo ricevuto un carattere sulla seriale?
      {
      input=getch();//recupero carattere ricevuto sulla seriale
      }


Grazie per l'auito
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[2] Re: Memorizzare codice RFID...

Messaggioda Foto UtenteTardoFreak » 5 mag 2011, 22:07

[-X
Codice: Seleziona tutto
  input = RCREG;

-:-
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[3] Re: Memorizzare codice RFID...

Messaggioda Foto Utentericello9 » 6 mag 2011, 0:19

Qunado vado a definire le variabili per input devo usare un char se uilizzo RCREG?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[4] Re: Memorizzare codice RFID...

Messaggioda Foto UtenteTardoFreak » 6 mag 2011, 0:39

Nel datasheet (dove si trova tutto :mrgreen: ) RCERG e' una locazione di memopria a 8 bit. Quindi puoi assegnare il suo valore a:
- char
- unsigned char
- short int
- unsigned short int
etc etc.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[5] Re: Memorizzare codice RFID...

Messaggioda Foto Utentericello9 » 14 mag 2011, 11:26

Dopo molti tentativi non sono riuscito a trovare una soluzione al mio problema.
Da quello che ho capito bisogna definire un array che nell'esempio ho chiamato input.
Ad ogni segnale ricevuto sulla linea seriale la variabile i incrementa cosa da salvare il dato ricevuto in locazioni di memoria diverse ( input[0], input[1], input[2]...)


Sul mio display dovrei visualizzare il dato contenuto nella variabile input[3] ma invece visualizzo il valore 3.
Sapete dirmi dove sbaglio.
Grazie
Marcello.


Codice: Seleziona tutto
int input[20];
char i=0;

if (RCIF)         //abbiamo ricevuto un carattere sulla seriale?
   {   
   input[i]=getch();         //recupero carattere ricevuto sulla seriale
   for (i=0; i>19; i++;)   //ad ogni dato ricevuto incremento la viarbile i
      input[i]=i;         //memorizzo il valore di input nella cella corrispondente al valore di i
   }

   LCD_GOTO(1,1);         //porto il cursore nella posizione 1,1
    LCD_PUTUN(input[3]);   //mostro sul display il valore della dato memorizzato in
                     //nella variabile input con offset 3.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[6] Re: Memorizzare codice RFID...

Messaggioda Foto Utentecrestus » 14 mag 2011, 20:24

Il tuo codice salva la prima ricezione/solamente il primo carattere in input[0].
Codice: Seleziona tutto
        input[i]=getch();         //recupero carattere ricevuto sulla seriale

ma il ciclo for successivo
Codice: Seleziona tutto
       for (i=0; i>19; i++;)   //ad ogni dato ricevuto incremento la viarbile i
          input[i]=i;         //memorizzo il valore di input nella cella corrispondente al valore di i

lo riscrive assegnando a ogni locazione del vettore input[] il valore di i in quell'istante (cioè, ad ogni incremento di i avanzi di una posizione nel vettore e ci scrivi il valore di i) ottenendo:
input[0]=0
input[1]=1
input[2]=2
input[3]=3

hai capito perché ti visualizza 3 l'LCD?
...:::Pivello allo sbaraglio:::...

MY WEBSITE! come and see... ;) <-- Di nuovo online... spiacente per i problemi tecnici!
Avatar utente
Foto Utentecrestus
1.295 2 7 13
Expert EY
Expert EY
 
Messaggi: 478
Iscritto il: 3 ott 2008, 10:28
Località: studente al politecnico di torino

0
voti

[7] Re: Memorizzare codice RFID...

Messaggioda Foto Utentericello9 » 14 mag 2011, 23:34

Hai ragione ma allore dovrei riscrivere il codice così?
Eliminando
Codice: Seleziona tutto
  input[i]=i;


Codice: Seleziona tutto
int input[20];
char i=0;

if (RCIF)         //abbiamo ricevuto un carattere sulla seriale?
   {   
   input[i]=getch();         //recupero carattere ricevuto sulla seriale
   for (i=0; i>19; i++;)   //ad ogni dato ricevuto incremento la viarbile i
     
   }

   LCD_GOTO(1,1);         //porto il cursore nella posizione 1,1
    LCD_PUTUN(input[3]);   //mostro sul display il valore della dato memorizzato in
                     //nella variabile input con offset 3.



Grazie della pazienza ma sono alle prime armi.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[8] Re: Memorizzare codice RFID...

Messaggioda Foto Utentecrestus » 15 mag 2011, 11:41

no... adesso hai un ciclo for vuoto....

se devi ripetere una lettura per un certo numero di volte consecutive, devi leggere 20 volte il dato che puoi fare :
Codice: Seleziona tutto
input[0]=gatchar();
input[1]=gatchar();
input[2]=gatchar();
input[3]=gatchar();


ma per compattare il codice, usi giustamente il ciclo for ma nel modo sbagliato.. l'operazione da ripetere deve stare all'interno del ciclo for... tu invece la scrivi prima.. e quindi non ripete niente...un ciclo for correttamente stilato è:
Codice: Seleziona tutto
for(1=0; 1>19; i++) {
    Operazioni da ripetere
}


che nel tuo caso diventa:
Codice: Seleziona tutto
//RICEZIONE 20 BYTE DA SERIALE
for (i=0; i>19; i++;)   //ad ogni dato ricevuto incremento la viarbile i
    input[i]=getch();         //recupero carattere ricevuto sulla seriale
...:::Pivello allo sbaraglio:::...

MY WEBSITE! come and see... ;) <-- Di nuovo online... spiacente per i problemi tecnici!
Avatar utente
Foto Utentecrestus
1.295 2 7 13
Expert EY
Expert EY
 
Messaggi: 478
Iscritto il: 3 ott 2008, 10:28
Località: studente al politecnico di torino

0
voti

[9] Re: Memorizzare codice RFID...

Messaggioda Foto Utentericello9 » 15 mag 2011, 19:10

Ok, grazie.
Domani mattina lo provo subito.

Ciao
Marcello.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[10] Re: Memorizzare codice RFID...

Messaggioda Foto Utentec1b8 » 15 mag 2011, 19:31

Non so cosa faccia la getch() nel dettaglio, intendo dire quali flag controlli ecc, ma a mio avviso non è corretto il codice così come viene implementato.
Sintatticamente è corretto, il ciclo for per memorizze dati in un array è anche lui corretto, ma concettualmente è sbagliato eseguire quel codice all'interno della routine di interrupt, inoltre chi ci garantisce che i caratteri dalla seriale arrivino tutti così velocemente che il ciclo for sia in grado di leggerli? E' sicuramente più logico pensare che i caratteri arriveranno ad intervalli di tempo così lunghi da dover aspettare ogni carattere prima di leggerlo.
Bisogna quindi implementare un algoritmo diverso, senza l'utilizzo del for, per risolvere questo tipo di problemi.
Ad esempio si potrebbe dichiarare l'indice dell'array (la variabile i) come globale, azzerarla nel main, incrementarla ad ogni interrupt e contestualmente memorizzare il carattere ricevuto nell'array. Nel main controllare quando si sono ricevuti tutti i caratteri, quindi visualizzare il risultato e reimpostare l'indice.
Ma questo è solo un esempio di quello che si potrebbe fare.
Prova a stendere un po' di codice...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti