Nuevo en programación con MikroC

Hola pues acudo este foro por que me gusta participar y en ocasiones he necesitado ayuda, en esta ocasión me ha surgido una duda, me he hecho de un programador USB y un PIC16F628A, y debido a que tengo un poco de experiencia en programación en C he elegido el compilador mikroC para introducirme a la programación de PIC's, ya he hecho mi "hola mundo" :D y ha funcionado de maravilla!

Código:
void main() {
     PORTB = 0;
     TRISB = 0;
     while(1) { 
          PORTB.F0 = 1;
          Delay_Ms(500);
          PORTB.F0 = 0;
          Delay_Ms(500);
     }
}
¿pero mi duda es como puedo hacer para usar todos los pines de un puerto en un ciclo for?, tal vez no he buscado lo suficiente o adecuadamente, pero no encuentro la manera correcta de hacer algo asi:
Código:
for(i=0;i<8;i++)
{
     PORTA.F(i) = 1;
     Delay_Ms(500);
     PORTA.F(i) = 0;
}
Se que esta no es la manera correcta de hacerlo pero creo que la idea se entiende, que es que se haga una secuencia de luces recursiva usando los 8 pines del puerto B.
De antemano muchas gracias por su apoyo y espero que me puedan ayudar (y)
 
No hay mucha ciencia en eso...

Para acceder a pines hay varias formas, esta es una expresado en tu ejemplo.
Código:
for(i=0 ; i<8 ; i++)
{
     PORTB = 1 << i;   // Secuencial; esto enciende 1 pin a la vez y el resto apagado.
     Delay_Ms(500);
}

Un saludo
 
Hombre pues muchas gracias me has proporcionado una muy buena ayuda, y pues me ha llamado la atención que mencionaste que hay varias formas, si no es mucho pedir podrías ejemplificar alguna(s) otra(s), también quisiera saber si modificando el ejemplo que escribiste se podrían encender 2 pines a cada vez y los demas apagados.

Te agradezco mucho tu ayuda y ojala pudieses responder a esta segunda pregunta
 
Hola jgarcam


Esta es una modificacion que se le podria hacer al ejemplo que te puso Carlos Alexis:

PHP:
int x;
void main(void)
{
INTCON=0;
TRISB=0;
PORTB=0;
while(1)
{
for(x=0;x<7;x++)
{
delay_ms(500);
PORTB=3<<x;
}
}
}


Otra forma de hacer esto (si en caso necesitaras controlar un motor Stepper) seria de esta:

PHP:
char arreglo[8]={0b11,0b110,0b1100,0b11000,0b110000,0b1100000,0b11000000,0b10000001};
int x;
void main(void)
{
INTCON=0;
TRISB=0;
PORTB=0;
while(1)
{
for(x=0;x<8;x++)
{
PORTB=arreglo[x];
delay_ms(500);
}
}
}
 
Muchas gracias, por tu respuesta iDan de verdad han sido de gran ayuda ambas respuestas, han despejado mis dudas y me han dado un buen enfoque para el uso de mikroC.
 
De nada amigo...


Cuando quieras algo no dudes en preguntar, aqui hay expertos en el tema y tambien los que comenzamos a programar como tu y yo...
 
Bueno hace tiempo hice la pregunta que abrió este tema, y ahora me ha surgido la duda respecto a la respuesta, quisiera saber ¿como es que funciona el operador <<?, es decir, ¿que efecto tiene? en la linea de código:

Código:
PORTB = 1 << i;

porque me he percatado que el numero que esta antes del operador: << es puesto (en forma binaria) en la salida PORTX y luego se recorre un pin hasta que no hay nada ke mostrar y entonces se reinicia el bucle (dependiendo de si asi lo haya hecho el programador).

¿Es esta toda la explicación?¿Hay alguna manera mas detallada de describir lo que ocurre?:confused:

Gracias de antemano por su ayuda :D
 
Hola jgarcam


Mira este es un operador a nivel de bit y es conocido como Operadores de Desplazamiento a Nivel de bit (<<;>>) entonces... consta de 3 partes:

x>>y ó x<<y siendo "x" y "y" valores enteros...


1) "X": La "x" es el valor que nos servira de referencia... como toda linea se lee de izquierda a derecha, "x" sera el primer valor que tendra nuestra variable o puerto para empezar el desplazamiento...


2) ">>" ó "<<": Nuestro desplazamiento a nivel de bit (ya sea de izquierda a derecha o viceversa) sera indicado por la direccion de los desplazadores... siendo ">>" un desplazamiento de bit hacia la derecha o un decremento, y "<<" un desplazamiento de bit hacia la izquierda o un incremento... todo dependiendo de nuestro valor "y"

