Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Serratura elettronica

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Serratura elettronica

Messaggioda Foto Utentebobina » 12 apr 2015, 21:25

WALTERmwp ha scritto:Potresti magari evitare quel
Codice: Seleziona tutto
break; // <<<<<<=== aggiunto break
?

Senza quel break la variabile code_ok rischia di tornare a 1 e dire che il codice è corretto quando l'ultima cifra viene messa corretta ed il resto sbagliato
Avatar utente
Foto Utentebobina
212 6
Frequentatore
Frequentatore
 
Messaggi: 177
Iscritto il: 27 dic 2009, 14:22

0
voti

[12] Re: Serratura elettronica

Messaggioda Foto UtenteWALTERmwp » 12 apr 2015, 21:29

Ciao Foto Utentebobina, la mia nota non è in merito alla funzione svolta dall'interruzione ma alla struttura del codice.
Un flusso, se gestito in modo coordinato, non dovrebbe richiedere quel tipo di intervento.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[13] Re: Serratura elettronica

Messaggioda Foto Utenteguidonetto » 12 apr 2015, 22:59

Ciao, ok ho fatto le modifiche, purtroppo non va.

Codice: Seleziona tutto
/*Nota: codice tratto da settorezero, riadattato da: StefA */

#include <xc.h>

#include "PIC18F4550_config.h"

#define  LCD_DEFAULT
#include "LCD_44780.h"
#include "LCD_44780.c"

#include "delay.h"
#include "delay.c"


//*************************************
//     Prototipi di funzione
//*************************************
void board_initialization (void);
//void serratura_elettronica (void);

/* tastierino numerico collegato su PORTB
uso un tastierino 4x4 (16 pulsanti)
Per comodità ho collegato il tastierino in questo modo
(C=colonna R=riga)
R1 = RB1
R2 = RB3
R3 = RB5
R4 = RB7
C1 = RB0
C2 = RB2
C3 = RB4
C4 = RB6
I pin di riga saranno input ed attiveremo le resistenze di pullup interne
i pin di colonna saranno output e messi a 1 di default
*/

/* Definisco un array, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le colonne una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore colMask[0] al valore colMask[3], porto a massa le colonne una alla volta. */
unsigned char colMask[]=
   {
   0b11111110, // Colonna 1 => RB0 a massa
   0b11111011, // Colonna 2 => RB2 a massa
   0b11101111, // Colonna 3 => RB4 a massa
   0b10111111 // Colonna 4 => RB6 a massa
   };
unsigned char colScan=0; // va da 0 a 3 per scansionare l'array colMask

/* Definisco un array, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le righe una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore rowMask[0] al valore rowMask[3], porto a massa le righe una alla volta. */
unsigned char rowMask[]=
   {
   0b00000010, // Riga 1
   0b00001000, // Riga 2
   0b00100000, // Riga 3
   0b10000000 // Riga 4
   };
unsigned char rowScan=0; // va da 0 a 3 per scansionare l'array rowMask

//Array che contiene i simboli disegnati sui pulsanti del tastierino, disposti in un certo ordine:
unsigned char keys[]={'1','4','7','*','2','5','8','0','3','6','9','#','A','B','C','D'};
unsigned char keypressed=0; // peso numerico del pulsante premuto
unsigned char keyok; // flag del pulsante premuto

//unsigned char x=1;
//unsigned char y=2;
//unsigned char z=3;

unsigned char k;

// Impostazione codice segreto e inizializzazione codice digitato

#define dim 4  // lunghezza del codice segreto
unsigned char key_code[dim] = {'1','2','3','4'};
unsigned char pressed_code[dim];
char code_index = 0;
char code_ok = 0;  // variabile per determinare se il codice è esatto



