Page 1 sur 1

Deux interruptions sur atm8535

Publié : 12 mai 2005 16:39
par Kubix
Bonjour , j'ai un probleme lorsque j'essaye de me servir des interruptions INT0 et INT1 (sur PD2 et PD3) dans un meme programme . En compilant j'ai ce message d'erreur :

!E FINISH.o(137): Code address 0x4 already contains a value
!E FINISH.o(137): Code address 0x5 already contains a value

Pourriez vous m'aider un peu a tout prendre en compte ?
Je vous mets ci joint mon programme . Merci d'avance




programme :

#include <iom8535v.h>
#include <macros.h>
#pragma interrupt_handler Y:iv_INT0 Stop:iv_INT1;
void MoteurX(int nbre_pasX);
void MoteurY(int nbre_pasY);
unsigned char Delay(unsigned long a); // Time delay function

void main(void)
{
int i;
DDRC=0xFF;PORTC=0xFF;
DDRA=0xFF;PORTA=0xFF;
DDRB=0xFF;PORTB=0xFF;
SREG=0x80; //Permet l'interruption
MCUCR=0x0A; //interruption sur front descendant
GICR=0xC0; //mask d'interruption
SEI ();
while (1)
{
MoteurX(1);
}
}

void Y() //Fonction d'interruption
{
while(1)
MoteurY(1);
}

void Stop() //Fonction d'interruption
{

PORTA=0x00;
Delay(40000);
}

unsigned char Delay (unsigned long a)
{
unsigned long b;
for(b=0;b<a;b++){};
return 1;
}

void MoteurX (int nbre_pasX) //fonction permettant de controler le deplacement du moteur en X
{
int i;int sensX=1;
if (sensX==1) //Deplacement dans un sens
{
for(i=0;i<nbre_pasX;i++) //Nombre de creneaux et gestion de ces creneaux sur le PORTC broche 0
{
PORTC=0xFA; Delay(30000);
PORTC=0xFB; Delay(30000);
}
}

else //Deplacement dans l'autre
{
for(i=0;i<nbre_pasX;i++)
{
PORTC=0xF8; Delay(30000);
PORTC=0xF9; Delay(30000);
}
}
PORTC=0xFF;
}




void MoteurY (int nbre_pasY) //fonction permettant de controler le deplacement du moteur en Y
{
int i;int sensY=0;
if (sensY==0) //Deplacement dans un sens.
{
for(i=0;i<nbre_pasY;i++) ////Nombre de creneaux et gestion de ces creneaux sur le PORTB broche 0
{
PORTB=0xFA; Delay(30000);
PORTB=0xFB; Delay(30000);
}
}
else //Deplacement dans l'autre sens
{
for(i=0;i<nbre_pasY;i++)
{
PORTB=0xF8; Delay(30000);
PORTB=0xF9; Delay(30000);
}
}
PORTB=0xFF;
}

Publié : 13 mai 2005 9:09
par JP
Bonjour,

Quel compilateur ?

Essayes peut être de désactiver les interruptions avant les delays et les réactiver apres.

a+
JP

Publié : 13 mai 2005 9:35
par Kubix
Le compilateur c'est ICC.

Publié : 13 mai 2005 9:37
par Kubix
Serai il possible que utilisant la version DEMO je ne puisse pas me servir de deux interruptions externes en meme tps ?

Publié : 13 mai 2005 9:52
par JP
All V7 demos (~6-7 megabytes) are fully functional for 45 days, then are code sized limit (normally 4K bytes) for an unlimited time for non-commercial use.
Apparemment non

Publié : 13 mai 2005 10:13
par Kubix
Ok , le probleme a été resolu mais je ne sais meme pas pourquoi . C'etait apparemment un probleme dans la configuration du compilateur . Mais maintenant un autre probleme :) Dans ma premiere interruption Y , ayant un while(1) je ne sors pas de cette interruption. Comment trouver un moyen simple de sortir de cette interruption si l'autre interruption est demandée (appui sur PD3) . J4essaye de voir un peu avec les flags mais c'est pas encore ca , je dois avoir des petits problemes d'expression . Merci pour l'aide JP en tout cas .

Publié : 13 mai 2005 14:08
par JP
Normalement tu dois pouvoir faire une interruption d'interruption, il faut juste vérifier que ICC l'autorise et ne pas entrer dans une boucle d'interruption qui fera vite déborder ta pile.