Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Controllo ingressi Porta

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 2 mag 2020, 17:16

Buongiorno a tutti e scusate la banalità della mia domanda...
Sono alle prime armi con la programmazione embedded, ho abbozzato questo codice (in calce) perché ho bisogno di controllare quando una porta del PIC presenta uno degli ingressi a zero (per esempio perché c'è un pulsante che porta a zero l'ingresso o perché viene a mancare la 5 VCC).
perché se controllo solo un pin funziona perfettamente mentre se duplico il codice per i restanti ingressi funziona ma il led anzichè restare acceso fisso mi lampeggia?
Grazie a tutti e tenete conto che sono alle prime armi, spiegatemi meglio che potete e ditemi per favore dov'è l'errore.

Grazie O_/


Codice: Seleziona tutto
//************************************************************
//
// modulo:      main.c
// autore:      Luciano
// mcu:         PIC16F887
// clock:       esterno @ 20MHz
// board:       
// compilatore: Microchip XC8 (2.20)
// ide:         MPLAB X IDE (5.30)
// programm.:   PICkit 2
//
//************************************************************


#include "conf_16f887.h"
#define _XTAL_FREQ 20000000
#include <xc.h>

#define BUTTON1   PORTBbits.RB0
#define BUTTON2   PORTBbits.RB1
#define BUTTON3   PORTBbits.RB2
#define BUTTON4   PORTBbits.RB3
#define BUTTON5   PORTBbits.RB4
#define BUTTON6   PORTBbits.RB5
#define BUTTON7   PORTBbits.RB6
#define BUTTON8   PORTBbits.RB7
#define LED1   PORTDbits.RD0


// prototipi funzione
void settings(void);


Codice: Seleziona tutto
int main(void)
    {
    settings();
   
    while(1)
        {
        // pulsante 1 - led 1
        // il led si accende su pressione del pulsante e si spegne
        // non appena si rilascia il pulsante.
        if (!BUTTON1)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON1)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }

        if (!BUTTON2)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON2)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
       
        if (!BUTTON3)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON3)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
       
        if (!BUTTON4)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON4)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }

        if (!BUTTON5)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON5)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
       
        if (!BUTTON6)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON6)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
               
       
        if (!BUTTON7)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON7)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
       
            if (!BUTTON8)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!BUTTON8)
                {
                LED1=1; // accendo il led
                __delay_ms(50);
                }
            }
        else // pulsante non premuto, spengo il led
            {
            LED1=0;
            }
        }// fine ciclo infinito
    }// fine main


Codice: Seleziona tutto
void settings(void)
    {
    ANSEL=0; // pins A/D (0-7) come digitali
    ANSELH=0; // pins A/D (8-13) come digitali
    ADCON0bits.ADON=0; // modulo AD spento

    TRISA=0xFF;
    TRISB=0xFF; // RB0-RB7 come ingressi => pulsanti
    TRISC=0xFF;
    TRISD=0b00000000; // RD0 come uscita => led
    TRISE=0xFF;
   
    // Led spento all'avvio
    LED1=0;
   
    }
Ultima modifica di Foto UtenteWALTERmwp il 2 mag 2020, 19:36, modificato 1 volta in totale.
Motivazione: Inserito codice nei Tag Code
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

0
voti

[2] Re: Controllo ingressi Porta

Messaggioda Foto UtenteIlGuru » 2 mag 2020, 18:39

Perché se gli altri pulsanti non sono premuti spengono il led?
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32

0
voti

[3] Re: Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 2 mag 2020, 18:41

Credo che una possibile soluzione sia operare in bitwise (mi pare si dica così) e con operatori AND...
Potrebbe essere questa una soluzione?
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

0
voti

[4] Re: Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 2 mag 2020, 18:43

IlGuru ha scritto:Perché se gli altri pulsanti non sono premuti spengono il led?

No, il LED è inizialmente spento, come deve essere, premendo un pulsante il LED giustamente si accende ma "lampeggia" mentre se lascio solo un pulsante anziché tutti e 8 il LED si accende regolarmente (senza lampeggio}.
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

0
voti

[5] Re: Controllo ingressi Porta

Messaggioda Foto UtenteIlGuru » 2 mag 2020, 19:09

Quelle if sono all'interno di un loop infinito dato dal ciclo while.
Se il primo if accende il led, le if successive lo spengono, poi il ciclo ricomincia e il primo if lo riaccende.
Se c'è solo il primo if nel ciclo while lo tiene acceso.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32

0
voti

[6] Re: Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 2 mag 2020, 19:17

Grazie mille IlGuru... in effetti stavo pensando di cambiare radicalmente e stavo leggendo un articolo sulle operazioni in bitwise che forse potrebbero fare al caso mio... Secondo te è questa la strada corretta?
Nel mio caso, avrei bisogno che il led su RD0 si accendesse qualora un ingresso non fosse più allo stato logico alto... come potrei risolvere?
Grazie comunque della tua risposta riguardo gli IF.
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

0
voti

[7] Re: Controllo ingressi Porta

Messaggioda Foto UtenteIlGuru » 2 mag 2020, 22:55

Lascia solo una di quelle if e mettici dentro !PORTBbits
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32

0
voti

[8] Re: Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 2 mag 2020, 23:30

Grazie, potresti essere più preciso? Potresti scrivere una o due righe di codice? So che PORTBbits punta al singolo ingresso, come lo scrivo L'IF per controllarli tutti?
Grazie.
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

1
voti

[9] Re: Controllo ingressi Porta

Messaggioda Foto UtenteBelluno1961 » 3 mag 2020, 9:19

IlGuru ha scritto:Lascia solo una di quelle if e mettici dentro !PORTBbits

Grazie IlGuru...
in attesa ho fatto alcune prove e ho risolto così:

Codice: Seleziona tutto
while(1)
        {
        // pulsante 1 - led 1
        // il led si accende su pressione del pulsante e si spegne
        // non appena si rilascia il pulsante.
        if (!PORTBbits.RB0||!PORTBbits.RB1||!PORTBbits.RB2||!PORTBbits.RB3||!PORTBbits.RB4||!PORTBbits.RB5||!PORTBbits.RB6||!PORTBbits.RB7)
            {
            __delay_ms(100); // ritardo per antirimbalzo
            // se dopo 100ms il pulsante è ancora premuto, allora non si
            // tratta di un rimbalzo
            if (!PORTBbits.RB0||!PORTBbits.RB1||!PORTBbits.RB2||!PORTBbits.RB3||!PORTBbits.RB4||!PORTBbits.RB5||!PORTBbits.RB6||!PORTBbits.RB7)
                {
                LED1=1; // accendo il led
                }
            else {
LED1=0; //
}


Se ti sembra una soluzione ortodossa... Grazie per l'aiuto!
Ultima modifica di Foto Utentewruggeri il 3 mag 2020, 9:52, modificato 1 volta in totale.
Motivazione: Tag per il codice
Avatar utente
Foto UtenteBelluno1961
10 2
 
Messaggi: 7
Iscritto il: 2 mag 2020, 11:18

0
voti

[10] Re: Controllo ingressi Porta

Messaggioda Foto UtenteWALTERmwp » 3 mag 2020, 16:03

Funzionalità e ottimizzazione sono altra cosa, ma così fa comunque quello che volevi ottenere.
Bravo.

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

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti