Projeto 5: Controle de Servo-motor por transmissão e recepção

21/12/2016

PIC18F4431

//CONTROLADOR 1 - TRANSMISSÃO
#include<p18f4431.h>#include<delays.h>
#include<xlcd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<usart.h>
int val_1=0;
float val_2=10.00;
void delay_ms(unsigned int tempo_ms)
{
while(tempo_ms)
{
tempo_ms--;
Delay10TCYx(200); //gera atraso de 1ms
}
}
//INICIO DEFINIÇÕES DO LCD//
#define limpar_LCD WriteCmdXLCD(0x01)
void gotoxy(int linha_LCD , int coluna_LCD) // Situa cursor en x,y
{
if(linha_LCD == 1) {
while(BusyXLCD());
SetDDRamAddr(0x80 ' coluna_LCD); // Cursor en linea 1
DelayPORXLCD();
}
else {
while(BusyXLCD());
SetDDRamAddr(0xC0 ' coluna_LCD); // Cursor en linea 2
DelayPORXLCD();
}
}
void escreve_LCD(char out[16])
{
char msg[16];
sprintf(msg,out);
putsXLCD(msg);
}
void variavelINT_LCD(long int valorvariavel)
{
char out2[16];
itoa(valorvariavel,out2); //CONVERTE VALORES NUMERICOS EM CARACTERES DO TIPO CHAR
putsXLCD(out2);
}
void variavelREAL_LCD(float x_calc)
{
int x_int; // variavel para valor inteiro
int x_dec; // variavel para valor real
unsigned char string_1[16]; // string definitiva enviada ao LCD
unsigned char string_2[16]; // string provisória
x_int=(int)x_calc; // armazena o valor inteiro do cálculo
x_dec=(x_calc-x_int)*1000.000; // armazena o valor real do cálculo
itoa(x_int,string_1); // envia o valor inteiro para uma sting
strcatpgm2ram(string_1,","); // CONCATENA a "," à primeira string
itoa(x_dec,string_2); // envia o valor decimal para uma segunda string
strcat(string_1,string_2); // CONCATENA a string inteira com a string real
putsXLCD(string_1);
}
void DelayFor18TCY(void) //200us*FOSC/(10*4)= [ (200/1000000)*48000000)/40]
{
Delay10TCYx(40);
return;
}
void DelayPORXLCD(void) //15ms*FOSC/(10*4)=
{
Delay1KTCYx(30);
return;
}
void DelayXLCD(void) //5us*FOSC/(10*4)=
{
Delay10TCYx(1);
return;
}
void iniciar_LCD()
{
OpenXLCD(FOUR_BIT & LINES_5X7);
WriteCmdXLCD(0x0C);
WriteCmdXLCD(0x06);
gotoxy(1,0);
escreve_LCD("Inicializando!");
delay_ms(1000);
gotoxy(2,0);
escreve_LCD(".");
delay_ms(100);
gotoxy(2,0);
escreve_LCD("..");
delay_ms(100);
gotoxy(2,0);
escreve_LCD("...");
delay_ms(100);
limpar_LCD;
}
//FIM DEFINIÇÕES DO LCD//
void config_USART()
{
TRISCbits.TRISC6 = 0; // set TX (RC6) as output
TRISCbits.TRISC7 = 1; // and RX (RC7) as input
OpenUSART(USART_TX_INT_OFF
& USART_RX_INT_OFF
& USART_ASYNCH_MODE
& USART_EIGHT_BIT
//& USART_SYNC_MASTER
& USART_CONT_RX
& USART_BRGH_HIGH, 51);
}
void caracter_USART(unsigned char out_xusart)
{
unsigned char string_xoutusart[16];
btoa(out_xusart,string_xoutusart);
putsUSART(string_xoutusart);
}
void main()
{
OSCCON=0x72;
iniciar_LCD();
config_USART();
TRISA=0X03;
ANSEL0=0X00;
TRISD=0X00;
while(1)
{
gotoxy(1,0);
escreve_LCD("CONTROLE SERVO");
gotoxy(2,0);
escreve_LCD("POS:");
gotoxy(2,10);
escreve_LCD("L:");
if((PORTAbits.RA0==1)&&(PORTAbits.RA1==0))
{
caracter_USART('a');
gotoxy(2,4);
escreve_LCD("-90");
gotoxy(2,12);
escreve_LCD("L1");
}
else if((PORTAbits.RA0==0)&&(PORTAbits.RA1==1))
{
caracter_USART('b');
gotoxy(2,4);
escreve_LCD("+90");
gotoxy(2,12);
escreve_LCD("L2");
}
else
{
caracter_USART('c');
gotoxy(2,4);
escreve_LCD("0 ");
gotoxy(2,12);
escreve_LCD("L3");
}
}
}


//CONTROLADOR 2 - RECEPÇÃO
#include<p18f4431.h>
#include<usart.h>
#include<stdlib.h>
char cpf[11];
char x_in;
unsigned char string[16];
void config_pwm()
{
PTCON0=0X08;
PTCON1=0X80;
PWMCON0=0X41;
PWMCON1=0X00;
PTPERL=2500;
PTPERH=2500>>8;
PDC0L=((int)(2500*0.075))<<2;
PDC0H=((int)(2500*0.075))>>6;
OVDCOND=0X01;
OVDCONS=0X00;
}
void config_USART()
{
TRISCbits.TRISC6 = 0; // set TX (RC6) as output
TRISCbits.TRISC7 = 1; // and RX (RC7) as input
OpenUSART(USART_TX_INT_OFF
& USART_RX_INT_OFF
& USART_ASYNCH_MODE
& USART_EIGHT_BIT
//& USART_SYNC_MASTER
& USART_CONT_RX
& USART_BRGH_HIGH, 51);
}
void main()
{
OSCCON=0X72;
config_pwm();
config_USART();
while(1)
{
getsUSART(string,16);
x_in=atob(string);
if(x_in=='a')
{
PDC0L=((int)(2500*0.050))<<2;
PDC0H=((int)(2500*0.050))>>6;
OVDCOND=0X01;
}
else if(x_in=='b')
{
PDC0L=((int)(2500*0.100))<<2;
PDC0H=((int)(2500*0.100))>>6;
OVDCOND=0X01;
}
else if(x_in=='c')
{
PDC0L=((int)(2500*0.075))<<2;
PDC0H=((int)(2500*0.075))>>6;
OVDCOND=0X01;
}
}
}

© 2016 Dnl Silva. São Paulo - SP
Desenvolvido por Webnode
Crie seu site grátis! Este site foi criado com Webnode. Crie um grátis para você também! Comece agora