Peleandome con un pic 16f690 y PICC

Hola, estoy iniciandome en esto de programar los pics en C, en concreto estoy intentandolo con un pic 16f690, usando como entorno de trabajo mplab 7.60 y el hi-tech picc compiler.

Escribi un codigo en C bastante extenso que, posteriormente como era de esperar no funcionaba como deberia al compilarlo, asi que me estoy dedicando mejor a ir paso a paso para ir entendiendo como funciona a mas pequeño nivel para despues aplicar lo que vaya aprendiendo para depurar mi programa

el problema que tengo en concreto esque no consigo que el pic funcione con variables de programa, es decir, puedo programar cosas como "si la entrada tal esta a nivel alto la salida tal invierte su estado" pero con codigos como este no consigo nada

#include <stdio.h>
#include <htc.h>

void inicializa(void);

int seg;

/////////////////////////////

void main(void){

inicializa();

while(1){


if(RC1==1){

seg++;

while(RC1==1){

asm("NOP");}

}

if(seg>=3){

RB6=1;}

}}

////////////////////////////


void inicializa(void){

__CONFIG(0XCF4);


SCS=1; /*Config. oscilador interno*/
OSTS=0;
IRCF2=1;
IRCF1=1;
IRCF0=0;

ANSEL=0xFF; /*Config. Puertos como I/O*/
ANSELH=0xFF;

TRISA=0b00011000;
TRISB=0b00000000;
TRISC=0b00010010;

PORTA=0x00; /*Inicializacion Puertos*/
PORTB=0x00;
PORTC=0X00;


seg=0;


}

Es un codigo muy sencillo, si RC1 detecta un nivel alto incrementa una variable, si esa variable llega a valer 3 o mas se activa la salida RB6

Pero el programa no funciona y no se donde esta el error (pues el programa me compila y puedo programar el pic)

¿Veis a primera vista que fallos puedo estar cometiendo?

Gracias
 
¿Has probado se simularlo desde mplab?
Veo que el programa no tiene freno, la que poner un nivel en RC1 empieza a contar como un desesperado.

Por desgracia yo utilizo el CCS que es mucho mas facil.
 
Solo incrementa la variable una vez por pulsacion (al menos esa es mi idea) ya que hasta que no encuentre de nuevo RC1 a nivel bajo el pic se mantiene detenido (No Opera) de todos modos este programa no vale para nada solo es una prueba.

voy a echarle un ojo a eso de la simulacion desde mplab (que sinceramente desconocia...)

¿alguna otra sujerencia?

gracias
 
Simulandolo he descubierto que nunca llega a entrar en el "if", es como si no detectara el nivel alto en RC1 sin embargo usando RC4 el programa funciona perfectamente, lo cual me da que pensar que quizas hay algun aspecto de los puertos que me falte por configurar y no se que puede ser

me dejado los ojos en el datasheet pero na de na
 
Pusiste ANSELH = 0xFF cuando deberia ser ANSELH=0 para que los pines queden como I/O digital. Poniendoles a 1 los reservas para el conversor AD.
Y cuando se configura un pin para el conversor AD siempre se lee el pin como 0 digital.

"The ANSEL and ANSELH registers must
be initialized to configure an analog
channel as a digital input. Pins configured
as analog inputs will read ‘0’."

Saludos
 
Mira que leido veces eso y mi deseperacion me ha llevado al equivoco jaja habia entendido "las entradas analogicas se programan como 0" en vez de "se leen" muchas gracias Ardogan

Ahora el programa me simula perfectamente como debería, pero a la hora de programarlo y usarlo en el PIC no funciona como debería ya que sigue sin leerme la entrada RC1 y RB6 pasados unos segundos pasa de nivel bajo a quedarse seteada a nivel alto. Pero bueno ya ire probando con otros programas y os comento

gracias otra vez
 
Tené en cuenta que si la señal de RC1 viene de un pulsador, seguramente habrá rebotes.
Lo que podés hacer es que al detectar RC1=1 es esperar unos cientos de milisegundos.
Igualmente si el problema fueran los rebotes se te pondría RB6 = 1 antes y no después...
A lo mejor es un problema de circuito.
Bueno, me ha pasado más de una vez eso de leer una hoja de datos e interpretar una cosa la 1ra vez, todo lo contrario la 2da, y algo intermedia la 3ra .
Suerte, comentanos como te fué.
 
Tu pin RC1 ponle una reisistencia de un 1K a tierra para fijar bien en cero. Porque si RC1 esta al aire no se sabe que nivel logico esta .
Tu programa con un solo pulso tu contador seg se va disparado hasta cer sero otra vez depende de la velocidad de tu clock. Falta un retardo de unos 20ms a 100ms, o una condicion que sea RC1 cero nuevamente para continuar para que cuente pulso por pulso.
 
Atrás
Arriba