Buenas! Mi proyecto de tesis de grado tiene una parte q consiste en la comunicacion USB con un computador personal, y como yo programo es en assembler, mer estoy cambiando a C por q seria imposible hacerlo en assembler a tiempo (sin decir q seria muy poco practico). En medio de aprender C, hago el siguiente programa:
#include <p18f4550.h>
#define ASCENDENTE 1
#define DESCENDENTE 0
void Int_Alta(void);
volatile char sentido;
volatile char A = 0;
volatile char B = 1;
// Vectorizacion de interrupciones de alta prioridad
#pragma code high_vector = 0x08 // // Abre una seccion de codigo en 0x08
void interrupt(void)
{
Int_Alta(); //Se salta a la rutina de tratamiento de interrupciones de alat prioridad
}
#pragma code
// Rutina de tratamiento de interrupciones de alta prioridad
#pragma interrupt Int_Alta
void Int_Alta (void)
{
if(INTCONbits.TMR0IF)
{
if(sentido) PORTB=PORTB<<1;
else PORTB=PORTB>>1;
if(PORTB==0x80) sentido=DESCENDENTE;
if(PORTB==0x01) sentido=ASCENDENTE;
INTCONbits.TMR0IF = 0;
}
}
void main(void)
{
///////////////////// Configuracion del Temporizador 0 ///////////////////////////////
RCONbits.IPEN = 1; // Sistema de prioridad en las interrupciones habilitado
INTCON2 = 0b00000100; // Prioridad alta para la interrupcion del Temporizador 0
T0CON = 0b00000001; // Desactvado la puesta en marcha del Temporizador 0
// Modo 16 bits
// Modo temporizador
// Pre-escalar activa
// Valor del pre-escalar 1:4
INTCONbits.TMR0IE = 1; // Habilitado la interrupcion por desbordamiento del Temporizador 0
INTCONbits.GIE =1 ; // Habilitado globalmente las interrupciones
INTCONbits.PEIE = 1; // Habilitado globalmete las interrupciones de perifericos
T0CONbits.TMR0ON = 1; // Temporizador 0 puesto en marcha
///////////////////////////////////////////////////////////////////////////////////////////
ADCON1 = 0x0F; // Se desactiva la funcion de entrada analogica para todas las lineas
sentido = ASCENDENTE;
TRISB= 0;
PORTB = 1;
while(1);
}
El programa funciona bien, no hay problemas con el. Mi problema es q en la rutina de tratamiento de la interrupcion cuando se cambia a esto:
if(sentido) PORTB=A<<1;
else PORTB=A>>1;
if(PORTB==0x80) sentido=DESCENDENTE;
if(PORTB==0x01) sentido=ASCENDENTE;
INTCONbits.TMR0IF = 0;
Asignando el valor de una variable al puerto (por supuesto q inicializandola y colocandole su respecto valor), este programa simplemente no hace nada, entra a la interrupcion una sola vez, modifica el puerto una vez y ya! ni baja el flag del timer! solo entra un sola vez a la interrupcion. Como es q deberia de hacer para poder trabajar con variables dentro de la seccion de codigo de tratamiento de interupcion?.
Y otra pregunta! Ya q voy a trabajar con la comunicacion USB del PIC18F4550, q me recomendarian usar como compilador el C18 o el CCS para trabajar el USB? Yo personalmente estoy trabajando con el C18, pero me han dicho q CCS es mas facil de trabajar, pero el C18 esta mas documentado en el sentido q hay mas ayuda en foros a la hora de un problema.
Si alguien tiene información sobre la configuracion del USB del PIC18F4550, me seria de gran utilidad! Antetodo los q me puedan ayudar, muchas gracias!
#include <p18f4550.h>
#define ASCENDENTE 1
#define DESCENDENTE 0
void Int_Alta(void);
volatile char sentido;
volatile char A = 0;
volatile char B = 1;
// Vectorizacion de interrupciones de alta prioridad
#pragma code high_vector = 0x08 // // Abre una seccion de codigo en 0x08
void interrupt(void)
{
Int_Alta(); //Se salta a la rutina de tratamiento de interrupciones de alat prioridad
}
#pragma code
// Rutina de tratamiento de interrupciones de alta prioridad
#pragma interrupt Int_Alta
void Int_Alta (void)
{
if(INTCONbits.TMR0IF)
{
if(sentido) PORTB=PORTB<<1;
else PORTB=PORTB>>1;
if(PORTB==0x80) sentido=DESCENDENTE;
if(PORTB==0x01) sentido=ASCENDENTE;
INTCONbits.TMR0IF = 0;
}
}
void main(void)
{
///////////////////// Configuracion del Temporizador 0 ///////////////////////////////
RCONbits.IPEN = 1; // Sistema de prioridad en las interrupciones habilitado
INTCON2 = 0b00000100; // Prioridad alta para la interrupcion del Temporizador 0
T0CON = 0b00000001; // Desactvado la puesta en marcha del Temporizador 0
// Modo 16 bits
// Modo temporizador
// Pre-escalar activa
// Valor del pre-escalar 1:4
INTCONbits.TMR0IE = 1; // Habilitado la interrupcion por desbordamiento del Temporizador 0
INTCONbits.GIE =1 ; // Habilitado globalmente las interrupciones
INTCONbits.PEIE = 1; // Habilitado globalmete las interrupciones de perifericos
T0CONbits.TMR0ON = 1; // Temporizador 0 puesto en marcha
///////////////////////////////////////////////////////////////////////////////////////////
ADCON1 = 0x0F; // Se desactiva la funcion de entrada analogica para todas las lineas
sentido = ASCENDENTE;
TRISB= 0;
PORTB = 1;
while(1);
}
El programa funciona bien, no hay problemas con el. Mi problema es q en la rutina de tratamiento de la interrupcion cuando se cambia a esto:
if(sentido) PORTB=A<<1;
else PORTB=A>>1;
if(PORTB==0x80) sentido=DESCENDENTE;
if(PORTB==0x01) sentido=ASCENDENTE;
INTCONbits.TMR0IF = 0;
Asignando el valor de una variable al puerto (por supuesto q inicializandola y colocandole su respecto valor), este programa simplemente no hace nada, entra a la interrupcion una sola vez, modifica el puerto una vez y ya! ni baja el flag del timer! solo entra un sola vez a la interrupcion. Como es q deberia de hacer para poder trabajar con variables dentro de la seccion de codigo de tratamiento de interupcion?.
Y otra pregunta! Ya q voy a trabajar con la comunicacion USB del PIC18F4550, q me recomendarian usar como compilador el C18 o el CCS para trabajar el USB? Yo personalmente estoy trabajando con el C18, pero me han dicho q CCS es mas facil de trabajar, pero el C18 esta mas documentado en el sentido q hay mas ayuda en foros a la hora de un problema.
Si alguien tiene información sobre la configuracion del USB del PIC18F4550, me seria de gran utilidad! Antetodo los q me puedan ayudar, muchas gracias!