Se connecter / S'enregistrer
Votre question

Problème programme PIC (C) EEProm

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
5 Mars 2009 11:13:30

Bonjour,
J'essaye de faire un programme sous PIC.
(on souhaite compter les fronts montant sur RA0 et les afficher sur 2 afficheurs 7 segments )
Or, lors de la compilation, le progamme me dit :
"erreur de compilation : la constante milimetre est inaccesible car située en EEPROM de données.
La declarer avec #define (preferable) ou utiliser la fonction geta(milimetre)."

Merci de votre aide.


Voici le programme :

#include std84.h
#include bit84.h
#include math.h
#define ZERO portb.0, portb.1, portb.2, portb.3, portb.4, portb.5
#define UN portb.1, portb.2
#define DEUX portb.0, portb.1, portb.3, portb.4, portb.6
#define TROIS portb.0, portb.1, portb.2, portb.3, portb.6
#define QUATRE portb.1, portb.2, portb.5, portb.6
#define CINQ portb.0, portb.2, portb.3, portb.5, portb.6
#define SIX portb.2, portb.3, portb.4, portb.5, portb.6
#define SEPT portb.0, portb.1, portb.2
#define HUIT portb.0, portb.1, portb.2, portb.3, portb.4, portb.5, portb.6
#define NEUF portb.0, portb.1, portb.2, portb.3, portb.5, portb.6

char unitecm = 0;
char dizainecm = 0;
char unitemetre = 0;
char dizainemetre = 0;
char milimetre = 0;
trisa = 0b11111111; //défini le port A comme entrée
trisb = 0b00000000; //défini le port B comme sortie


//----------------------------DEBUT DU PROGRAMME PRINCIPAL-----------------------

void main() //fonction principale
{
void afficher(milimetre, unitecm, dizainecm, unitemetre, dizainemetre); :fou:  :fou:  (problème ici) :fou:  :fou: 

if(!porta.0) //si on a rien detecté avant
{
if(porta.0) //si on detecte un aimant
{
milimetre++*54 // 5.4mm et non 54mm (car char n'enregistre que des entiers)
unitecm++*4; // ajouter le passage de l'aimant en cm parcourus
}
if(milimetre>=100) //si 100/10 mm
{
unitecm++; // +1cm
milimetre=milimetre-100; // enlever 100/10 mm
}
if(unitecm >= 10) //convertit 10cm en 1 dizaine de cm
{
unitecm=unitecm-10;
dizainecm++;
}
if(dizainecm >= 10) //convertit 10dizaines de cm en 1 metre
{
dizainecm=dizainecm-10;
unitemetre++;
}
if(unitemetre >= 10) //convertit 10 metres en 1 dizaine de metres
{
unitemetre=unitemetre-10;
dizainemetre++;
}

}
} //fin de la mesure de distance
}

// -------------------------FIN DU PROGRAMME PRINCIPAL----------------------------------



void afficher();
{
if(porta.1=1) // si le bouton cm/m est en mode cm :
{
do //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
portb.7=1;
switch(unitecm)
{
case unitecm = 0 : {ZERO; break}
case unitecm = 1 : {UN; break}
case unitecm = 2 : {DEUX; break}
case unitecm = 3 : {TROIS; break}
case unitecm = 4 : {QUATRE; break}
case unitecm = 5 : {CINQ; break}
case unitecm = 6 : {SIX; break}
case unitecm = 7 : {SEPT; break}
case unitecm = 8 : {HUIT; break}
case unitecm = 9 : {NEUF; break}
default ;
}

microdelay(4); // mini attente pour eviter une surcharge du pic
portb.7=0; //afficher la variable dizainecm sur l'afficheur 7 segments de gauche
switch(dizainecm)
{
case dizainecm = 0 : {ZERO; break}
case dizainecm = 1 : {UN; break}
case dizainecm = 2 : {DEUX; break}
case dizainecm = 3 : {TROIS; break}
case dizainecm = 4 : {QUATRE; break}
case dizainecm = 5 : {CINQ; break}
case dizainecm = 6 : {SIX; break}
case dizainecm = 7 : {SEPT; break}
case dizainecm = 8 : {HUIT; break}
case dizainecm = 9 : {NEUF; break}
default ;
}
microdelay(4);
}while(porta.1 = 1) // bouton affichage m (0) ou cm (1)
}
else // si le bouton cm/m est en mode m :
{
do
{
portb.7=1; //afficher la variable unitemetre sur l'afficheur 7 segments de droite

switch(unitemetre)
{
case unitemetre = 0 : {ZERO; break}
case unitemetre = 1 : {UN; break}
case unitemetre = 2 : {DEUX; break}
case unitemetre = 3 : {TROIS; break}
case unitemetre = 4 : {QUATRE; break}
case unitemetre = 5 : {CINQ; break}
case unitemetre = 6 : {SIX; break}
case unitemetre = 7 : {SEPT; break}
case unitemetre = 8 : {HUIT; break}
case unitemetre = 9 : {NEUF; break}
default ;
}

microdelay(4);
portb.7=0; //afficher la variable dizainemetre sur l'afficheur 7 segments de gauche

switch(dizainemetre)
{
case dizainemetre = 0 : {ZERO; break}
case dizainemetre = 1 : {UN; break}
case dizainemetre = 2 : {DEUX; break}
case dizainemetre = 3 : {TROIS; break}
case dizainemetre = 4 : {QUATRE; break}
case dizainemetre = 5 : {CINQ; break}
case dizainemetre = 6 : {SIX; break}
case dizainemetre = 7 : {SEPT; break}
case dizainemetre = 8 : {HUIT; break}
case dizainemetre = 9 : {NEUF; break}
default ;
}
microdelay(4);
}while(porta.1 = 0) // bouton affichage m (0) ou cm (1)
}
}






}

Autres pages sur : probleme programme pic eeprom

5 Mars 2009 13:28:27

  1. void afficher();
  2. void afficher(milimetre, unitecm, dizainecm, unitemetre, dizainemetre);



Chercher l'erreur.......
14 Mars 2009 10:02:28

Je ne suis pas du tout un as du C.
Mais le probleme est en parti réglé.
(Je mettrais en ligne le code "amelioré" lundi).

Merci pour ton aide maxcailla.
Contenus similaires
16 Mars 2009 21:06:08

Le code est presque complètement debugé (grâce à un professeur et à un peu de logique).
Mais une erreur persiste : je défini la variable "unitecm" mais le compilateur ne veut faire aucun test logique car il dit que unitecm n'est rien d'autre qu'UN bit ("erreur de compilation : comparaison de bits non permise ici").

Voici le programme simplifié :



#include std84.h
#include bit84.h
#define ZERO portb.0; portb.1; portb.2; portb.3; portb.4; portb.5;
#define UN portb.1; portb.2;
#define DEUX portb.0; portb.1; portb.3; portb.4; portb.6;
#define TROIS portb.0; portb.1; portb.2; portb.3; portb.6;
#define QUATRE portb.1; portb.2; portb.5; portb.6;
#define CINQ portb.0; portb.2; portb.3; portb.5; portb.6;
#define SIX portb.2; portb.3; portb.4; portb.5; portb.6;
#define SEPT portb.0; portb.1; portb.2;
#define HUIT portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6;
#define NEUF portb.0; portb.1; portb.2; portb.3; portb.5; portb.6;

char unitecm;

trisa = 0b11111111; //défini le port A comme entrée
trisb = 0b00000000; //défini le port B comme sortie



void main() //fonction principale
{

do //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
portb.7=1;
if (unitecm ==0){ZERO; }
if (unitecm) {UN; } //==1 ne marche pas
if (unitecm ==2) {DEUX; } //C'est ici que le compilateur dit qu'il y a une erreur
if (unitecm ==3) {TROIS; }
if (unitecm ==4) {QUATRE; }
if (unitecm ==5) {CINQ; }
if (unitecm ==6) {SIX; }
if (unitecm ==7) {SEPT; }
if (unitecm ==8) {HUIT; }
if (unitecm ==9) {NEUF; }
microdelay(4); // mini attente pour eviter une surcharge du pic
}while(porta.1 = 1) // bouton affichage m (0) ou cm (1)
} }



Je remercie 1000 fois la personne qui arrivera ne serait-ce qu'à me mettre sur la bonne piste (car même notre professeur n'a pas trouvé d'où vient le problème !).

17 Mars 2009 18:21:00

%d 2?

Pour définir un code en décimal?
a b L Programmation
17 Mars 2009 20:23:38

unitecm n'est lié à aucun port, n'est pas initialisé et n'est jamais modifié. Même si ça compilait, tu ne ferais pas grand chose avec.
19 Mars 2009 06:51:00

pour repondre à Tybbow, en C (pic), pour mettre en décimal, normalement, on marque 0d... j'ai testé avec %d, ça ne marche pas.

N'est-ce pas le rôle du compilateur de relier une variable à un port ?
Sinon, pour définir, comment fait-on ?
(pourquoi "char unitecm" ne suffit pas ?

Merci à vous deux !
a b L Programmation
19 Mars 2009 21:00:50

Citation :
N'est-ce pas le rôle du compilateur de relier une variable à un port ?

Oui, mais il devine le port auquel tu veux te rattacher ? :) 
Il faut utiliser des #define comme pour tous les ports.
19 Mars 2009 23:59:07

Utilise le logiciel, max plus II, tu peux assigner directement les broches du pic avec une interface graphique.
23 Mars 2009 16:56:53

ok, probleme réglé (le pic n'aime pas les boucles dans les boucles ...).

voici le programme :

#include std84.h
#include bit84.h
#define ZERO portb.0; portb.1; portb.2; portb.3; portb.4; portb.5;
#define UN portb.1; portb.2;
#define DEUX portb.0; portb.1; portb.3; portb.4; portb.6;
#define TROIS portb.0; portb.1; portb.2; portb.3; portb.6;
#define QUATRE portb.1; portb.2; portb.5; portb.6;
#define CINQ portb.0; portb.2; portb.3; portb.5; portb.6;
#define SIX portb.2; portb.3; portb.4; portb.5; portb.6;
#define SEPT portb.0; portb.1; portb.2;
#define HUIT portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6;
#define NEUF portb.0; portb.1; portb.2; portb.3; portb.5; portb.6;

char unitecm,dizainecm,unitemetre,dizainemetre,milimetre;

trisa = 0b11111111; //défini le port A comme entrée
trisb = 0b00000000; //défini le port B comme sortie


//----------------------------DEBUT DU PROGRAMME PRINCIPAL-----------------------

void main() //fonction principale
{
afficher(); // appel de la fonction afficher
//début de la mesure de distance
if(!porta.0) //si on a rien detecté avant
{
while(!porta.0); // attendre un passage d'aimant

milimetre=milimetre+93; // ajouter 93mm/10 soit 9.3 mm
unitecm=unitecm+3; // ajouter 3cm
// => 3.93 cm parcourus mesurés
if(milimetre>=100) //si 100/10 mm
{
unitecm++; // +1cm
milimetre=milimetre-100; // enlever 100/10 mm
}
if(unitecm >= 10) //convertit 10cm en 1 dizaine de cm
{
unitecm=unitecm-10;
dizainecm++;
}
if(dizainecm >= 10) //convertit 10dizaines de cm en 1 metre
{
dizainecm=dizainecm-10;
unitemetre++;
}
if(unitemetre >= 10) //convertit 10 metres en 1 dizaine de metres
{
unitemetre=unitemetre-10;
dizainemetre++;
}
if(dizainemetre>9) // si 100M atteint
{
unitecm=0; dizainecm=0; unitemetre=0; dizainemetre=0; milimetre=0; // tout remettre à 0
}
} //fin de la mesure de distance
}

// -------------------------FIN DU PROGRAMME PRINCIPAL----------------------------------



void afficher()
{
if(porta.1) // si le bouton cm/m est en mode cm :
{
portb.7=1;
switch(unitecm) //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
case 1 : {UN ; break;}
case 2 : {DEUX ; break;}
case 3 : {TROIS ; break;}
case 4 : {QUATRE ; break;}
case 5 : {CINQ ; break;}
case 6 : {SIX ; break;}
case 7 : {SEPT ; break;}
case 8 : {HUIT ; break;}
case 9 : {NEUF ; break;}
}
// delay(1); // mini attente pour eviter une surcharge du pic
portb.7=0; //afficher la variable dizainecm sur l'afficheur 7 segments de gauche


switch(dizainecm) //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
case 1 : {UN ; break;}
case 2 : {DEUX ; break;}
case 3 : {TROIS ; break;}
case 4 : {QUATRE ; break;}
case 5 : {CINQ ; break;}
case 6 : {SIX ; break;}
case 7 : {SEPT ; break;}
case 8 : {HUIT ; break;}
case 9 : {NEUF ; break;}
}
// delay(1);
}
else // si le bouton cm/m est en mode m :
{
portb.7=1; //afficher la variable unitemetre sur l'afficheur 7 segments de droite

switch(unitemetre) //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
case 1 : {UN ; break;}
case 2 : {DEUX ; break;}
case 3 : {TROIS ; break;}
case 4 : {QUATRE ; break;}
case 5 : {CINQ ; break;}
case 6 : {SIX ; break;}
case 7 : {SEPT ; break;}
case 8 : {HUIT ; break;}
case 9 : {NEUF ; break;}
}
// delay(1);
portb.7=0; //afficher la variable dizainemetre sur l'afficheur 7 segments de gauche

