Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola a todos , soy nuevo en esto de la robotica y tengo una par de dudas sobre el lenguaje de programacion c en el compilador CCS. Bien me descarge este codigo en CCS para mirar como funcionaba#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#byte puerto_b = 06
void main( void )
{
set_tris_b( 0x01 ); // RB0 como entrada y lo demás del puerto B como salida
puerto_b = 0; // Limpia puerto B
DO{
if (!input (PIN_B0)){ // Si se presiona RB0
bit_set( puerto_b, 1 ); // enciende led conectado a RB2
}
else{ // Si no se presiona RB0
bit_clear( puerto_b, 1 ); // apaga led conectado a RB2
}
} while ( TRUE );
}
Pero la parte donde configura los puertos , el set_tris_b no entiendo como le indica que puertos son entrada y como salida a partir del numero hexadecimal.
Otra duda que me ronda la cabeza es la parte del if en la de bit_set en esa parte no entiendo absolutamente nada no se que le esta pasando, ni se porque al principio iguala el puerto_b a 0.
Muchas gracias por todo, la verdad es que me esta encantando esto de la robotica
Entonces a parte del bucle infinito no hay nada desastroso respecto a la configuracion del pic?
Por cierto buscando info para hacer mi primer robot visite la pagina de tarribot.es pero mirando en el apartado del codigo en C vi que utiliza una forma mas facil de programar. Asocia una variable a un pin y listos.Esto se puede hacer? porque si es asi es mucho mas facil. Os dejo el codigo por aqui.// *********************************
// * TarriBot 1.0 - Bumpers
// * http://www.tarribot.com
// * Francisco Reinoso "furri"
// * Julio 2006
// *********************************
#include <16F84A>
#fuses XT,NOWDT
#use delay(clock=4000000)
#define md_ade PIN_A3
#define md_atr PIN_A2
#define mi_ade PIN_A1
#define mi_atr PIN_A0
#define s1 PIN_B0
#define s2 PIN_B1
#define ON output_high
#define OFF output_low
void main()
{
//apagamos los motores
off(md_ade);
off(mi_ade);
off(md_atr);
off(mi_atr);
while (true)
{
//ambos motores adelante
on(md_ade);
on(mi_ade);
// sensor derecho choca
if (input(s2) == 1) {
// apagamos ambos motores
off(md_ade);
off(mi_ade);
// ambos motores atras durante 1/2 segundo y paramos
on(md_atr);
on(mi_atr);
delay_ms(500);
off(md_atr);
off(mi_atr);
// motor derecho adelante durante 1/2 segundo (motor izq está parado)
on(md_ade);
delay_ms(500);
// y apagamos motor derecho
off(md_ade);
}
if (input(s1) == 1) {
off(md_ade);
off(mi_ade);
on(md_atr);
on(mi_atr);
delay_ms(500);
off(md_atr);
off(mi_atr);
on(mi_ade);
delay_ms(500);
off(mi_ade);
}
}
}
Hola!
Lamento contradecirte, ... Asocia una variable a un pin y listos.Esto se puede hacer? porque si es asi es mucho mas facil... pero en realidad no está asociando ninguna variable.
Cuando Hace
#define md_ade PIN_A3
Está diciendole al compilador que cuando encuentre en el programa el texto "md_ade" lo sustituya por "PIN_A3", que es una referencia a un bit de la RAM del micro (en elguna parte habrá algo parecido a #define PIN_A3 0x05.3)
De todas formas si puede hacerse con variables (o algo parecido). Con la directiva #BYTE y #BIT podemos acceder a las posiciones de memoria RAM de los registros de los puertos (y por tanto a los pines de los mismos). Por ejemplo:
.
.
.
#BYTE TRISB 0x86
#BYTE PORTB 0x06
#BIT Salida PORTB.1
#BIT Entrada PORTB.4
Estas declaraciones, me permitirian hacer lo siguiente:
.
.
.
TRISB=0xF0; //PORTB=>Bits 0 a 3 Salidas y 4 a 7 entradas
Salida=Entrada; // Coloca el valor de RB4 en RB1
.
.
.
Tambien podrias trabajar con el puerto entero como un byte... PORTB=PORTB | 0x01; por ejemplo.
Salu2!