//*************************************
//     Programma principale
//*************************************
int main (void){

    unsigned char frase [] = "   StefA TEST   ";

    // Abilita i resistori di pull-up sulla PORTB
    INTCON2bits.RBPU = 0x00;

    keyok=0;

    board_initialization ();

    //serratura_elettronica ();

    // Inizializzo il display LCD con quarzo a 20MHz
    LCD_initialize (20);

    LCD_backlight (LCD_TURN_ON_LED);

    LCD_write_message ("Tastiera Matrice");

    LCD_goto_line (2);

    LCD_write_string (frase);

    delay_s(2);

    LCD_clear();

    LCD_write_message ("Premere un tasto");

    // Ciclo infinito
    while(1) {
        /*Effettuo la scansione delle colonne contando da zero a 3 e metto i relativi
         *pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
         *uso dell?array colMask */
        for (colScan=0; colScan<4; colScan++) // porto a massa una colonna alla volta
        {
            PORTB=0xFF; // porto tutte le colonne a 1
            PORTB &= colMask[colScan]; // porto a zero la colonna attuale

        /*Effettuo la scansione delle righe contando da zero a 3 e metto i relativi
         *pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
         *uso dell?array rowMask */
            for (rowScan=0; rowScan<4; rowScan++) {
                /*Controllo se la riga attuale si trova a massa effettuando un AND
                 *con l?elemento dell?array rowScan che mi permette di verificare soltanto
                 *il bit che mi interessa su tutta la porta */
                if (!(PORTB & rowMask[rowScan])) // Riga rowScan trovata a massa
                {
                    delay_ms(200); //Ritardo spike
                    if (!(PORTB & rowMask[rowScan])) {
                        /*Se viene confermato che un pulsante è stato premuto, imposto
                         *il valore che permette di risalire al tasto e indico al programma
                         *che un pulsante è stato premuto */
                        keypressed=rowScan+(4*colScan); // numero di pulsante premuto
                        keyok=1; // è stato premuto un pulsante
                    }
                }
            } // fine scansione righe
        }//for // fine scansione colonne

        if (keyok) // è stato premuto un pulsante
        {
             code_index++;   
            // Solo dopo che ho controllato in che punto si trova il
            // cursore posso piazzare il carattere premuto
            LCD_goto_line (2);
            LCD_write_char(keys[keypressed]);

            keyok=0; // resetto il flag del pulsante premuto

            // rimango in un ciclo continuo fino a che il pulsante non viene rilasciato
            PORTB=0b10101010;
            while(PORTB != 0b10101010)
                /*Se voglio che i simboli visualizzati siano senpre visibili sul
                 display (cioè cambino alla pressione del tasto) omettere:
                 LCD_goto_line (2);
                 LCD_write_message ("      ");*/
                LCD_goto_line (2);

            //delay_s(1);  //determino per quanto tempo voglio visualizzare il simbolo
             delay_ms(800);

                LCD_write_message ("      ");
                 //  {continue;}
        }//if (keyok)

        if (code_index == dim) {  // controllo codice
   for ( k=0; k<dim-1; k++) {

   if (key_code[k] == pressed_code[k]){
    code_ok = 1;
     }//if (code_index == dim
   else {  // cifra del codice errata, codice sbagliato
    code_ok = 0;  // codice errato, esce dal ciclo
       // break; // <<<<<<=== aggiunto break
     }//else
    }//for
if (code_ok == 1){  // se il codice è giusto accendo LATD0
  LATDbits.LATD0  = 1;
}//if (code_ok == 1
  else {
   LATDbits.LATD0 = 0;
  }//else
   code_ok = 0;  // resetto la variabile se il codice è giusto (cioè se code_ok era = 1)
   code_index = 0;  // resetto l'indice che scorre l'array del codice

     } // if (code_index == dim)
    }//while
}//main


//*************************************
//     Implementazione della funzione
//*************************************
void board_initialization (void) {
//******************//
//Impostazione porte//
//******************//
   // Imposto PORTA tutti ingressi
   LATA = 0x00;
   TRISA = 0x00;

   // Imposto PORTB
   LATB = 0x00;
   TRISB = 0b10101010;

   // Imposto PORTC tutti ingressi e RC1 come uscita
   LATC = 0x00;
   TRISC = 0b11111101;

   // Imposto PORTD tutte uscite
   LATD = 0x00;
   TRISD = 0x00;

   // Imposto PORTE tutti ingressi
   LATE = 0x00;
   TRISE = 0xFF;
}//void board_initialization (void)

