Sari la conținut
ELFORUM - Forumul electronistilor

protectie


Seppy

Postări Recomandate

Buna seara,

doresc sa realizez un mic montaj cu un PIC12F675 cu doua intrari si doua iesiri ,care ar trebui sa faca urmatoarele: -la aplicarea unui impuls pe o intrarea 1 sa comute iesirea 1 pe ON

-la aplicarea unui impuls pe intrarea 2 sa comute iesirea 1 pe OFF

-daca de la aplicarea impulsului pe In 1 pana la sosirea impulsului pe In2 trece mai mult de 90 secunde se activeaza iesirea 2 si dezactiveaza iesirea 1 si ramane in aceasta stare pana la reset .

 

am desenat o mica schema de mana ">http://9tk9wo.jpg

 

Multumesc !

Editat de Seppy
Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    4

  • Seppy

    4

  • mars01

    4

  • jeltopop pop

    2

Top autori în acest subiect

Salut!

 

compilator mikroC for PIC 7.1.0

arhiva contine proiect mikroC (inclusiv fisier .HEX) si simulare Proteus 8.6 SP3

#define IN1    GP5_bit
#define IN2    GP4_bit

#define OUT1   GP0_bit
#define OUT2   GP1_bit

#define OFF    0
#define ON     1

#define INPUT  1
#define OUTPUT 0

#define APASAT    0
#define NEAPASAT  1

unsigned char old_IN1 = NEAPASAT;
unsigned char old_IN2 = NEAPASAT;

volatile unsigned int counter = 0;

void initializare()
{
   ADON_bit = 0;  // ADC OFF
   ANSEL = 0;     // GPIO is digital I/O
   CMCON = 7;     // Comparator disabled

   TRISIO5_bit = INPUT;
   TRISIO4_bit = INPUT;
   TRISIO0_bit = OUTPUT;
   TRISIO1_bit = OUTPUT;

   OUT1 = OFF;
   OUT2 = OFF;
   
   WPU5_bit = 1;  // pull-up resistor ON
   WPU4_bit = 1;  // pull-up resistor ON

   //Timer1
   //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
   T1CON = 0x11;
   TMR1IF_bit = 0;   // clear TMR1 Interrupt flag
   TMR1H = 0x3C;     // preload TMR counters
   TMR1L = 0xB0;
}

void Interrupt(){
   if (TMR1IF_bit && TMR1IE_bit)
   {
      TMR1IF_bit = 0;
      TMR1H	 = 0x3C;
      TMR1L	 = 0xB0;
      if (counter == 900)  // 900 * 100ms = 90000ms = 90sec
      {
         counter = 0;
         OUT2 = ON;
         OUT1 = OFF;
         GIE_bit = 0;      // disable global interrupts
         while(1);         // stai in bucla pana la RESET
      }
      else
      {
         counter++;
      }
   }
}

void main() {
   initializare();
   while(1)
   {
      if (IN1 == APASAT)
      {
        delay_ms(10);
        if ((IN1 == APASAT) && (old_IN1 == NEAPASAT))
        {
           OUT1 = ON;
           TMR1IE_bit = 1;   // enable TMR1
           PEIE_bit = 1;
           GIE_bit = 1;      // enable global interrupts
        }
      }
      old_IN1 = IN1;

      if (IN2 == APASAT)
      {
        delay_ms(10);
        if ((IN2 == APASAT) && (old_IN2 == NEAPASAT))
        {
           OUT1 = OFF;
           counter = 0;
           TMR1IE_bit = 0;   // disable TMR1
           GIE_bit = 0;      // disable global interrupts
        }
      }
      old_IN2 = IN2;
   }

}

protectie_seppy.zip

Editat de mars01
Link spre comentariu

Buna ziua ,

 

am incercat varianta lui mars01 si merge exact cum am dorit , o sa incerc si varianta lui Elison ,( dupa schema data functioneaza cu impuls pozitiv ), oricum gasesc aplicatie si pentru varianta asta

 

Multumesc mult D-lui Elison si mars01 pentru ajutor !

Link spre comentariu

