Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

18/04/2009 #1


Problema con la interrupcion del PIC18
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!
23/04/2009 #2

Avatar de Ardogan

Lo que veo sin internarme demasiado en el código es que la variable A siempre va a valer 0; y que se inicializa a 0 y luego la única operación que se hace sobre A es desplazar a derecha o izquierda. Y 0 desplazado en cualquier sentido es 0.

Entonces lo que pasa con

if(sentido) PORTB=A<<1;
else PORTB=A>>1;
if(PORTB==0x80) sentido=DESCENDENTE;
if(PORTB==0x01) sentido=ASCENDENTE;
INTCONbits.TMR0IF = 0;

es que PORTB va a ser siempre =0; y ninguno de los if's que siguen van a tomar por la rama del sí (de que se cumpla la condición del if).

Eso de que nunca se pone el flag de interrupción de TMR0 a 0 no lo sé explicar.

En cuanto a usar C18 o CCS, acá se han metido a fondo con CCS en http://www.forosdeelectronica.com/po...46.html#189046 ; un excelente aporte de Moyano Jonathan, Meta y otros.
Con C18 hay varios ejemplos en la página de microchip, y se instalan automáticamente y se puede experimentar con ellos al instalar el framework (hay ejemplos con CDC, HID, y MSD). Hay que hacer la readaptación de esos ejemplos al hardware que uno usa (configuración de puertos, reloj del PIC, si se detecta la presencia de la tensión de alimentación o no, etc), y configurar los descriptores de dispositivo USB (para eso ya trae una aplicación que genera el archivo .c para incluirlo en el proyecto con el resto del firmware -> USB Stack Configuration Tool).
He visto que el CCS puede ser más intuitivo/fácil de entender el significado de las funciones que para C18, por otro lado C18 tiene ejemplos incorporados y las notas de aplicación de USB de microchip traen código para C18.
No creo que haya motivos determinantes para elegir uno u otro, pasa más por el gusto de cada uno en mi opinión.

Saludos
27/04/2009 #3


No claro ... Inicializando la variable A con 1, no hace nada, es decir, modificando el programa para q trabaje con una variable no lo hace. Otro de los incoveniente q he tenido es la modificacion de librerias, he intentado modificar la del LCD para poder usarlo en el puerto D pero no se hacerlo, vi por ahi q tenia q modificar la libreria y con un programa q trae el C18 se volvia a compilar o algo asi ... pero le he dado a todo y de verdad q nada resulta ...
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.