//*************************************
//          Funzione serratura
//*************************************
//void serratura_elettronica (void){


     /*if ( tasto1 == 0 ) {
        //Questa funzione serve a far scorrere la scritta.
//x determina di quanto deve spostarsi la scritta.
//y se 1 la scritta scorre sopra, se 2 sotto.
LCD_goto_xy (x,2);
    LCD_write_message ("*");

  }//if
else {
// Altrimenti codice errato, led spento
LATAbits.LATA1 = 0;
     }//else

  if ( tasto2 == 0 ) {
        //Questa funzione serve a far scorrere la scritta.
//x determina di quanto deve spostarsi la scritta.
//y se 1 la scritta scorre sopra, se 2 sotto.
LCD_goto_xy (y,2);
    LCD_write_message ("*");

  }//if
else {
// Altrimenti codice errato, led spento
LATAbits.LATA1 = 0;
     }//else
  */

// }//void serratura_elettronica
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[14] Re: Serratura elettronica

Messaggioda Foto UtenteWALTERmwp » 12 apr 2015, 23:04

Post [10] ...
WALTERmwp ha scritto:Ciao guidonetto, ma esattamente, a prescindere, ora, dall'errore di compilazione puoi essere più chiaro nel descrivere quanto non corrisponde alle aspettative ?
...

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[15] Re: Serratura elettronica

Messaggioda Foto Utenteguidonetto » 12 apr 2015, 23:28

Ciao, vorrei che digitando il codice (1,2,3,4) sul tastierino si accendesse il led su LATD0 (a conferma che il codice è stato accettato).
Ora vedo solo i simboli e numeri digitati sulla tastiera a matrice.
Grazie.
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

1
voti

[16] Re: Serratura elettronica

Messaggioda Foto UtenteWALTERmwp » 12 apr 2015, 23:49

Intanto, per chiarire, se per esempio ...
Codice: Seleziona tutto
colScan==0 e
rowScan==1 tale per cui in base a ... keypressed=rowScan+(4*colScan);
allora
keypressed==1
essendo
unsigned char keys[]={'1','4','7','*','2','5','8','0','3','6','9','#','A','B','C','D'};
con l'istruzione
LCD_write_char(keys[keypressed]);
almeno sullo LCD visualizzi il carattere 4 (quattro) ?

Saluti

p.s.
lo aggiungo ora non avendo letto un riscontro di quanto, secondo me, ti ha fatto correttamente notare Foto UtenteDanteCpp:
una volta che hai gestito positivamente il test
Codice: Seleziona tutto
if (keyok) ...
, poi, le due variabili interessate dal successivo statement, ovvero
Codice: Seleziona tutto
if (code_index == dim)
quale valore potrebbero avere ?
Te lo chiedo perché non mi sembrano gestite.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[17] Re: Serratura elettronica

Messaggioda Foto Utentebobina » 13 apr 2015, 15:20