3) "Y": La "y" es el valor que nos servira para indicar el tamaño de nuestro desplazamiento para el valor que tengamos en "x" y si queremos que incremente o decremente (direccion)...


Ejemplo:

siendo nuestra variable "c" igual a: c=28 (decimal) ó c=0x1c (hexádecimal) ó c=0b00011100 (binario)

c=c<<1; //Indicamos que se corre hacia la izquierda y en un solo bit o pesor y el nuevo valor
//de "c" sera igual a c=56 ó c=0x38 ó c=0b00111000

Ya sea "y"=1 u otro valor, otro ejemplo:

Siendo c=1 ó c=0x01 ó c=0b00000001

c=c<<2; //Ahora el valor de "c" se corre a la izquierda y en 2 bit o pesor, siendo el nuevo
//valor de "c" igual a c=4 ó c=0x04 ó c=0b00000100

Espero que esto te haya ayudado a aclarar algunas dudas... sino... entonces avisas...!! :apreton:


Saludos
 
Muchas gracias por tu ayuda iDan, estuve experimentando el alcance de esta operación conectando todo el puerto B a un display de barras y ahi pude observar y quedo aun mas claro lo que amablemente me explicaste, muchas gracias por tu excelente explicación :apreton:.

Saludos, Jorge.

P.D. Si no eres profesor espero consideres serlo, te iria muy bien (y), hasta pronto.

Y si lo eres, pues muchas felicidades, eres muy bueno (y)
 
Última edición:
Hola compañeros, yo tambien soy nuevo en la programacion de pic, y en mikroC, alguno de ustedes me podria ayudar, para saber la forma correcta de leer un puerto en c, ya que yo hago lo siguiente:

void main() {
PORTA=0;
TRISA=0;
PORTB=0;
TRISB=0x03;
leer: if (PORTB & 0x03) //si B0 y B1 se oprimen simultaneamente
//enciende el circuito
{
porta=0Xff; //ESTA INST. LA PONGO PARA SABER SI ENTRA AL IF
}
else{ goto leer;}
}
Oja y me puedan ayudar ya que en mikroc entra al if sin cumplir la condicion, de antemano gracias
 
Última edición:
Hola pues la verdad yo opte por mudarme a CCS pero bueno, ammm no estoy muy seguro de que estes usando el if correctamente, yo lo pondría asi:

Código:
leer:
     if((PORTB.F0 == 1) && (PORTB.F1 == 1)){ //o tambien así PORTB == 0x03
           PORTA = 0xFF;
     }
     else{
           goto leer;
     }

La verdad no estoy seguro que sea así en mikroC pero se me hace lo mas lógico. Al parecer siempre entra al if por que la condicion PORTB&0x03 te la reconoce como una condicion valida y siempre es verdadera.
Epero haberte ayudado o por lo menos darte una idea de por donde vaya tu problema
 
Última edición:
Hola amigos... paso rapido:


@JuanCarlosabigor:

Mira este es el programa que escribiste:

void main() {
PORTA=0;
TRISA=0;
PORTB=0;
TRISB=0x03;
leer: if (PORTB & 0x03) //si B0 y B1 se oprimen simultaneamente
//enciende el circuito
{
porta=0Xff; //ESTA INST. LA PONGO PARA SABER SI ENTRA AL IF
}
else{ goto leer;}
}

mira si quieres evitarte hacer un tremendo loop con el famoso goto entonces has que todo tu programa entre en un ciclo que lo repita y asi no tengas que hacer loops... mira te doy un ejemplo simple ya que no se que PIC usas:

PHP:
void main()
{
INTCON=0;
TRISA=0;
TRISB=3;
PORTA=0;
PORTB=0;
[B]while (1)[/B]
{
if(PORTB.F0==1 && PORTB.F1==1)
PORTA=1;
else
PORTA=0;
}
}


Ahora en programacion cuando usas una sentencia if-else, si la accion a realizar la sentencia es solo una linea, tal el caso de:

PHP:
if(PORTB.F0==1 && PORTB.F1==1)
[B]PORTA=1;[/B]

entonces NO se utilizan llaves {} para indicarle al if donde empieza la accion a realizar y donde termina, ya cuando son 2 o mas lineas si las tienes que usar...

yo por lo pronto no miro mas problemas... pero si tienes alguna duda no pienses 2 veces en preguntar...


Saludos JuanCarlosabigor y jgarcam
 
Hola!
Gracias jgarcam y iDan, me ha ayudado mucho, ahora voy a entrarle a programar el taimer ya que lo requiero en mi proyecto, y pues si tengo algunas dudas les preguntare gracias.

Una duda mas, yo empeze programando con Mplab, pero no pude simular en C, un profe me dijo que tenia que descarga un programa de la pagina de Microchip para poder simular en C desde Mplab, pero la verdad no lo he encontrado, ¿saben cual es esta herramienta? de casualidad, bueno como siempre de antemano gracias y ¡Suerte!
 
