Rotor de antena
Fecha de publicación: 03-ago-2010 18:43:50
Este es el cógigo en CCS para programar un PIC16F883 para manejar un rotor de antena.
#include "rotor_v01.h"
#include <stdio.h>
#include <string.h>
#define LEDON output_high(PIN_C4) //enciende un led en el pin_c4
#define LEDOFF output_low(PIN_C4) //apaga el led
#define MOTOROFF output_low(PIN_C0) //salida para el relay que alimenta el motor pin_c0
#define MOTORON output_high(PIN_C0) //este es un relay simple
#define MOTORHO output_low(PIN_C1) //salida para el relay invierte el sentido de giro pin_c1
#define MOTORAHO output_high(PIN_C1) //este es un relay doble inversor
#define BT_IZ PIN_C2 //botón de sentido de giro izquierda
#define BT_DR PIN_C3 //botón de sentido de giro derecha
int valor=0x00;
/*
como el consumo del motor es variable, se toma un promedio de
10 mediciones para establilizar el valor del mismo
*/
void toma_adc(void){
int i; //0-255
int16 xxx=0; // 0-255<int16
valor=0;
// Lectura del canal 0
set_adc_channel(0);
for(i=0;i<10;i++) {
delay_ms(1);
xxx=xxx+read_adc();
delay_ms(1); //para que se estabilice
}
valor=xxx/10;
}
void main() {
int sentido;
int flag_motor;
setup_oscillator(OSC_4MHZ|OSC_INTRC);
setup_adc_ports(sAN0|VSS_VDD); //configuramos el pin A0 como analogico
setup_adc(ADC_CLOCK_INTERNAL); //configura el converso
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
set_tris_a(0b11111111); // 0 Salida - 1 Entrada
set_tris_c(0b10000000); //
delay_ms(10);
printf("inicializando \n\r");
sentido=0;
MOTORHO;
do {
toma_adc();
if (valor>=50) {
MOTOROFF;
delay_ms(200);
flag_motor=0;
printf("Motor off, Valor= %u \n\r",valor);
if (sentido==0) {
sentido=1;
MOTORAHO;
delay_ms(50);
MOTORON;
delay_ms(1000);
MOTOROFF;
delay_ms(50);
} else {
sentido=0;
MOTORHO;
delay_ms(50);
MOTORON;
delay_ms(1000);
MOTOROFF;
delay_ms(50);
}
printf("sentido = %u \n\r",sentido);
delay_ms(2000);
}
if (input(BT_IZ)==0) {
if (flag_motor==1) {
flag_motor=0;
MOTOROFF;
delay_ms(1000);
} else {
MOTORAHO;
sentido=1;
MOTORON;
flag_motor=1;
delay_ms(100);
}
}
if (input(BT_DR)==0) {
if (flag_motor==1) {
flag_motor=0;
MOTOROFF;
delay_ms(1000);
} else {
MOTORHO;
sentido=0;
MOTORON;
delay_ms(100);
flag_motor=1;
}
}
LEDON;
delay_ms(100);
LEDOFF;
delay_ms(100);
}while(true);
}
y para la configuración del rotor_v01.h
#include <16F887.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //Reset when brownout detected
#FUSES NOIESO //Internal External Switch Over mode enabled
#FUSES NOFCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=COM1)