guidonetto ha scritto:Ciao, ok ho fatto le modifiche, purtroppo non va.
Sembra che tu fai le modifiche a caso senza leggere quello che ti viene detto. Nella speranza che cambiando qua e la comincia a funzionare. Nel linguaggio C anche un punto e virgola messo male cambia la seguenza di esecuzione. Ora il ciclo while che aspetta il rilascio del tasto manda il cursore continuamente alla riga 2.
Comunque un altro problema che ho trovato è che l'array pressed_code non viene modificato, dovrai inserirci i tasti che vengono premuti altrimenti questo if
Codice: Seleziona tutto
if (key_code[k] == pressed_code[k]){

non sarà mai true. Lascio a te il divertimento di trovare la posizione e come farlo.
Avatar utente
Foto Utentebobina
212 6
Frequentatore
Frequentatore
 
Messaggi: 177
Iscritto il: 27 dic 2009, 14:22

0
voti

[18] Re: Serratura elettronica

Messaggioda Foto Utenteguidonetto » 18 apr 2015, 9:17

Ciao, ora riesco ad accendere il led su LATDO tramite il tasto assegnato, non riesco ad accendere il led su LATCO con la sequenza dei tasti, mi date suggerimenti?

Codice: Seleziona tutto
/*Nota: codice tratto da settorezero, riadattato da: StefA */

#include <xc.h>

#include "PIC18F4550_config.h"

#define  LCD_DEFAULT
#include "LCD_44780.h"
#include "LCD_44780.c"

#include "delay.h"
#include "delay.c"


//*************************************
//     Prototipi di funzione
//*************************************
void board_initialization (void);
//void serratura_elettronica (void);

/* tastierino numerico collegato su PORTB
uso un tastierino 4x4 (16 pulsanti)
Per comodità ho collegato il tastierino in questo modo
(C=colonna R=riga)
R1 = RB1
R2 = RB3
R3 = RB5
R4 = RB7
C1 = RB0
C2 = RB2
C3 = RB4
C4 = RB6
I pin di riga saranno input ed attiveremo le resistenze di pullup interne
i pin di colonna saranno output e messi a 1 di default
*/

/* Definisco un array, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le colonne una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore colMask[0] al valore colMask[3], porto a massa le colonne una alla volta. */
unsigned char colMask[]=
   {
   0b11111110, // Colonna 1 => RB0 a massa
   0b11111011, // Colonna 2 => RB2 a massa
   0b11101111, // Colonna 3 => RB4 a massa
   0b10111111 // Colonna 4 => RB6 a massa
   };
unsigned char colScan=0; // va da 0 a 3 per scansionare l'array colMask

/* Definisco un array, che scansiona con un ciclo FOR, esso permette di mettere a massa
* le righe una alla volta e riporta a livello logico alto le altre.
* Andando quindi dal valore rowMask[0] al valore rowMask[3], porto a massa le righe una alla volta. */
unsigned char rowMask[]=
   {
   0b00000010, // Riga 1
   0b00001000, // Riga 2
   0b00100000, // Riga 3
   0b10000000 // Riga 4
   };
unsigned char rowScan=0; // va da 0 a 3 per scansionare l'array rowMask

//Array che contiene i simboli disegnati sui pulsanti del tastierino, disposti in un certo ordine:
unsigned char keys[16]={'1','4','7','*','2','5','8','0','3','6','9','#','A','B','C','D'};
unsigned char keypressed=0; // peso numerico del pulsante premuto
unsigned char keyok; // flag del pulsante premuto

#define cod 4  // lunghezza del codice segreto
// Impostazione codice segreto e inizializzazione codice digitato
unsigned char codice[cod] = {0,4,8,12};



//*************************************
//     Programma principale
//*************************************
int main (void){

    unsigned char frase [] = "   StefA TEST   ";

    // Abilita i resistori di pull-up sulla PORTB
    INTCON2bits.RBPU = 0x00;

    keyok=0;

    board_initialization ();

    //serratura_elettronica ();

    // Inizializzo il display LCD con quarzo a 20MHz
    LCD_initialize (20);

    LCD_backlight (LCD_TURN_ON_LED);

    LCD_write_message ("Tastiera Matrice");

    LCD_goto_line (2);

    LCD_write_string (frase);

    delay_s(2);

    LCD_clear();

    LCD_write_message ("Premere un tasto");

    // Ciclo infinito
    while(1) {
        /*Effettuo la scansione delle colonne contando da zero a 3 e metto i relativi
         *pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
         *uso dell?array colMask */
        for (colScan=0; colScan<4; colScan++) // porto a massa una colonna alla volta
        {
            PORTB=0xFF; // porto tutte le colonne a 1
            PORTB &= colMask[colScan]; // porto a zero la colonna attuale

        /*Effettuo la scansione delle righe contando da zero a 3 e metto i relativi
         *pin a livello logico basso uno alla volta, ripristinando a 1 gli altri facendo
         *uso dell?array rowMask */
            for (rowScan=0; rowScan<4; rowScan++) {
                /*Controllo se la riga attuale si trova a massa effettuando un AND
                 *con l?elemento dell?array rowScan che mi permette di verificare soltanto
                 *il bit che mi interessa su tutta la porta */
                if (!(PORTB & rowMask[rowScan])) // Riga rowScan trovata a massa
                {
                    delay_ms(200); //Ritardo spike
                    if (!(PORTB & rowMask[rowScan])) {
                        /*Se viene confermato che un pulsante è stato premuto, imposto
                         *il valore che permette di risalire al tasto e indico al programma
                         *che un pulsante è stato premuto */
                        keypressed=rowScan+(4*colScan); // numero del pulsante premuto
                        keyok=1; // è stato premuto un pulsante
                    }
                }
            } // fine scansione righe
        }//for // fine scansione colonne

        if (keyok) // è stato premuto un pulsante
        {           
            // Solo dopo che ho controllato in che punto si trova il
            // cursore posso piazzare il carattere premuto
            LCD_goto_line (2);           
            LCD_write_char(keys[keypressed]);

            if (keypressed == 0){ // Numero tasto premuto meno uno (si conta anche lo zero)           
            LCD_goto_line (2);
            LCD_write_message ("*");//Nascondo il carattere
            LATDbits.LATD0 = 1;//accendo led           
            }//if
           
             if (keypressed == 4){ // Numero tasto premuto meno uno (si conta anche lo zero)                     
            LCD_goto_line (2);
            LCD_write_message (" *");//Nascondo il carattere
            LATDbits.LATD0 = 1;//accendo led           
            }//if

            if (keypressed == 8){ // Numero tasto premuto meno uno (si conta anche lo zero)           
            LCD_goto_line (2);
            LCD_write_message ("  *");//Nascondo il carattere
            LATDbits.LATD0 = 1;//accendo led
            }//if

             if (keypressed == 12){ // Numero tasto premuto meno uno (si conta anche lo zero)           
            LCD_goto_line (2);
            LCD_write_message ("   *");//Nascondo il carattere
            LATDbits.LATD0 = 1;//accendo led
            }//if

            if (keypressed == cod){ // Numero tasto premuto meno uno (si conta anche lo zero)
            LCD_goto_line (2);
            LCD_write_message ("    *");//Nascondo il carattere           
            LATCbits.LATC0 = 1;//accendo led
            }//if
           
            keyok=0; // resetto il flag del pulsante premuto

            // rimango in un ciclo continuo fino a che il pulsante non viene rilasciato
            PORTB=0b10101010;
            while(PORTB != 0b10101010)
                /*Se voglio che i simboli visualizzati siano senpre visibili sul
                 display (cioè cambino alla pressione del tasto) omettere:
                 LCD_goto_line (2);
                 LCD_write_message ("      ");*/
                LCD_goto_line (2);

            //delay_s(1);  //determino per quanto tempo voglio visualizzare il simbolo
             delay_ms(800);

                LCD_write_message ("      ");
                 //  {continue;}
        }//if (keyok)     
       
        else{
         LATDbits.LATD0 = 0;//Spengo led
         LATCbits.LATC0 = 0;//Spengo led
        }//else
    }//while
}//main


//*************************************
//     Implementazione della funzione
//*************************************
void board_initialization (void) {
//******************//
//Impostazione porte//
//******************//
   // Imposto PORTA tutti ingressi
   LATA = 0x00;
   TRISA = 0xFF;

   // Imposto PORTB
   LATB = 0x00;
   TRISB = 0b10101010;

   // Imposto PORTC tutti ingressi e RC1 e RC0 come uscita
   LATC = 0x00;
   TRISC = 0b11111100;

   // Imposto PORTD tutte uscite
   LATD = 0x00;
   TRISD = 0x00;

   // Imposto PORTE tutti ingressi
   LATE = 0x00;
   TRISE = 0xFF;
}//void board_initialization (void)


Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[19] Re: Serratura elettronica

Messaggioda Foto UtenteWALTERmwp » 20 apr 2015, 22:03

guidonetto ha scritto:non riesco ad accendere il LED su LATCO con la sequenza dei tasti, mi date suggerimenti?
nel frattempo che ci spieghi con "sequenza" cosa esattamente intendi provo a fare "due" ipotesi:
i) non premi il pulsante che soddisfa la condizione
Codice: Seleziona tutto
if (keypressed == cod){ ...
ii) quello che premi soddisfa una delle precedenti ma non "cod", cioè non la (i), quindi vedi sempre accendersi il primo led (porta D) ma non il secondo (porta C)
iii) il led sulla porta C non è collegato correttamente
iv) hai compromesso l'ouput della porta C.

I due led(s) come sono collegati ?
Per come hai scritto il codice, premendo tutti i pulsanti della tastiera, dovresti "prendere" quello giusto.

Saluti

p.s.
sullo LCD cosa visualizzi quando ti si dovrebbe accendere il led della porta C ?
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite