Deux interruptions sur atm8535

Forum sur tous les autres logiciels : AVR Studio, AVR Assembleur, AVR ISP, Ponyprog, BASCOM-AVR, ICC AVR etc

Modérateur : Modérateur

Kubix

Deux interruptions sur atm8535

Message 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;
}

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message par JP »

Bonjour,

Quel compilateur ?

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

a+
JP

Kubix

Message par Kubix »

Le compilateur c'est ICC.

Kubix

Message par Kubix »

Serai il possible que utilisant la version DEMO je ne puisse pas me servir de deux interruptions externes en meme tps ?

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message 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

Kubix

Message 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 .

JP
Administrateur
Administrateur
Messages : 2323
Inscription : 23 sept. 2003 18:14
Localisation : Strasbourg
Contact :

Message 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.

Répondre