Autor Tema: Sleep mode 16F628A MikroC  (Leído 2213 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado beto_tech

  • PIC10
  • *
  • Mensajes: 13
Sleep mode 16F628A MikroC
« 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!!

Código: [Seleccionar]
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;}
 }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Sleep mode 16F628A MikroC
« Respuesta #1 en: 28 de Mayo de 2015, 19:12:48 »
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.

Desconectado beto_tech

  • PIC10
  • *
  • Mensajes: 13
Re: Sleep mode 16F628A MikroC
« Respuesta #2 en: 28 de Mayo de 2015, 22:36:21 »
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!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Sleep mode 16F628A MikroC
« Respuesta #3 en: 29 de Mayo de 2015, 15:11:01 »
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.


 

anything