Professional Documents
Culture Documents
#pragma config OSC = HSPLL // Oscillator Selection bits (HS oscillator with
PLL enabled/Clock frequency = (4 x FOSC))
#pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit
(Oscillator system clock switch option is disabled (main oscillator is source))
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset
enabled)
#pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V)
// CONFIG2H
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control
is placed on the SWDTEN bit))
#pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128)
// CONFIG3H
#pragma config CCP2MUX =ON // CCP2 Mux bit (CCP2 input/output is multiplexed
with RB3)
// CONFIG4L
#pragma config STVR = OFF // Stack Full/Underflow Reset Enable bit (Stack
Full/Underflow will not cause RESET)
#pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP
disabled)
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh)
not code protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh)
not code protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh)
not code protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh)
not code protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block
(000000-0001FFh) not code protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not
code protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh)
not write protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh)
not write protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh)
not write protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh)
not write protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit
(Configuration registers (300000-3000FFh) not write protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block
(000000-0001FFh) not write protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM
not write protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-
001FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-
003FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-
005FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-
007FFFh) not protected from Table Reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block
(000000-0001FFh) not protected from Table Reads executed in other blocks)
#include <xc.h>
#define _XTAL_FREQ 40000000
//Funciones
void CONF_PORTS();
void CONF_ADC();
void CONF_USART();
void CONF_PWM();
void SENSORES();
void CLEAR();
void SEND (unsigned char dato);
int ESTABLECER_VEL_INI(void);
void ROMPER_INERCIA();
void LINEA_RECTA(unsigned char s);
void GIRAR_DER (unsigned char r);
void GIRAR_IZQ (unsigned char l);
void GIRAR_180 (unsigned char c);
void CAMBIAR_SENTIDO(void);
void CAMBIAR_SENTIDO2(void);
void FIN(void);
//Variables
unsigned char sensor = 0;
unsigned char tmp = 0;
unsigned char VAL_L = 0;
unsigned char VAL_R = 0;
unsigned char AA[10];
void main(void) {
CONF_PORTS();
CLEAR();
CONF_ADC();
CONF_USART();
CONF_PWM();
int flag = 10; //Numero Maximo de errores
SEND('s');
do{
SEND('P');
flag = ESTABLECER_VEL_INI();
}while(flag != 0);
ROMPER_INERCIA();
while(1){
SENSORES();
if(sensor == 0b11111100 || sensor == 0b11111111 || sensor == 0b11110000 ||
sensor == 0b11111000 || sensor == 0b11111100 ){
GIRAR_DER(sensor);
}
else if(sensor == 0b00000111 || sensor == 0b00001111){
GIRAR_IZQ(sensor);
}
else if (sensor==0b00000000 ){
GIRAR_180(sensor);
}
else{
(LINEA_RECTA(sensor) );
}
}
return;
}
void CLEAR(){
ADRESH = 0;
ADRESL = 0;
LATD = 0;
PR2 = 0;
CCPR1L = 0; //PWM1
CCPR2L = 0; //PWM2
sensor = 0;
}
void CONF_PORTS(){
//76543210
TRISA = 0b00101111; //AN4 AN3 AN2 AN1 AN0
//76543210
TRISE = 0b00000111; //AN5 AN6 AN7
//76543210
TRISC = 0b10000000; //RX = 7 TX = 6 I1 = 5 I2 = 4 I3 = 3 CCP1 = 2 CCP2 = 1 I4
= 0
void CONF_ADC(){
//76543210
ADCON0 = 0b01000001;
//76543210
ADCON1 = 0b01000000;
}
void SENSORES(){
sensor = 0;
for(unsigned char CH = 0; CH < 8; CH++){
ADCON0bits.CHS = CH; //Cambiar Canal
__delay_us(13);
ADCON0bits.GO = 1; //Iniciar Conversion
while(ADCON0bits.GO == 1);
//SEND(13);
void CONF_USART(){
//76543210
TXSTA = 0b00100010;
//76543210
RCSTA = 0b10010000;
SPBRG = 64;
}
void CAMBIAR_SENTIDO(){
//MOTOR DERECHO
CCPR1L = VAL_R+20; //CICLO UTIL
RC5 = 0;
RC4 = 1;
//MOTOR IZQUIERDO
CCPR2L = VAL_L+20; //CICLO UTIL
RC3= 1;
RC0 = 0;
}
void CAMBIAR_SENTIDO2(){
//MOTOR DERECHO
CCPR1L = VAL_R+20; //CICLO UTIL
RC5 = 1;
RC4 = 0;
//MOTOR IZQUIERDO
CCPR2L = VAL_L+20; //CICLO UTIL
RC3= 0;
RC0 = 1;
int ESTABLECER_VEL_INI(void)
{
unsigned char CONTAR_TRAMAS = 0;
unsigned char ERROR = 0;
unsigned char TEMP = 0;
unsigned char i = 0;
for(i=0;i<10;i++)
{
while(PIR1bits.RCIF == 0)
// Espera a que reciba SOLO UNA trama
{}
//SEND(i + 48);
TEMP = RCREG;
// Lee el dato recibido
PIR1bits.RCIF = 0;
// Baja bandera de dato leido
switch (CONTAR_TRAMAS)
{
case 0:{
if(TEMP == 'A')
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 1:{
if(TEMP >= 48 && TEMP <= 50)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 2 :{
if(TEMP >= 48 && TEMP <= 57)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 3 :{
if(TEMP >= 48 && TEMP <= 57)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 4 :{
if(TEMP == 13)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 5:{
if(TEMP == 'B')
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 6:{
if(TEMP >= 48 && TEMP <= 50)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 7 :{
if(TEMP >= 48 && TEMP <= 57)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 8 :{
if(TEMP >= 48 && TEMP <= 57)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
case 9 :{
if(TEMP == 13)
{
AA[CONTAR_TRAMAS] = TEMP;
CONTAR_TRAMAS++;
}
else
{ERROR++;}
}break;
default:{
ERROR++;
}
}
}
}
return ERROR ;
void ROMPER_INERCIA(){
//MOTOR DERECHO
CCPR1L = VAL_R; //CICLO UTIL
RC5 = 1;
RC4 = 0;
//MOTOR IZQUIERDO
RC3= 1;
RC0 = 0;
}
}
void GIRAR_180(unsigned char c){
//DETENER MOTORES
CCPR1L =0;
CCPR2L =0;
//ARRACAR
ROMPER_INERCIA();
__delay_ms(600);
//DETENER MOTORES
CCPR1L =0;
CCPR2L =0;
//GIRAR MOTOR
CAMBIAR_SENTIDO();
do
SENSORES();
while (sensor !=0b00011000);
CCPR1L =0;
CCPR2L =0;
ROMPER_INERCIA();
}
void FIN (void){
CCPR1L =0;
CCPR2L =0;
do
SENSORES();
while (sensor==0b11111111);
}
void LINEA_RECTA(unsigned char s){
switch(s){
// Derecha
case 0b01100000:{
//SEND('1');
CCPR2L = (VAL_L - 55);
CCPR1L = (VAL_R + 55);
}break;
case 0b00100000:{
//SEND('2');
CCPR2L = (VAL_L - 45);
CCPR1L = (VAL_R + 45);
}break;
case 0b00110000:{
//SEND('3');
CCPR2L = (VAL_L - 35);
CCPR1L = (VAL_R + 35);
}break;
case 0b00010000:{
//SEND('4');
CCPR2L = (VAL_L - 25);
CCPR1L = (VAL_R + 25);
}break;
case 0b00011000:{
//SEND('5');
CCPR2L = (VAL_L + 30); //Centro
CCPR1L = (VAL_R + 30);
}break;
// izquierda
case 0b00001000:{
//SEND('6');
CCPR2L = (VAL_L + 25);
CCPR1L = (VAL_R - 25);
}break;
case 0b00001100:{
//SEND('7');
CCPR2L = (VAL_L + 35);
CCPR1L = (VAL_R - 35);
}break;
case 0b00000100:{
//SEND('8');
CCPR2L = (VAL_L + 45);
CCPR1L = (VAL_R - 45);
}break;
case 0b00000110:{
//SEND('9');
CCPR2L = (VAL_L + 50);
CCPR1L = (VAL_R - 50);
}break;
default:break;
}