Ca si un exemplu util, am modificat programul astfel incat sa fie usor portabil pentru alt compilator C pentru controlore pe 8bit sau de ce nu, pentru alt controler PIC.

Tot ce trebuie modificat sunt #define-urile de la inceput ca sa corespunda pentru nou controler/compilator. Aceasta se face cu datasheet-ul in brate.

// #defines for the key words
#define IN1    GP5_bit
#define IN2    GP4_bit

#define RELEU   GP0_bit
#define ERROR   GP1_bit

#define ADON_BIT     ADON_bit
#define ANSEL_REG    ANSEL
#define CMCON_REG    CMCON
#define IN1_DIR      TRISIO5_bit
#define IN2_DIR      TRISIO4_bit
#define RELEU_DIR    TRISIO0_bit
#define ERROR_DIR    TRISIO1_bit
#define PULLUP_IN1   WPU5_bit
#define PULLUP_IN2   WPU4_bit

#define TMR_CONTROL_REG       T1CON
#define TMR_IF_BIT            TMR1IF_bit
#define TMR_ON_OFF_BIT        TMR1IE_bit
#define TMR_HIGH_REG          TMR1H
#define TMR_LOW_REG           TMR1L
#define INT_ENABLE_BIT        GIE_bit
#define PERIF_INT_ENABLE_BIT  PEIE_bit
#define ISR()                 Interrupt()
#define delay_ms(x)           delay_ms(x) // verificati daca compilatorul are functie de delay si daca da care este numele
// end for defines of the keywords

#define OFF    0
#define ON     1

#define INPUT  1
#define OUTPUT 0

#define APASAT    0
#define NEAPASAT  1

unsigned char old_IN1 = NEAPASAT;
unsigned char old_IN2 = NEAPASAT;

volatile unsigned int counter = 0;

void initializare()
{
   ADON_BIT = OFF;     // ADC OFF
   ANSEL_REG = OFF;    // GPIO is digital I/O
   CMCON_REG = 7;      // Comparator disabled

   IN1_DIR = INPUT;
   IN2_DIR = INPUT;
   RELEU_DIR = OUTPUT;
   ERROR_DIR = OUTPUT;

   RELEU = OFF;
   ERROR = OFF;
   
   PULLUP_IN1 = ON;         // pull-up resistor ON
   PULLUP_IN2 = ON;         // pull-up resistor ON

   //Timer1
   //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
   TMR_CONTROL_REG = 0x11;
   TMR_IF_BIT = OFF;        // clear TMR1 Interrupt flag
   TMR_HIGH_REG = 0x3C;     // preload TMR counters
   TMR_LOW_REG = 0xB0;
}

void ISR()
{
   if (TMR_IF_BIT && TMR_ON_OFF_BIT)
   {
      TMR_IF_BIT = OFF;
      TMR_HIGH_REG = 0x3C;
      TMR_LOW_REG = 0xB0;
      if (counter == 900)  // 900 * 100ms = 90000ms = 90sec
      {
         INT_ENABLE_BIT = OFF;      // disable global interrupts
         counter = 0;
         ERROR = ON;
         RELEU = OFF;
         while(1);                  // stai in bucla pana la RESET
      }
      else
      {
         counter++;
      }
   }
}

void main() 
{
   initializare();
   while(1)
   {
      if (IN1 == APASAT)
      {
        delay_ms(10);
        if ((IN1 == APASAT) && (old_IN1 == NEAPASAT))
        {
           RELEU = ON;
           TMR_ON_OFF_BIT = ON;        // enable TMR1
           PERIF_INT_ENABLE_BIT = ON;  // enable peripheral interrupts
           INT_ENABLE_BIT = ON;        // enable global interrupts
        }
      }
      old_IN1 = IN1;

      if (IN2 == APASAT)
      {
        delay_ms(10);
        if ((IN2 == APASAT) && (old_IN2 == NEAPASAT))
        {
           TMR_ON_OFF_BIT = OFF;   // disable TMR1
           INT_ENABLE_BIT = OFF;   // disable global interrupts
           TMR_HIGH_REG = 0x3C;
           TMR_LOW_REG = 0xB0;
           RELEU = OFF;
           counter = 0;
        }
      }
      old_IN2 = IN2;
   }
}

