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)