A pues la verdad no entendi muy bien tu pregunta JuanCarlosbigor pero espero que esto la responda, yo uso un COMPILADOR de C que se vincula mediante un PLUGIN con MPLAB, el compilador se llama CCS y tiene aglunas herramientas como debugger y otras, MPLAB por su parte tiene algunas herramientas de simulación y ayuda para programar estas se encuentran en el menu Tools.
 
Tambien soy nueva en MikroC, un saludo para todos, quisiera saber como se hace para leer y escribir un dato.
Por ejemplo si por A0 me esta entrando 01000111, quisiera capturar estos datos, esperar a que lleguen los 8 y escribirlos por un puerto....
Muchas gracias a todos
 
Tambien soy nueva en MikroC, un saludo para todos, quisiera saber como se hace para leer y escribir un dato.
Por ejemplo si por A0 me esta entrando 01000111, quisiera capturar estos datos, esperar a que lleguen los 8 y escribirlos por un puerto....
Muchas gracias a todos

Hola pues bienvenida y felicidades, ya tiene rato que abandoné la programación de micros y más en MikroC (T-T), como escribí más arriba me he mudado de compilador, pero bueno al tema, lo que tu tienes es un dato (o datos) en serie dado ke que los quieres leer por un solo pin, según tengo entendido para hacer esto debes tener por fuerza una sincronización, es decir, que tanto el dispositivo que envía el dato como el que lo lee "sepan" en que momento van a transmitir-leer, para ello hay dos formas generales:

1)Al enviar tu dato en un tren de pulsos inicias la lectura con el primer pulso de duración mayor a los demás, que al entrar por el pin del pic indique a éste que debe iniciar una lectura de un dato de n bits (la rutina que lo haga dependerá de ti y me parece que debes dominar las interrupciones para hacerlo). Este método lo utilizan los controles remotos de los aparatos electrónicos pero se puede aplicar también con cables, hay protocolos ya establecidos pero tu puedes crear tu propio código de comunicación.

2)Existen protocolos de comunicación serial como el RS232 o el one-wire, que utilizan muchos dispositivos como termómetros, memorias, etc. De esto hay mucha informacion y tutoriales en la web.

Si no te quedó muyclaro te recomiendo empezar tu búsqueda por aquí:
http://todopic.mforos.com/8826/1138399-leer-datos-en-forma-serial/
 
Última edición:
hola a todos la verda que soy un poco nuevo en esto de los pics, estoy usando el mikroc para programarlos pero ahora cai en lio que no puedo salir, tengo una duda con esto, estuve haciendo una interrupcion externa peo en la simulacion no me sale como kiero.

lo que kiero es esto:

utilizando la interrupcion x cambio de estado, al ocurrir una interrupcion por el RB4 kiero que me de el mismao valor por el PORTD0 osea, si en RB4=1 entonces en PORTD=1
y si en RB4 esta en cero entonces kiero q tamien en PORTD se mantenga en cero, peo en proteus no c xq cuando ocurre el cambio de estado su valor en la simulacion retorna a cero

xfa aver si lo revisan y me dicen que es lo q me falta, soy un poco nuevo y la verda no ce donde esta el error. adjunto el codigo y la simulacion en proteus para q lo vean.

desde luego muchas gracias x su tiempo
 

Adjuntos

  • interrupcion x rb4.rar
    40.8 KB · Visitas: 124
Hola tengo un problema con un programa sencillo, lo que quiero hacer es leer el puerto RA0 y si es un 1 que encienda un led del puerto RB0, la compilacion no marca errores pero a la hora de simularlo no funciona, el codigo es el siguiente:

void configurar_puertos();
bit i;
void main()
{
configurar_puertos();
PORTB=0x00;
while(1)
{
if ( PORTA.F0 == 1)
PORTB=0x01;
}}
void configurar_puertos()
{
TRISB=0x00;
TRISA=0xFF;
}
 
Sería bueno pusieras que pic utilizas, la configuración de los fuses y una imagen del circuito montado.

En el codigo no veo error (segun el pic que utilices), por lo que lo mas probalble es que el fallo esté en la configuración de los fuses o en el montaje del circuito.

Un saludo
 
Utilizo un pic 18f4550 con un crystal externo de 20 MHz pero le hago preescaler para que el pic funcione a 48MHz

Gracias
 

Adjuntos

  • fuses.JPG
    fuses.JPG
    71.4 KB · Visitas: 32
  • configuracion 18f4550.JPG
    configuracion 18f4550.JPG
    74.5 KB · Visitas: 38
Última edición por un moderador:
Atrás
Arriba