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 si en vez de poner el numero del puerto en hexadecimal lo pongo en binario no pasa nada no?
Eso no es el numero de puerto, es el parametro de configuración de entradas salidas como bien t han explicado, el puerto en tu caso será el B por la instruccion, nada más.
Gracias a todos por contestar y ya por ultimo jejej
#byte puerto_b = 06
esta linea que indica?? es que en algunos codigos como este la incluyen pero en este por ejemplo que esta sacado de la pagina de ucontrol.com no
#include <16f877a> //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT //Configuramos los fuses
#use delay (clock=4000000) //Oscilador a 4Mhz
#use fast_io(b) //Optimizamos E/S del PORTB
//------Programa principal-----
void main(void)
{
set_tris_b(0xFE); //Salida RB0 como salida, el resto como entrada.
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
do{
output_low(PIN_B0); //Apago el LED
delay_ms(500); //Espero 500ms.
output_high(PIN_B0); //Enciendo el LED
delay_ms(500); //Espero 500ms.
}while(TRUE); //Repito el bucle
}
Gracias a todos por contestar y ya por ultimo jejej
#byte puerto_b = 06
Página 92 del manual de CCS:
If the id (puerto_b) is already known as a C variable then this will locate the variable at address X (06). In this case the variable type does not change from the original definition. If the id is not known a new C variable is created and placed at address x with the type int (8 bit).
Warning: In both cases memory at x is not exclusive to this variable. Other
variables may be located at the same location. In fact when x is a variable,
then id and x share the same memory location.
Es decir, si no existe la variable "puerto_b" la crea como un entero de 8 bits y la almacena en la posición 06 de la memoria de datos. Básicamente es para poder acceder a PORTB fácilmente, como si fuese una variable normal.
Bueno ya estoy aqui otra vez pero esta es para enseñaros el codigo.
En teoria, aun no tengo el pic, el led iria conectado al puerto de el pin 2 y con un reloj de 20 Mhz
#include <18F4550>
#use delay (clock=20000000)
#fuses HS,NOWDT,NOPUT,NOPROTECT
void main(void)
{
int bucle=1;
set_tris_d(00000000);//todas los pins del Puerto D como salida
do
{
ouput_low(PIN_D2);
delay_ms(500);
ouput_high(PIN_D2);
delay_ms(500);
}while(bucle==1);
}
Si tengo que corregir algo o algo no lo he hecho del todo bien o nada bien decidmelo porfavor. Muchas gracias
Si lo que quieres es un bucle infinito (la variable "bucle" nunca cambia) podrías usar while(1){ ... }. Es más eficiente y limpio.