switch(dizainemetre) //afficher la variable unitecm sur l'afficheur 7 segments de droite
{
case 1 : {UN ; break;}
case 2 : {DEUX ; break;}
case 3 : {TROIS ; break;}
case 4 : {QUATRE ; break;}
case 5 : {CINQ ; break;}
case 6 : {SIX ; break;}
case 7 : {SEPT ; break;}
case 8 : {HUIT ; break;}
case 9 : {NEUF ; break;}
}
// delay(1);

}
}
23 Mars 2009 17:01:52

Quand je compile, tout va bien.

mais comme un probleme ne vient pas seul (voir les posts ci-haut):
Quand on essaye de lancer/telecharger le programme, devpic me dis que "SwitchEnd0_" est deja defini [assembleur :(  ].

Voici le "code" assembleur du programme ci dessus :






;_________ Texte Assembleur issu du compilateur DevPic __________
;
; "PPE programme OK00.c" construit le 23/03/2009 17:01:43
;________________________________________________________________

include "Mac84.h" ; Macros standard
include "Reg84.h" ; Registres et bits


_PIC_ equ 84 ;type de Pic utilisé
config 0x3FF1
picid 'V','1','0','0' ;Version 1.00


;__ 6 variables système en banque 0
_A_ set 0x4A ;accumulateur auxiliaire;
_s0_ set 0x4B ;) 
_s1_ set 0x4C ;) registres temporaires
_s2_ set 0x4D ;) 
_s3_ set 0x4E ;) 
_W_ set 0x4F ;) Registre de travail W

;__ Les variables globales sont déclarées ici
org 0x0C,zreg

•014: char unitecm,dizainecm,unitemetre,dizainemetre,milimetre;
unitecm rm 1 ;entier non signé 8 bits
dizainecm rm 1 ;entier non signé 8 bits
unitemetre rm 1 ;entier non signé 8 bits
dizainemetre rm 1 ;entier non signé 8 bits
milimetre rm 1 ;entier non signé 8 bits

•016: trisa = 0b11111111;
org 0,zdata ;constante placée en EEProm de données
trisa data 255 ;Nombre

•017: trisb = 0b00000000;
trisb data 0 ;Nombre

•022: void main()
org 0x000,zprog ;Code exécutable
main
BaseLoc set 0x4A ;zône pour variables locales

•024: afficher();
call afficher ;appel fonction interne

•026: if(!porta.0)

btfsc PORTA,0
goto L1_
L2_
•028: while(!porta.0);
L3_
btfsc PORTA,0
goto L4_
goto L3_
L4_
•030: milimetre=milimetre+93;
movf milimetre,W
addlw 93 ;addition 8 bits
movwf milimetre

•031: unitecm=unitecm+3;
movf unitecm,W
addlw 3 ;addition 8 bits
movwf unitecm

•033: if(milimetre>=100)
movf milimetre,W
movwf _s0_ ;) 
movlw 100 ;) 
subwf _s0_,F ;)  Test >=
btfss STATUS,C ;) 
goto L5_
L6_
•035: unitecm++;
movf unitecm,W
incf unitecm,F

