fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

PICdem 2

2 Respuestas
2 Usuarios
0 Reactions
1,676 Visitas
waldo
Respuestas: 1
Topic starter
(@waldo)
New Member
Registrado: hace 17 años

Wenas:
Ando programando el pic 18f4550 y la tarjeta picdem 2 plus de microchip.Por el momento ando viendo las posibilidades de interrupciones en ccs. La cuestion que me aborda es que quisiera entrar en una subrutina con el timer0 y luego que entre en otra con prioridad alta con el pulsador externo rb0.Parece que no me funciona. No me quiere entrar en la externa. Como debiera hacer? La cuestion hace que con el timer 0 se vayan alternando 3 leds en rb3 rb2 rb1 y con el pulsador rb0 debería de entrar en la interrupcion externa y escribir por rs232 un mensaje sin mas. el codigo es este.

// ~~ I N C L U D E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <18F4550>
#include <stdio>
#include <stdlib>

// ~~ D E F I N E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define MENSAJE " --- Bienvenido al mundo de la programacion del Pic 18F4550 ---n"

// ~~ U S E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#use delay (clock = 48000000)
#use rs232 (baud=9600,xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(b) // Optimizar manejo de pines de entrada o salida

// ~~ B Y T E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#byte Puerto_A = 0xf80
#byte Puerto_B = 0xf81
#byte Puerto_C = 0xf82
#byte Puerto_D = 0xf83
#byte Puerto_E = 0xf84

// -------------------------------------------------------------------------------

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ V A R I A B L E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int j,index;
char c;

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ D E C L A R A T I O N S ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ I N T E R R U P C I O N E S ~~~~~~~~~~~~~~~~~~~~~~~~~~~

// ----------------------------------
// T I M E R 0
// ----------------------------------
#Int_Timer0
void interrupcion() {
j++;
switch (j){
case 1:
case 2:
case 3:
index=index<<1>>1;break;
case 5:
index=index>>1;break;
case 6:
index=index>>1;j=0;break;
}
set_timer0(0);} //reset TMR0
// ----------------------------------
// I N T E R R U P C I O N RB0
// ----------------------------------
#int_EXT
void EXT_isr()

{
delay_ms(70);
printf(MENSAJE);
printf(" rEstas dentro de la interrupcion RBnr");

}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main (){

// --- M E N U -------------------------------------------
printf(MENSAJE);
// --- I N I C I A L I Z A C I O N E S ------------------
index=1;
j=0;
set_tris_b(0x01); // Portb.0=entrada. Los demas salidas
output_b(0x00); // Inicializamos el puerto
enable_interrupts(INT_TIMER0); // Interrupcion TIMER0 activada
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L); //Define flanco de subida
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); // Configuracion interrupcion TMR0
set_timer0(0); // Carga TMR0
enable_interrupts(GLOBAL); // Activadas interrupciones
// ------------------------------------------------------
// --- B U C L E ----------------------------------------
// ------------------------------------------------------
while (true) {

output_b(index);

} // END OF WHILE
// ------------------------------------------------------
// ------------------------------------------------------
} // END OF MAIN

Responder
1 respuesta
mif
Respuestas: 1095
 Mif
(@mif)
Noble Member
Registrado: hace 19 años

Has probado a habilitar a mano INT_EXT dentro de #Int_Timer0
void interrupcion() { ... }?
si no recuerdo mal al entrar en una interrupción, ccs desactiva automáticamente todas las demás, de modo que si las quieres deben habilitarse a mano dentro.

Responder
Compartir: