Autor Tema: Wakup al 16F877....  (Leído 1500 veces)

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

Desconectado angel_i2e

  • PIC10
  • *
  • Mensajes: 1
Wakup al 16F877....
« en: 22 de Noviembre de 2004, 12:30:00 »
Hola (todo el) mundo..Giño..como estas es la priemera vez q realizo una conslta en el foro..bueno la misma es la siguiente...
Tengo el siguiente código...:


#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif

#define BUFFER_SIZE     32

// global flag to send processor into sleep mode
short sleep_mode;
int ext_buffer[BUFFER_SIZE];

// external interrupt when button pushed and released
#INT_EXT
void ext_isr() {
static short button_pressed=FALSE;

   if(!button_pressed)        // if button action and was not pressed
   {
      button_pressed=TRUE;    // the button is now down
      sleep_mode=TRUE;        // activate sleep
      printf("The processor is now sleeping...
"Giño;
      ext_int_edge(L_TO_H);   // change so interrupts on release
   }
   else                       // if button action and was pressed
   {
      button_pressed=FALSE;   // the button is now up
      sleep_mode=FALSE;       // reset sleep flag
      ext_int_edge(H_TO_L);   // change so interrupts on press
   }
   if(!input(PIN_B0))         // keep button action sychronized wth button flag
      button_pressed=TRUE;
   delay_ms(100);             // debounce button
}

#INT_RDA
void rda_isr()
{

   gets(ext_buffer);
   printf("
El dato leido es: %s
",ext_buffer);

   sleep_mode=FALSE;

}


// main program that increments counter every second unless sleeping
void main()   {
   long counter;

   sleep_mode=FALSE;          // init sleep flag

   ext_int_edge(H_TO_L);      // init interrupt triggering for button press
   enable_interrupts(INT_EXT);// turn on interrupts
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   printf("

"Giño;

   counter=0;                 // reset the counter
   while(TRUE)
   {
      if(sleep_mode)          // if sleep flag set
         sleep();             // make processor sleep
      printf("La cuenta es:  %5ld    
",counter);
      counter++;              // display count value and increment
      delay_ms(1000);         // every second
   }
}


Como podrán ver es muy sencillo..cada vez que se pulse un boton este provoca una interrupción y dependiendo de si este pasa de una transición de alto-bajo o de bajo-alto este coloca al µC.. en modo sleep o no (a travéz del seteo del flag sleep_mode)...bien esto funciona perfectamente... lo he probado en una placa de desarrollo que lo he diseñado y montado... cuando tenga un poco + de tiempo lo alzo para que todos aquellos que lo deseen...(es una placa de entranamiento para el 16F877 y el 18F458...pensado para el bus CAN).
El problema surge con la otra fuente de interrupción...el del USART...de acuerdo a la documentación proveida por µchip..una interrupción provocada por el USART deberia "despertar" al micro...cosa que no hace...
Les comentos que la rutina de interrupción del USART "fuera" del modo sleep funciona a la perfección...el problema es el modo SLEEP...
Alguien tiene alguna idea que problema pueda ser esto...es algún bug del compilador...o es que la unica fuente de interrupción que logra despertar al µC es la del pin RB0??loco

Escucho ideas....loco

Salu2....


Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Wakup al 16F877....
« Respuesta #1 en: 23 de Noviembre de 2004, 04:01:00 »
Siento desilusionarte Helado , pero segun el DataS:
Codigo:


1. External Reset input on MCLR pin.
2. Watchdog Timer wake-up (if WDT was enabled).
3. Interrupt from INT pin, RB port change or
peripheral interrupt.

The following peripheral interrupts can wake the device
from Sleep:
1. PSP read or write (PIC16F874/877 only).
2. TMR1 interrupt. Timer1 must be operating as an
asynchronous counter.
3. CCP Capture mode interrupt.
4. Special event trigger (Timer1 in Asynchronous
mode using an external clock).
5. SSP (Start/Stop) bit detect interrupt.
6. SSP transmit or receive in Slave mode (SPI/I2C).
7. USART RX or TX (Synchronous Slave mode).
8. A/D conversion (when A/D clock source is RC).
9. EEPROM write operation completion.
10. Comparator output changes state.
Other peripherals cannot generate interrupts since


Si te fijas la USART interrumpe solo en Syncrono y Slave mode,
por lo que una transmisión serie Asincrona no.

Una vez utilizé la señal INT para despertarlo (haciendola llegar desde la RX, activación por baja,
luego piensa de desactivarla)y me funciono, si quieres probar....
- T0ni0 -
30RCF112


 

anything