#include "16f722.h" #fuses NOWDT,PUT,NOBROWNOUT,NOPROTECT,INTRC_IO,PLLEN,MCLR,NOVCAP #use delay(clock=16000000) #byte PORTA = 0x05 #byte PORTB = 0x06 #byte PORTC = 0x07 #byte TRISA = 0x85 #byte TRISB = 0x86 #byte TRISC = 0x87 #byte OSCCON = 0x90 #byte ANSELA = 0x185 //Motores #bit MotIzqEnable = PORTC.1 #bit MotIzqIn1 = PORTC.0 #bit MotIzqIn2 = PORTC.3 #bit MotDerEnable = PORTC.2 #bit MotDerIn1 = PORTC.5 #bit MotDerIn2 = PORTC.4 //Sensores #bit SnsLatIzq = PORTA.5 //sensor lateral izquierdo #bit SnsIntrmIzq = PORTA.4 //sensor intermedio izquierdo #bit SnsCentIzq = PORTA.2 //sensor central izquierdo #bit SnsCentDcho = PORTA.1 #bit SnsIntrmDcho = PORTA.3 #bit SnsLatDcho = PORTA.0 //Colores #define Fondo 0 #define Pista 1 //Configura el microcontrolador inline void Config() { ANSELA=0; //desactiva entradas analogicas TRISA = 0xFF; //todos los bits del PORTA como entradas TRISC = 0b11000000; OSCCON = 0b00110000; //oscilador interno a 16MHz } //Motor izquierdo: Avanzar void MotIzqAvanzar() { MotIzqEnable=1; MotIzqIn1=1; MotIzqIn2=0; } //Motor izquierdo: Retroceder void MotIzqRetroceder() { MotIzqEnable=1; MotIzqIn1=0; MotIzqIn2=1; } //Bloquea el motor izquierdo (detencion rapida) void MotIzqDetener() { MotIzqEnable=1; MotIzqIn1=0; MotIzqIn2=0; } //Motor derecho: Avanzar void MotDerAvanzar() { MotDerEnable=1; MotDerIn1=1; MotDerIn2=0; } //Motor derecho: Retroceder void MotDerRetroceder() { MotDerEnable=1; MotDerIn1=0; MotDerIn2=1; } //Bloquea el motor derecho (detencion rapida) void MotDerDetener() { MotDerEnable=1; MotDerIn1=0; MotDerIn2=0; } //Hace que el robot se mueva en direccion recta hacia delante void Avanzar(){ MotDerAvanzar(); MotIzqAvanzar(); } //Girar hacia la derecha void GirarDcha(){ MotDerDetener(); MotIzqAvanzar(); } //Girar hacia la izquierda void GirarIzq(){ MotIzqDetener(); MotDerAvanzar(); } //Girar hacia la derecha sobre si mismo void RotarDcha(){ MotDerRetroceder(); MotIzqAvanzar(); } //Girar hacia la izquierda sobre si mismo void RotarIzq(){ MotIzqRetroceder(); MotDerAvanzar(); } //Se detiene completamente void Detener(){ MotIzqDetener(); MotDerDetener(); } void main(){ Config(); while(1){ if(SnsCentIzq==Pista && SnsCentDcho==Pista) Avanzar(); else if(SnsCentIzq==Fondo && SnsCentDcho==Fondo) Detener(); else if(SnsIntrmIzq==Fondo) RotarDcha(); else if(SnsIntrmDcho==Fondo) RotarIzq(); else if(SnsCentIzq==Fondo) GirarDcha(); else if(SnsCentDcho==Fondo) GirarIzq(); } }