•036: milimetre=milimetre-100;
movf milimetre,W
addlw -100
movwf milimetre

•038: if(unitecm >= 10)
L5_ movf unitecm,W
movwf _s0_ ;) 
movlw 10 ;) 
subwf _s0_,F ;)  Test >=
btfss STATUS,C ;) 
goto L7_
L8_
•040: unitecm=unitecm-10;
movf unitecm,W
addlw -10
movwf unitecm

•041: dizainecm++;
movf dizainecm,W
incf dizainecm,F

•043: if(dizainecm >= 10)
L7_ movf dizainecm,W
movwf _s0_ ;) 
movlw 10 ;) 
subwf _s0_,F ;)  Test >=
btfss STATUS,C ;) 
goto L9_
L10_
•045: dizainecm=dizainecm-10;
movf dizainecm,W
addlw -10
movwf dizainecm

•046: unitemetre++;
movf unitemetre,W
incf unitemetre,F

•048: if(unitemetre >= 10)
L9_ movf unitemetre,W
movwf _s0_ ;) 
movlw 10 ;) 
subwf _s0_,F ;)  Test >=
btfss STATUS,C ;) 
goto L11_
L12_
•050: unitemetre=unitemetre-10;
movf unitemetre,W
addlw -10
movwf unitemetre

•051: dizainemetre++;
movf dizainemetre,W
incf dizainemetre,F

•053: if(dizainemetre>9)
L11_ movf dizainemetre,W
sublw 9 ;) 
btfsc STATUS,C ;)  Test >
goto L13_
L14_
•055: unitecm=0; dizainecm=0; unitemetre=0; dizainemetre=0; milimetre=0;

clrf unitecm

clrf dizainecm

clrf unitemetre

clrf dizainemetre

clrf milimetre
L13_
L1_
;---fin de la fonction main---
sleep ;pour réduire la consommation
goto .-1 ;si réveil par interruption: réendormir

;________________________________________________________________

•064: void afficher()
afficher
•066: if(porta.1)
bank0 ;accès à la banque 0 du fichier

btfss PORTA,1
goto L15_
L16_
•068: portb.7=1;
bsf PORTB,7


•069: switch(unitecm)
movf unitecm,W
movwf _W_

•071: case 1 : {portb.1; portb.2; ; break;}
S0_ sublw 1 ;si égalité,
skipz ;exécuter ce cas
goto S1_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier


goto SwitchEnd0_

•072: case 2 : {portb.0; portb.1; portb.3; portb.4; portb.6; ; break;}
S1_ movf _W_,W ;recupere W
sublw 2 ;si égalité,
skipz ;exécuter ce cas
goto S2_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•073: case 3 : {portb.0; portb.1; portb.2; portb.3; portb.6; ; break;}
S2_ movf _W_,W ;recupere W
sublw 3 ;si égalité,
skipz ;exécuter ce cas
goto S3_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•074: case 4 : {portb.1; portb.2; portb.5; portb.6; ; break;}
S3_ movf _W_,W ;recupere W
sublw 4 ;si égalité,
skipz ;exécuter ce cas
goto S4_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier




goto SwitchEnd0_

