Vai al contenuto
PLC Forum


Cerco ic logico una sola uscita attiva


Vicus

Messaggi consigliati


  • Risposte 78
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Vicus

    29

  • gabri-z

    22

  • dott.cicala

    19

  • Nik-nak

    2

Top Posters In This Topic

Posted Images

//##############################################################################
//                               Main Loop
//##############################################################################
     while(1){

     if (((portb&0X0F)!=0X0F)&((portb&0X0F)!=MASK))
         {
          porta=0;
          MASK= portb&0X0F;
          delay_ms(100);
         }
     switch (MASK){
        case 14:  porta=1;
        break;
        case 13:  porta=2;
        break;
        case 11:  porta=4;
        break;
        case 7:   porta=8;
        break;
     }
    }

 

Il codice pubblicato mesi fa era corretto.  Non andava d'accordo con lo schema che prevedeva i pulsanti su ingressi diversi.

 

Dimenticavo che lavoriamo in logica negata per via del pull up e quindi il pulsante chiude verso massa,

di conseguenza il valore da riconoscere è lo zero.

 

Qui sopra ho introdotto il ritardo richiesto.

 

I valori della maschera andranno adattai allo schema elettrico adottato.

 

Link al commento
Condividi su altri siti

Ecco il codice che utilizzerò se avete consigli sono i benvenuti.

    //******************************************************************************
// Project :            PlcForum Switcher
// Author  :            S.T.
// Date    :            26/03/2016
// MCU     :            PIC16F88 - INT.OSC. 4MHz
// Compiler:            MikroC PRO for PIC V6.6.2
//******************************************************************************
//****** TAGs ******************************************************************
// Inputs
   sbit P1       at RB4_BIT;
   sbit P2       at RB5_BIT;
   sbit P3       at RB6_BIT;
   sbit P4       at RB7_BIT;
// Stat
   unsigned int MASK;
   unsigned int MASK_OLD;
//******************************************************************************
//******************************************************************************
// Main program
//******************************************************************************
void main()
 {
//******************************************************************************
// Registro configurazione Oscillatore
//******************************************************************************
       OSCCON  = 0x4D;    // Int Osc 4 MHz
//******************************************************************************
// Registri configurazione PORT[A] - PORT[B]
//******************************************************************************
       ADCON0  = 0x00;    // Ingressi Anaogici OFF
       ADCON1  = 0x00;    // Ingressi Anaogici OFF
       ANSEL   = 0x00;    // Ingressi Anaogici OFF
       TRISA   = 0xF0;    // RA0-RA3=OUT
       TRISB   = 0xF0;    // RB4-RB7=INPUT RB0-RB3=OUTPUT
       PORTA   = 0x00;    // Clear PORT[A] all'accensione
       PORTB   = 0x00;    // Clear PORT[B] all'accensione
//******************************************************************************
//                            OPTION REGISTER
//******************************************************************************
       OPTION_REG  = 0X07;
//******************************************************************************
//                            INTCON REGISTER
//******************************************************************************
       INTCON      = 0X00;
//******************************************************************************
// Registri configurazione INTERRUPTS
//******************************************************************************
       PIE1        = 0X00;    // PERIPHERAL INTERRUPT ENABLE REGISTER 1
       PIE2        = 0X00;    // PERIPHERAL INTERRUPT ENABLE REGISTER 2
       PIR1        = 0X00;    // PERIPHERAL INTERRUPT REQUEST REGISTER 1
       PIR2        = 0X00;    // PERIPHERAL INTERRUPT REQUEST REGISTER 2
       PCON        = 0X00;    // POWER CONTROL REGISTER
//##############################################################################
//                               Main Loop
//##############################################################################
     while(1){
     MASK= portb & 0xf0;
     if (MASK==MASK_OLD) MASK=0;
     switch (MASK){
     case 224:
          porta=0;
          delay_ms(10);
          porta=1;
          portb=portb&0xF0;
          portb=portb|0x0E;
          MASK_OLD=MASK;
     break;
     case 208:
          porta=0;
          delay_ms(10);
          porta=2;
          portb=portb&0xF0;
          portb=portb|0x0D;
          MASK_OLD=MASK;
     break;
     case 176:
          porta=0;
          delay_ms(10);
          porta=4;
          portb=portb&0xF0;
          portb=portb|0x0B;
          MASK_OLD=MASK;
     break;
     case 112:
          porta=0;
          delay_ms(10);
          porta=8;
          portb=portb&0xF0;
          portb=portb|0x07;
          MASK_OLD=MASK;
     break;
     }
    }
}

 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...