Autor Tema: Problemas para capturar vector de interrupción  (Leído 4616 veces)

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

Desconectado sdguez

  • PIC10
  • *
  • Mensajes: 2
Problemas para capturar vector de interrupción
« en: 11 de Diciembre de 2009, 08:24:11 »
Buenos días:

Os expongo unas dudas que tengo a ver si alguien me puede ayudar porque me estoy volviendo loco.
El caso es que quiero aprovechar la interrepción por desbordamiento del Timer0 de mi PIC (un Attiny26) para realizar un contaje.

Pues bien, tras leer documentación y algunos ejemplo que he encontrado en la red entiendo que el código que tengo escrito es correcto, no obstante me da errores de compilación y aquí es donde me vuelvo loco, pues no encuentro el motivo.

Aquí el código:

Código: [Seleccionar]
#include <stdio.h>
#include <interrupt.h>
#include <tn26def2.inc>

unsigned int counter = 0;
unsigned char two_seconds = 0;


ISR(OVF1addr) // Rutina atiende interrupción //linea 9 de código
{
        counter++;
        if(counter == 78125)
{
            two_seconds = 1;
            counter = 0;
        }
}

void main ()
{
while (1)
{
TCCR1B = 0x01; //Arranc timer1 // línea 23 de código
if (two_seconds == 1)
{
printf ("Hola mundo");
two_seconds=0;
}
sei();
TIMSK  |= 1 << TOIE1; //línea 30 de código.
cli();
}
}

La lista de errores es la siguiente:
    ../Interrupciones.c:9: error: expected declaration specifiers or '...' before numeric constant
    ../Interrupciones.c:10: warning: return type defaults to 'int'
    ../Interrupciones.c:19: warning: return type of 'main' is not 'int'
    ../Interrupciones.c:23:2: error: invalid suffix "F" on integer constant
    ../Interrupciones.c: In function 'main':
    ../Interrupciones.c:29: warning: implicit declaration of function 'sei'
    ../Interrupciones.c:30: error: lvalue required as left operand of assignment

Pues bien el caso es que no sé cómo depurar estos errores. Se me ocurre que debe haber algún problema en los arhivos "incluidos",  el interrupt.h (para manejo de las interrupciones) y el "tn26def2.inc" (donde están las definiciones de los registros).
Os dejo el código de este último, el "tn26def2.inc". Este archivo lo trae el propio compilador del AVR Studio y a mi humilde entender venía pensado para lenguaje ensamblador, ya que para que no me diera errores al compilar he tenido que cambiar
algunas cosillas, por ejmeplo la directiva "equ" por "#define", etc.

Código: [Seleccionar]
/***** I/O Register Definitions */
#define SREG 3F
#define SP 3D
#define GIMSK 3B
#define GIFR 3A
#define TIMSK 39
#define TIFR 38
#define MCUCR 35
#define MCUSR 34
#define TCCR0 33
#define TCNT0 32
#define OSCCAL 31
#define TCCR1A 30
#define TCCR1B 2F
#define TCNT1 2E
#define OCR1A 2D
#define OCR1B 2C
#define OCR1C 2B
#define PLLCSR 29
#define WDTCR 21
#define EEAR 1E
#define EEDR 1D
#define EECR 1C
#define PORTA 1B
#define DDRA 1A
#define PINA 19
#define PORTB 18
#define DDRB 17
#define PINB 16
#define USIDR 0F
#define USISR 0E
#define USICR 0D
#define ACSR 08
#define ADMUX 07
#define ADCSR 06
#define ADCH 05
#define ADCL 04

#define INT0addr 0x01 //External Interrupt0 Vector Address//
#define IOPINSaddr 0x02 //Pin change interrupt//
#define OC1Aaddr 0x03 //Output Compare1A Interrupt Vector Address//
#define OC1Baddr 0x04 //Output Compare1B Interrupt Vector Address//

#define OVF1addr 0x05 //Overflow0 Interrupt Vector Address//
#define OVF0addr 0x06 //Overflow0 Interrupt Vector Address//
#define USI_STARTaddr 0x07 //Universal Seria Bus Start Interrupt Address//
#define USI_OVFaddr 0x08 //Universal Seria Bus Overflow Interrupt Address//
#define ERDYaddr 0x09 //EEPROM Ready Interrupt Vector Address//
#define ACIaddr 0x0A //Analog Comparator Interrupt Vector Address//
#define ADCCaddr 0x0B //ADC conversion complete Interrupt Vector Address//

En fin, siento el rollo, alguién que me pueda iluminar?.
Muchas gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas para capturar vector de interrupción
« Respuesta #1 en: 11 de Diciembre de 2009, 09:45:13 »
Con que compilador estas programando?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Problemas para capturar vector de interrupción
« Respuesta #2 en: 11 de Diciembre de 2009, 11:09:14 »
es un pic o es un attiny???  :?
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado sdguez

  • PIC10
  • *
  • Mensajes: 2
Re: Problemas para capturar vector de interrupción
« Respuesta #3 en: 11 de Diciembre de 2009, 11:47:42 »
Citar
es un pic o es un attiny???  Confused
Lo siento, no sé a qué te refieres, entiendo que lo que tengo es un pic, de la marca Atmel, modelo Attiny 26. El pic viene ya instalado en una pequeña placa de desarrollo, que además del micro, trae un par de puertos, alimentación con eregularo, pulsador, led, etc etc.

Citar
Con que compilador estas programando?
Con el que suminstra Atmel, el AVR Studio 4.18.


Saludos.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas para capturar vector de interrupción
« Respuesta #4 en: 11 de Diciembre de 2009, 11:49:58 »
Citar
es un pic o es un attiny???  Confused
Lo siento, no sé a qué te refieres, entiendo que lo que tengo es un pic, de la marca Atmel, modelo Attiny 26. El pic viene ya instalado en una pequeña placa de desarrollo, que además del micro, trae un par de puertos, alimentación con eregularo, pulsador, led, etc etc.

 :z) Si es Atmel no es un PIC (Microchip)  :mrgreen: Por eso no entendía nada!  :D :D
No contesto mensajes privados, las consultas en el foro

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Problemas para capturar vector de interrupción
« Respuesta #5 en: 12 de Diciembre de 2009, 03:18:42 »
Ese printf esta porgusto, el atiny26 no tiene uart, el bluce while() debe estar despues de la configuracion del timer. Aqui te mando un ejemplo.

#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned int b;


ISR(TIMER0_OVF0_vect){
b++;
}

int main(void){

TCCR0=0x01; 
TCNT0=0x00;
TIMSK=0x02;

b=0;
sei();
while(1){
if(b>100)
  b=0;
}
}