•075: case 5 : {portb.0; portb.2; portb.3; portb.5; portb.6; ; break;}
S4_ movf _W_,W ;recupere W
sublw 5 ;si égalité,
skipz ;exécuter ce cas
goto S5_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•076: case 6 : {portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S5_ movf _W_,W ;recupere W
sublw 6 ;si égalité,
skipz ;exécuter ce cas
goto S6_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•077: case 7 : {portb.0; portb.1; portb.2; ; break;}
S6_ movf _W_,W ;recupere W
sublw 7 ;si égalité,
skipz ;exécuter ce cas
goto S7_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier



goto SwitchEnd0_

•078: case 8 : {portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S7_ movf _W_,W ;recupere W
sublw 8 ;si égalité,
skipz ;exécuter ce cas
goto S8_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier







goto SwitchEnd0_

•079: case 9 : {portb.0; portb.1; portb.2; portb.3; portb.5; portb.6; ; break;}
S8_ movf _W_,W ;recupere W
sublw 9 ;si égalité,
skipz ;exécuter ce cas
goto S9_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier






goto SwitchEnd0_
S9_
SwitchEnd0_

•082: portb.7=0;
btfss PORTB,7
goto .+3
bsf PORTB,1
goto .+2
bcf PORTB,1

•085: switch(dizainecm)
movf dizainecm,W
movwf _W_

•087: case 1 : {portb.1; portb.2; ; break;}
S10_ sublw 1 ;si égalité,
skipz ;exécuter ce cas
goto S11_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier


goto SwitchEnd0_

•088: case 2 : {portb.0; portb.1; portb.3; portb.4; portb.6; ; break;}
S11_ movf _W_,W ;recupere W
sublw 2 ;si égalité,
skipz ;exécuter ce cas
goto S12_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•089: case 3 : {portb.0; portb.1; portb.2; portb.3; portb.6; ; break;}
S12_ movf _W_,W ;recupere W
sublw 3 ;si égalité,
skipz ;exécuter ce cas
goto S13_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•090: case 4 : {portb.1; portb.2; portb.5; portb.6; ; break;}
S13_ movf _W_,W ;recupere W
sublw 4 ;si égalité,
skipz ;exécuter ce cas
goto S14_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier




goto SwitchEnd0_

•091: case 5 : {portb.0; portb.2; portb.3; portb.5; portb.6; ; break;}
S14_ movf _W_,W ;recupere W
sublw 5 ;si égalité,
skipz ;exécuter ce cas
goto S15_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•092: case 6 : {portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S15_ movf _W_,W ;recupere W
sublw 6 ;si égalité,
skipz ;exécuter ce cas
goto S16_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•093: case 7 : {portb.0; portb.1; portb.2; ; break;}
S16_ movf _W_,W ;recupere W
sublw 7 ;si égalité,
skipz ;exécuter ce cas
goto S17_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier



goto SwitchEnd0_

•094: case 8 : {portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S17_ movf _W_,W ;recupere W
sublw 8 ;si égalité,
skipz ;exécuter ce cas
goto S18_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier







goto SwitchEnd0_

•095: case 9 : {portb.0; portb.1; portb.2; portb.3; portb.5; portb.6; ; break;}
S18_ movf _W_,W ;recupere W
sublw 9 ;si égalité,
skipz ;exécuter ce cas
goto S19_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier






goto SwitchEnd0_
S19_
SwitchEnd0_

goto L17_

•099: else
L15_
•101: portb.7=1;
btfss PORTB,7
goto .+3
bsf PORTB,1
goto .+2
bcf PORTB,1

•103: switch(unitemetre)
movf unitemetre,W
movwf _W_

•105: case 1 : {portb.1; portb.2; ; break;}
S20_ sublw 1 ;si égalité,
skipz ;exécuter ce cas
goto S21_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier


goto SwitchEnd0_

•106: case 2 : {portb.0; portb.1; portb.3; portb.4; portb.6; ; break;}
S21_ movf _W_,W ;recupere W
sublw 2 ;si égalité,
skipz ;exécuter ce cas
goto S22_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•107: case 3 : {portb.0; portb.1; portb.2; portb.3; portb.6; ; break;}
S22_ movf _W_,W ;recupere W
sublw 3 ;si égalité,
skipz ;exécuter ce cas
goto S23_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•108: case 4 : {portb.1; portb.2; portb.5; portb.6; ; break;}
S23_ movf _W_,W ;recupere W
sublw 4 ;si égalité,
skipz ;exécuter ce cas
goto S24_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier




goto SwitchEnd0_

•109: case 5 : {portb.0; portb.2; portb.3; portb.5; portb.6; ; break;}
S24_ movf _W_,W ;recupere W
sublw 5 ;si égalité,
skipz ;exécuter ce cas
goto S25_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•110: case 6 : {portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S25_ movf _W_,W ;recupere W
sublw 6 ;si égalité,
skipz ;exécuter ce cas
goto S26_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•111: case 7 : {portb.0; portb.1; portb.2; ; break;}
S26_ movf _W_,W ;recupere W
sublw 7 ;si égalité,
skipz ;exécuter ce cas
goto S27_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier



goto SwitchEnd0_

•112: case 8 : {portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S27_ movf _W_,W ;recupere W
sublw 8 ;si égalité,
skipz ;exécuter ce cas
goto S28_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier







goto SwitchEnd0_

•113: case 9 : {portb.0; portb.1; portb.2; portb.3; portb.5; portb.6; ; break;}
S28_ movf _W_,W ;recupere W
sublw 9 ;si égalité,
skipz ;exécuter ce cas
goto S29_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier






goto SwitchEnd0_
S29_
SwitchEnd0_

•116: portb.7=0;
btfss PORTB,7
goto .+3
bsf PORTB,1
goto .+2
bcf PORTB,1

•118: switch(dizainemetre)
movf dizainemetre,W
movwf _W_

•120: case 1 : {portb.1; portb.2; ; break;}
S30_ sublw 1 ;si égalité,
skipz ;exécuter ce cas
goto S31_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier


goto SwitchEnd0_

•121: case 2 : {portb.0; portb.1; portb.3; portb.4; portb.6; ; break;}
S31_ movf _W_,W ;recupere W
sublw 2 ;si égalité,
skipz ;exécuter ce cas
goto S32_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•122: case 3 : {portb.0; portb.1; portb.2; portb.3; portb.6; ; break;}
S32_ movf _W_,W ;recupere W
sublw 3 ;si égalité,
skipz ;exécuter ce cas
goto S33_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•123: case 4 : {portb.1; portb.2; portb.5; portb.6; ; break;}
S33_ movf _W_,W ;recupere W
sublw 4 ;si égalité,
skipz ;exécuter ce cas
goto S34_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier




goto SwitchEnd0_

•124: case 5 : {portb.0; portb.2; portb.3; portb.5; portb.6; ; break;}
S34_ movf _W_,W ;recupere W
sublw 5 ;si égalité,
skipz ;exécuter ce cas
goto S35_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•125: case 6 : {portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S35_ movf _W_,W ;recupere W
sublw 6 ;si égalité,
skipz ;exécuter ce cas
goto S36_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier





goto SwitchEnd0_

•126: case 7 : {portb.0; portb.1; portb.2; ; break;}
S36_ movf _W_,W ;recupere W
sublw 7 ;si égalité,
skipz ;exécuter ce cas
goto S37_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier



goto SwitchEnd0_

•127: case 8 : {portb.0; portb.1; portb.2; portb.3; portb.4; portb.5; portb.6; ; break;}
S37_ movf _W_,W ;recupere W
sublw 8 ;si égalité,
skipz ;exécuter ce cas
goto S38_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier







goto SwitchEnd0_

•128: case 9 : {portb.0; portb.1; portb.2; portb.3; portb.5; portb.6; ; break;}
S38_ movf _W_,W ;recupere W
sublw 9 ;si égalité,
skipz ;exécuter ce cas
goto S39_ ;sinon, voir le cas suivant
bank0 ;accès à la banque 0 du fichier






goto SwitchEnd0_
S39_
SwitchEnd0_
L17_ bank0 ;accès à la banque 0 du fichier

return ;fin de la fonction afficher

;________________________________________________________________

•000:Fin du code lié au texte C



end
;
a b L Programmation
23 Mars 2009 20:14:57

Apparemment, le compilateur ne souhaite avoir qu'un seul switch, alors tente avec des if un peu partout, sinon change dans l'assembleur les labels des SwitchEnd0_.
24 Mars 2009 21:16:59

ok, je vais tester avec des "if" (mais le compilateur à l'air de hair au plus haut point mes if car pour une variable (char) il dit que c'est un BIT dès que l'on fait un test logique avec if).

Sinon, je n'ai pas compris comment changer "les labels des SwitchEnd0_" !
Pourrais tu être plus explicite sur la manière de procéder ?

Merci à toi :) 
a b L Programmation
25 Mars 2009 19:32:08

Par exemple, sur le second switch, tu remplace les "goto SwitchEnd0_" par "goto SwitchEnd1_" et évidemment, le label de fin tu remplaces "SwitchEnd0_" par "SwitchEnd1_".
Tu fais ça pour tous les switch.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS