TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: beto_tech en 28 de Mayo de 2015, 17:24:39
-
Hola a todos los foreros!..
He hecho un nuevo tema puesto que necesito ayuda con mi proyecto y quizás a otra persona le pueda servir o interesar. Resulta que estoy haciendo un sistema en donde está compuesto por 4 pulsadores que se encuentran normalmente abierto (en estado 0), al pulsarse pasa a 1 lógico. Estoy utilizando el microcontrolador PIC16F628A y lo estoy programando en MikroC.
Lo que necesito es que al no estar pulsando nada el micro esté en modo de bajo consumo (sleep), al presionarse cualquier pulsador entonces el micro se despertará y realizará la función indicicada.. Luego, tras liberarse el micro regrese en modo Sleep. Esto lo estoy haciendo con el modo de ahorrar batería, puesto que esta alimenta el circuito.
La siguiente programación ya me funciona, pero quiero agregarle el modo sleep y no sé como hacerlo. Ayúdame si!
Gracias!!
sbit led at RA1_bit;
char est[]={0,0,0,0,0};
void main() {
porta=0x00; portb=0x00;
trisa=0x00; trisb=0xF0;
CMCON=0x07;
led=1;
UART1_init(9600); delay_ms(700);
led=0;
while(1){
if(est[1]==0 && Button(&PORTB,4,2,1)){RB0_bit=1; led=1; delay_ms(110); UART1_write_text("A$"); delay_ms(30); RB0_bit=0; est[1]=1;}
if(est[1]==1 && Button(&PORTB,4,2,0)){led=0; est[1]=0;}
if(est[2]==0 && Button(&PORTB,5,2,1)){RB0_bit=1; led=1; delay_ms(110); UART1_write_text("B$"); delay_ms(30); RB0_bit=0; est[2]=1;}
if(est[2]==1 && Button(&PORTB,5,2,0)){RB0_bit=1; led=0; delay_ms(110); UART1_write_text("C$"); delay_ms(30); RB0_bit=0; est[2]=0;}
if(est[3]==0 && Button(&PORTB,6,2,1)){RB0_bit=1; led=1; delay_ms(110); UART1_write_text("D$"); delay_ms(30); RB0_bit=0; est[3]=1;}
if(est[3]==1 && Button(&PORTB,6,2,0)){RB0_bit=1; led=0; delay_ms(110); UART1_write_text("C$"); delay_ms(30); RB0_bit=0; est[3]=0;}
if(est[4]==0 && Button(&PORTB,7,2,1)){RB0_bit=1; led=1; delay_ms(110); UART1_write_text("E$"); delay_ms(30); RB0_bit=0; est[4]=1;}
if(est[4]==1 && Button(&PORTB,7,2,0)){led=0; est[4]=0;}
}
}
-
Deberias activar las interrupciones del PORTB RB4 a RB7, hacer le codigo para eso ( me refiero a la funcion aun que no haga nada mas que limpiar el flag y leer el PORTB )
Y al final de todo ese bucle preguntaria si se termino de enviar todo. si se termino de enviar lo que estaba en la UART, lo mando a dormir.
Segun lo que vi por internet con:
asm{SLEEP}
No uso MikroC asi que es lo unico que puedo decirte.
-
Hola amigo KILLERJC, gracias por tu aporte.
Lo que pasa es que en realidad no sé cómo hacerlo!... No sé ni siquiera cómo ponerlo en mikroc..
Gracias!
-
Como dije no utilizo MikroC ni CCS por sus "funciones" ya que estoy mas acostumbrado a manejar registro por registro.
Asi que no puedo ser de mas ayuda.
Los lineamientos del programa estan. Tenes que crear la funcion de interrupcion, ahi dentro leer el puerto y limpiar el flag ( si es que no lo hace solo ).
Y agregar la linea que pase dentro del while, al final.
Sobre la interrupcion una busqueda por google y seguro la tenes, no limites la busqueda al 16f628 acepta cualquier PIC16
Y sobre el sleep es lo unico que pude encontrar.