Sari la conținut
ELFORUM - Forumul electronistilor

temporizator cu PIC


dutu590

Postări Recomandate

  • Răspunsuri 13
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • dutu590

    7

  • digix

    3

  • mars01

    2

  • informer

    2

Top autori în acest subiect

100RON... :)

Mai mult pt. ca tre` sa-ti fac filmuletul demonstrativ decat pt. programul propriu zis....

Alternativ te pot/te putem ajuta sa-l faci singur, moka :) ....

Link spre comentariu

@dutu590,

Din diagrama nu este clar ce anume se repeta, dar uite cam cum arata o chestie simpla care se poate completa usor pentru a contine si bucla repetabila.

 

/*
   uC:         12F683
   Datasheet:  https://ww1.microchip.com/downloads/en/devicedoc/41211d_.pdf
   Freq:       INTOSC: 8MHZ
   Compiler:   mikroC for PIC
*/

#include <stdint.h>

#define True   1
#define False  0

#define ON     1
#define OFF    0

#define Q1     GP4_bit
#define Q2     GP5_bit

// values in seconds
#define PERIOD          5
#define DOUBLE_PERIOD   10
#define WAIT_TIME       1800

// timer variable
volatile uint32_t time = 0;

void wdt_reset() {
   asm CLRWDT;
}

void wdt_control(uint8_t val) {
   if (val == 0) {
      SWDTEN_bit = 0;
   }
   else {
      SWDTEN_bit = 1;
   }
}

void hw_init(){
   // init INTOSC at 8MHZ
   IRCF2_bit = 1;
   IRCF1_bit = 1;
   IRCF0_bit = 1;
   SCS_bit = 1;
   
   // prescaler attached to TIMER0
   PSA_bit = 0;
   
   // configure watchdog
   // WDT postscaler at 1: 65526 => ~2sec timeout
   WDTPS3_bit = 1;
   WDTPS2_bit = 0;
   WDTPS1_bit = 1;
   WDTPS0_bit = 1;
   
   // comparators OFF
   CM2_bit = 1;
   CM1_bit = 1;
   CM0_bit = 1;
   
   // ADC OFF
   ADON_bit = 0;
   
   // init GPIO
   // all pins are digital
   ANSEL = 0x00;
   // all pins are outputs
   TRISIO = 0x00;
   // all pins are LOW
   GPIO = 0x00;
   
   // Timer1 Interrupt Time : 100 ms
   T1CON = 0x21;
   TMR1IF_bit = 0;
   TMR1H = 0x3C;
   TMR1L = 0xB0;
   TMR1IE_bit = 1;
   INTCON = 0xC0;

}

uint32_t sec_time() {
   uint32_t temp_time = 0;
   GIE_bit = 0;
   temp_time = time;
   GIE_bit = 1;
   return temp_time;
}

void Interrupt() {
   static uint8_t counter = 0;
   if (TMR1IF_bit){
      TMR1IF_bit = 0;
      TMR1H = 0x3C;
      TMR1L = 0xB0;
      // increase time each 1 sec
      if (counter >= 10) {
         counter = 0;
         time++;
      }
      else counter++;
   }
}

void main() {
   uint32_t now = 0;
   
   // init hardware
   hw_init();
   // start watchdog
   wdt_control(1);
   
   /******************************************/
   /********** STARTUP SEQUENCE **************/
   /******************************************/
   // delay 5sec and then turn ON Q1
   now = sec_time();
   while(sec_time() < (now + PERIOD)){
      wdt_reset();
   }
   // turn Q1 ON
   Q1 = ON;
   
   // delay 5sec and then turn ON Q2
   time = 0;
   now = sec_time();
   while(sec_time() < (now + PERIOD)){
      wdt_reset();
   }
   // turn Q2 ON
   Q2 = ON;
   
   // delay 30 minutes
   time = 0;
   now = sec_time();
   while(sec_time() < (now + WAIT_TIME)){
      wdt_reset();
   }
   /******************************************/
   /********** END STARTUP SEQUENCE **********/
   /******************************************/
   
   // infinite loop
   while(True) {
   
   }

}

 

Link spre comentariu

ms mult.....poti trimite gata compilat, fisierul hexa, il scriu eu in PIC !

se repeta secventa de 30 minute, prima parte a temporizarii se refera strict la temporizari la alimentarea montajului ( PIC-ului ) !

nu stiu nimic programare !!!

Link spre comentariu

@mars01, parerea mea este ca avand in vedere ca nu se face decat o setare de pini la niste intervale, folosirea watchdog-ului si intreruperilor ii un pic de over-engineering... :).

Io inteleg ca acolo sunt de fapt cinci momente la care se comuta starea iesirilor (5s, 10s, 1810s, 1815s si 1820s) dupa care se repeta.

Incrementand un contor de la 0 in fiecare secunda si facand un switch(contor) pe valorile alea intr-un while infinit, totul se rezuma la un sfert de pagina... poate nu-i asa elegant dar sigur e suficient. 

Editat de informer
Link spre comentariu
Vizitator
Acest subiect este acum închis pentru alte răspunsuri.



×
×
  • 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