LE:

Si fiindca este vorba de protectie am activat watchdog-ul astfel incat in caz de interferente si blocare sa se autoreseteze. Atasat este proiectul mikroC for PIC 7.1.0 cu watchdog activat.

// #defines for the key words
#define IN1    GP5_bit
#define IN2    GP4_bit

#define RELEU   GP0_bit
#define ERROR   GP1_bit

#define ADON_BIT     ADON_bit
#define ANSEL_REG    ANSEL
#define CMCON_REG    CMCON
#define IN1_DIR      TRISIO5_bit
#define IN2_DIR      TRISIO4_bit
#define RELEU_DIR    TRISIO0_bit
#define ERROR_DIR    TRISIO1_bit
#define PULLUP_IN1   WPU5_bit
#define PULLUP_IN2   WPU4_bit

#define TMR_CONTROL_REG       T1CON
#define TMR_IF_BIT            TMR1IF_bit
#define TMR_ON_OFF_BIT        TMR1IE_bit
#define TMR_HIGH_REG          TMR1H
#define TMR_LOW_REG           TMR1L
#define INT_ENABLE_BIT        GIE_bit
#define PERIF_INT_ENABLE_BIT  PEIE_bit
#define ISR()                 Interrupt()
#define delay_ms(x)           delay_ms(x) // verificati daca compilatorul are functie de delay si daca da care este numele

#define WDOG_PRESCALER_BIT    PSA_bit
#define PRESCALER_BIT2        PS2_bit
#define PRESCALER_BIT1        PS1_bit
#define PRESCALER_BIT0        PS0_bit
// end for defines of the keywords

#define OFF    0
#define ON     1

#define INPUT  1
#define OUTPUT 0

#define APASAT    0
#define NEAPASAT  1

unsigned char old_IN1 = NEAPASAT;
unsigned char old_IN2 = NEAPASAT;

volatile unsigned int counter = 0;

void initializare()
{
   ADON_BIT = OFF;            // ADC OFF
   ANSEL_REG = OFF;           // GPIO is digital I/O
   CMCON_REG = 7;             // Comparator disabled
   
// watchdog timeout is at 18ms * 4(from prescaler) = 72ms
   PRESCALER_BIT2 = 0;
   PRESCALER_BIT1 = 1;
   PRESCALER_BIT0 = 0;

   WDOG_PRESCALER_BIT = ON; // Prescaler asignat catre WATCHDOG

   IN1_DIR = INPUT;
   IN2_DIR = INPUT;
   RELEU_DIR = OUTPUT;
   ERROR_DIR = OUTPUT;

   RELEU = OFF;
   ERROR = OFF;
   
   PULLUP_IN1 = ON;  // pull-up resistor ON
   PULLUP_IN2 = ON;  // pull-up resistor ON

   //Timer1
   //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
   TMR_CONTROL_REG = 0x11;
   TMR_IF_BIT = 0;   // clear TMR1 Interrupt flag
   TMR_HIGH_REG = 0x3C;     // preload TMR counters
   TMR_LOW_REG = 0xB0;
   asm CLRWDT;
}

void ISR()
{
   if (TMR_IF_BIT && TMR_ON_OFF_BIT)
   {
      TMR_IF_BIT = 0;
      asm CLRWDT;
      TMR_HIGH_REG = 0x3C;
      TMR_LOW_REG = 0xB0;
      if (counter == 900)  // 900 * 100ms = 90000ms = 90sec
      {
         INT_ENABLE_BIT = OFF;      // disable global interrupts
         counter = 0;
         ERROR = ON;
         RELEU = OFF;
         while(1)                  // stai in bucla pana la RESET
         {
            asm CLRWDT;
         }
      }
      else
      {
         counter++;
      }
   }
}

void main() 
{
   asm CLRWDT;                // clear watchdog (adica da-i peste bot sa nu latre)
   initializare();
   while(1)
   {
      if (IN1 == APASAT)
      {
        delay_ms(10);
        if ((IN1 == APASAT) && (old_IN1 == NEAPASAT))
        {
           asm CLRWDT;
           RELEU = ON;
           TMR_ON_OFF_BIT = ON;        // enable TMR1
           PERIF_INT_ENABLE_BIT = ON;  // enable peripheral interrupts
           INT_ENABLE_BIT = ON;        // enable global interrupts
        }
      }
      old_IN1 = IN1;
      asm CLRWDT;
      
      if (IN2 == APASAT)
      {
        delay_ms(10);
        if ((IN2 == APASAT) && (old_IN2 == NEAPASAT))
        {
           asm CLRWDT;
           TMR_ON_OFF_BIT = OFF;   // disable TMR1
           INT_ENABLE_BIT = OFF;   // disable global interrupts
           TMR_HIGH_REG = 0x3C;
           TMR_LOW_REG = 0xB0;
           RELEU = OFF;
           counter = 0;
        }
      }
      old_IN2 = IN2;
      asm CLRWDT;
   }
}

protectie_seppy.rar

Editat de mars01
Link spre comentariu

La mine o configuratie "multi-pic" arata cam asa:

#if defined(_PIC18F14K50_H_)
#define LN_FIFO_LEN              100
#define LN_COMMAND_MAX_NR        LN_FIFO_LEN/2
#define LN_MAX_NR_REC_MESS       10
#define SENSORS_PORT             PORTC
#define SENSORS_TRIS             TRISC
#define SENSORS_LAT              LATC
#define NR_OF_PORTS                 8
#elif defined(_PIC18F13K50_H_)
#define LN_FIFO_LEN              50
#define LN_COMMAND_MAX_NR        LN_FIFO_LEN/2
#define LN_MAX_NR_REC_MESS       5
#define SENSORS_PORT             PORTC
#define SENSORS_TRIS             TRISC
#define SENSORS_LAT              LATC
#define NR_OF_PORTS                 8
#elif defined(_PIC16F877_H_) || defined(_PIC16F877A_H_)
#define LN_FIFO_LEN        6
#define LN_COMMAND_MAX_NR        3 //LN_FIFO_LEN/2
#define LN_MAX_NR_REC_MESS       2
#define SENSORS_PORT             PORTD
#define SENSORS_TRIS             TRISD
#define SENSORS_PORT2            PORTB
#define SENSORS_TRIS2            TRISB
#define NR_OF_PORTS              16
#elif defined(_PIC18F452_H_)
#define LN_FIFO_LEN              100
#define LN_COMMAND_MAX_NR        LN_FIFO_LEN/2
#define LN_MAX_NR_REC_MESS       10
#define SENSORS_PORT             PORTD
#define SENSORS_TRIS             TRISD
#define SENSORS_LAT              LATD
#define SENSORS_PORT2            PORTB
#define SENSORS_TRIS2            TRISB
#define SENSORS_LAT2             LATB
#define NR_OF_PORTS                 8
#endif



Link spre comentariu

Pai n-am facut pentru tot ce produce uChip, clar, ci pentru controllerele care ma interesau pe mine (ce am prin sertare si n-ar strica sa se consume :)).

Editat de Liviu M
Link spre comentariu

Multumesc ,

am incercat si varianta asta cu watchdog si functioneaza bine ,Aceasta varianta de program o sa ramana in microcontroller definitiv , acum proiectez cablajul

Link spre comentariu

mars01, in versiunea cu 'latrat', mai aveai putin si puneai "asm CLRWDT;" dupa fiecare instructiune.

Daca watchdog este la 72ms iar tu ai 2 x 10ms debounce in while(1), pentru ce atata CLRWDT ?

Link spre comentariu

Ah, am mai avut un coleg care se impiedica de orice virgula in programele altora.

Problema e ca avea de criticat in programele (functionale ale) altora, dar programele lui nu le-a vazut nimeni.

E un forum (destul de) liber. Ai voie sa postezi si variantele tale super logice alaturi de cele mai putin logice.

Editat de Liviu M
Link spre comentariu

jeltopop, cand adaug instructiunea de reset a watchdog-ului in program fac cam cum fac cand pun sare in ciorba: le presar .... un praf aici, unu' acolo. Miam... ce-mi place sarea-n bucate .... :)

Editat de mars01
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări