Programació en C del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Mesurador de corrent elèctric

Programa del grup 1

En aquest cas el dispositiu mesura el corrent i en mostra el valor eficaç a la pantalla amb dos dígits decimals. Si es prem el polsador 0 la pantalla mostra, addicionalment, la potència consumida, sense decimals. A més, els LED s'encenen per indicar si el corrent és més o menys elevat.

Intensitat Nombre de LED
0 < I ≤ 2 A 1
2 < I ≤ 6 A 2
6 < I ≤ 11 A 3
I > 11 4

El programa és el següent:

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include <xc.h>
#include <math.h>
#define _XTAL_FREQ 4000000
#define numEsp 2
#define Polsador RA3        // Li assigna un nom a l'adreça del polsador
char Polsad;
char Ref = 0;
char a = 0;
unsigned int refer, mesura;
int Valor,intpot;
unsigned int suma = 0;
float mitjana, RMS, Val,pot;
unsigned char compta = 0;
char Digits[5]; // Reducir el tamaño del arreglo
void configuracio(void);
void auxiliar(void);
void Esborra(void);
void EnviaL(char Caracter);
void main(void) {
  configuracio();
  while (1) {
    if (compta == 32) {
      Esborra();
      mitjana = (float)suma / compta;
      Val = (30.0 / numEsp) * 5 * 1.1107 * mitjana / 1023.0;
      RMS = Val * 100;
      Valor = (int)round(RMS);
      pot=Val*230;
      intpot=(int)pot;
      if (Val < 2) {
        PORTC = 0b00000001;
      } else if (Val < 6) {
        PORTC = 0b00000011;
      } else if (Val < 11) {
        PORTC = 0b00000111;
      } else {
        PORTC = 0b00001111;
      }
      compta = 0;
      suma = 0;
      for (signed char j = 0; j < 5; j++) { // Reducir la cantidad de dígitos
        Digits[j] = Valor % 10 + '0';
        Valor /= 10;
      }
      if (Digits[4] == '0') {
        Digits[4] = ' ';
        if (Digits[3] == '0') {
          Digits[3] = ' ';
        }
      }
      for (signed char j = 4; j >= 0; j--) { // Modificar los índices para el nuevo tamaño del arreglo
        if (j == 1) {
          EnviaL(',');
        }
        EnviaL(Digits[j]);
      }
      EnviaL(' ');
      EnviaL('A');
      a=0;
    }
    if(a==0){
      if(Polsador==0){
        EnviaL(' ');
        EnviaL(intpot/100 + '0');
        EnviaL((intpot%100)/10+'0');
        EnviaL((intpot%10)+'0');
        EnviaL(' ');
        EnviaL('W');
        a=1;
        compta = 0;
        suma = 0;
      }
    }
    if(compta == 0) {
      auxiliar();
    }
  }
}
void __interrupt() temporit(void) {
  if (TMR1IF) {
    TMR1ON = 0;
    TMR1H = 253;
    TMR1L = 143;
    TMR1ON = 1;
    TMR1IF = 0;
    GO_DONE = 1;
    while (GO_DONE);
    mesura = (ADRESH << 8) | ADRESL;
    suma += abs(mesura - refer);
    compta++;
  }
  if (compta == 32) {
    TMR1ON = 0;
  }
}
void configuracio(void) {
  TRISC = 0b11110000;
  TRISB = 0;
  TRISA = 0xFF;
  __delay_ms(2000);
  BRGH = 1;
  BRG16 = 0;
  SPBRG = 25;
  SYNC = 0;
  TX9 = 0;
  SPEN = 1;
  TXEN = 1;
  ANSEL = 0b00000101;
  ANSELH = 0;
  ADCON1 = 0b00010000;
  ADCON0 = 0b00001001;
  INTCON = 0b01000000;
  PIE1 = 0b00000001;
  TMR1IF = 0;
  TMR1H = 253;
  TMR1L = 143;
  T1CON = 0b00000000;
  GIE = 1;
}
void auxiliar(void) {
  ADCON0 = 0b10100001;
  GO_DONE = 1;
  while (GO_DONE);
  GO_DONE = 1;
  while (GO_DONE);
  refer = (ADRESH << 8) | ADRESL;
  ADCON0 = 0b10100101;
  GO_DONE = 1;
  while (GO_DONE);
  __delay_ms(1000);
  TMR1H = 253;
  TMR1L = 143;
  TMR1ON = 1;
}
void EnviaL(char Caracter) {
  TXREG = Caracter;
  __delay_ms(1);
  while (!TXIF)
    ;
}
void Esborra(void) {
  EnviaL(254);
  EnviaL(1);
}

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.