Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : PIC 18F2550 [ Divers / Débutant(e) ] (PIC18F)

lundi 30 juin 2008 à 11:06:06 | PIC 18F2550

PIC18F

Bonjour,

Je suis débutant en programmation des PICS. Actuellement je programme un PIC 18F2550 en assembleur. Je dois gérer la communication entre une carte sans contact et un lecteur de carte sans contact selon la norme ISO 14440. Il s'agit de gérer l'envoi et la réception de trames échangées entre ces 2 systèmes.

Voici le bout de code qui me pose problème:

/*+++******* DEFINITIONS DE CONSTANTES LOCALES **************************---*/

// déclaration de variables locales
CBLOCK 0x00 // début de la zone variables
local2 : 1 // variable locale 2
ENDC  // Fin de la zone


#define ZERO 0x55    // correspond à 85 en décimal
#define UN  0xAA    // correspond à 170 en décimal
#define BGT  0x56    // correspond à 86 en décimal

#define SERIAL PIN_B1
#define PORT_TEST PIN_B4
#define PORT_FIELD PIN_C6
#define TX9D   0x0000
#define Parite  0x003d
#define Calcul  0x003c

#define caract local2 // caractère à envoyer
#define parite local3 // bit de parité
#define cmptbts local4 // compteur de bits

 


/*+++******* DEFINITIONS DE TYPES LOCALES *******************************---*/


/*+++******* DEFINITIONS DE MACROS LOCALES ******************************---*/


/*+++******* DECLARATION DE DONNEES GLOBALES EXPORTABLES ****************---*/
//unsigned char CRC[2];

/*+++******* DECLARATION DE DONNEES GLOBALES INTERNES (STATIC) **********---*/
#byte PIR1 = 0x0F9E
#byte TXREG = 0x0FAD
#byte STATUS = 0x0FD8
#byte TXSTA = 0x0FAC
#byte PORTB = 0x0F81
#byte INTCON = 0x0FF2
#byte T0CON = 0x0FD5
/*+++******* DEFINITIONS DE FONCTIONS LOCALES (STATIC) ******************---*/


/*+++******* CODE DES FONCTIONS LOCALES (STATIC) ************************---*/


/*+++******* CODE DES FONCTIONS GLOBALES ********************************---*/

 


/***************************************************************@comm
* TEMPORISATION
*************************************************************@remark*/

/*temp_1: initialise tmr1 pour que la temporisation soit égale à
* l'équivalent de 1,5 µs - le temps nécessaire pour arriver dans la routine
* temp_2 : Attend que l'écart entre la précédente tempo et la tempo
* actuelle soit de (1 etu / 4,1) , soit 2,3 µs
* temp_3 : Attend que l'écart entre la précédente tempo et la tempo
* actuelle soit de (1 etu / 2) , soit 4,7 µs
* Pour le premier bit recu on se place à 3 positions différentes pour la mesure (car un bit peut prendre 3 états différents durant 1 etu:
             position 1 : 1,5 µs
    position 2 : 3,8 µs
    position 3 : 8,5 µs
    Pour les bits suivants on effectue la meme procédure  */


// Initialisation du TIMER 0 (16 bit)
 // Horloge interne de 20 MHZ
 // Diviseur par 1
 // le timer s'incremente toutes les 0,4 us
 // it will overflow every 13,1 ms
 // 1 / ( 20 000 000 / (4*2)) = 0.4 * 10-6
 //
void tempo(void)

unsigned long timer0 = 0;
setup_timer_0( RTCC_DIV_2 | RTCC_INTERNAL);
//T0CONbits.T08BIT = 0; // 0 = Timer0 is configured as a 16-bit timer/counter
#asm

//bcf T0CON , T08BIT; // 0 = Timer0 is configured as a 16-bit timer/counter
movlw 88
movwf T0CON
timer0 = get_timer0();
temp_1:
movlw -8  // préparer valeur tmr1 (durée 1,5 µs)
movwf timer0 // initialiser tmr1
call temp_suite // et attendre 1/2 bit

temp_2:
movlw -11 // écart entre la précédente tempo1 et la tempo actuelle
addwf timer0 , f // ajouter à la valeur actuelle

temp_3:
movlw -23 // écart entre la précédente tempo2 et la tempo actuelle
addwf timer0 , f // ajouter à la valeur actuelle

temp_4:
movlw -46 // écart entre 2 bits, équivalent à 1 etu
addwf timer0 , f // ajouter à la valeur actuelle

temp_5:
movlw -432 // correspond au BGT (tps min entre le front montant du dernier bit et le front descendant du dernier bit de 2 trames consécutives transmises dans des directions opposées)
addwf timer0 , f // ajouter à la valeur actuelle

temp_suite:
bcf INTCON , TMR0IF // effacer flag (débordement du timer 0)

temp_wait:
btfss INTCON , TMR0IF // attendre débordement timer
goto temp_wait // pas fini, attendre
return //  sortir
#endasm
}

/******************************************************************@comm
* Réception d'un octet provenant du lecteur de carte sans contact depuis l'antenne
*******************************************************************@remark*/

// Caractère lu dans W. La parité pas n'est pas vérifiée
void reception(void)
{
 #asm
Receive:
// attendre début start-bit
btfsc SERIAL // Tester si start bit arrivé
goto Receive // non, attendre

// se positionner sur le milieu du 1er bit utile
call temp_1 // attendre 1.5 µs

//réception du caractère
movlw 0x8 // pour 8 bits
movwf cmptbts // dans compteur de bits

Recloop:
bcf STATUS , C // Carry = 0
btfsc SERIAL // tester si bit = 0
bsf STATUS , C // Carry = bit reçu
rrf caract , f // faire entrer le bit par la gauche
call temp_2 // attendre milieu caractère suivant
rrf caract , f // faire entrer le bit par la gauche
call temp_3 // attendre milieu caractère suivant
decfsz cmptbts , f // décrémenter compteur de bits
goto Recloop // pas dernier, suivant
// on pointe actuellement sur le centre du bit de parité
// reste donc à attendre +- 1.5 bits pour être dans le second stop-bit

call temp_4 // Attendre 1 bit
movf caract , w // charger caractère lu
return // et retour

 #endasm
}
/******************************************************************@comm
* Envoi d'un octet vers le lecteur de carte *
****************************************************************@remark*/

// envoie l'octet contenu dans le registre w vers le lecteur de carte
void emission(void)
{
#asm
Send:
movwf caract // Sauver caractère à envoyer
call temp_5 // attendre BGT
BANK1 // passer banque1
bcf TXREG // port série en sortie (modifié)
BANK0 // repasser banque0
 
// envoyer start-bit
bcf SERIAL // envoyer 0 : start-bit
clrf parite // effacer bit de parité
movlw 8 // pour 8 bits à envoyer
movwf cmptbts // dans compteur de bits
call temp_4 // attente entre 2 bits

// envoyer 8 bits de data
Send_loop:
rrf caract , f // décaler caractère, b0 dans carry
rrf caract , w  // carry dans b7 de w
andlw 0x80  // garder bit à envoyer en position b7
xorwf parite , f // positionner parité
xorwf PORTB , w  // Garder 1 si changement sur SERIAL
xorwf PORTB , f  // si oui, inverser RB7
call temp_4 // attente entre 2 bits
decfsz cmptbts , f // décrémenter compteur de bits
goto Send_loop // pas dernier, suivant

// envoyer parité
movf parite , w // charger parité paire calculée
xorwf PORTB , w // Si serial différent de bit à envoyer
xorwf PORTB , f // alors inverser RB7
call temp_4 // attendre fin de parité

//envoyer 2 stop-bits
BANK1 // passer banque1
bsf TXREG // repasser en entrée (et niveau haut) (modifié)
BANK0 // passer banque0
call temp_4 // attendre temps entre 2 bits
call temp_4 // attendre temps entre 2 bits
return // et retour
#endasm
}


Une fois que je compile je recois les erreurs suivantes:

*** Error 48 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 38(7,13): Expecting a (
*** Error 48 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 39(8,14): Expecting a (
*** Error 43 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 39(10,11): Expecting a declaration
*** Error 48 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 71(2,6): Expecting a (
*** Error 48 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 71(12,16): Expecting a (
*** Error 43 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 71(14,20): Expecting a declaration
*** Error 95 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 124(1,2): Expecting an opcode mnemonic
*** Error 102 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 166(1,5): Expect comma
*** Error 12 "D:\VSS\_G60 - ContactlessProbe\SimCosCL_2008\programmation Firmware\Firmware\Vxx\SCD_Driver_typeA.c" Line 204(1,2): Undefined identifier   local2


Quelqu'un pourrait-il m'aider?
merci par avance.

PIC18F




Cette discussion est classé dans : temp, bit, attendre, define, firmware


Répondre à ce message

Sujets en rapport avec ce message

affichage lcd et calculatrice [ par lefrans ] bojour a tous voila mon probleme je doit tj faire cette calculatrice et je suis bloqué, je narrive pas a afficher plusieur chiffre ala suite sur mon l help me [ par theyoupione ] j'ai écri un ptit prog dont voici un extrait permettant d'envoyer un octet vers liaison série mais j'ai un pb lors de la compilation avec mplabl'erreu projet de fin d'année [ par jorus1212 ] Je suis en projet et je doit developpé un programme qui absorbe les données d'un pc par liaison rs232 de façon asynchronne et les stocke dans le buffe Pb de compilation ressource [ par AlexMAN ] BruNews, ca fait une heure ke je texte ton bat, ca me compile bien mon exe, il est fonctionnel mais ne m'affiche pas ma dialog box ! Voila le code de bits de registres [ par vecchio56 ] Salut,Je cherche le moyen le plus rapide de-connaitre le bit numero n d'un registre-mettre à b le bit numero n d'un registre(Ou si c'est possible mett programme asm [ par smailhou ] Bonjour a tousj'essai de faire un programme de tri par insertion, mais la je n'arrive a complilerj'utilise le MC 68c12je pense qu'il y'a tous dans mon problrmr dr tri en assembleur [ par smailhou ] Bonjour tous le mondevoila je programme en c et j'essai de faire le programe en asmc un programme de tri par insertion, j'ai pu faire le code asm mais lcd 2x8 en mode 4 bit [ par tsii22 ] Bonjour ,je cherche comment programmer en assembleur avec un pic16f57, un lcd DMC-50448N-E-AE, qui est un lcd 2x8 en mode 4bit. Je veux afficher des c pic 16f84a [ par Moptio ] Bonjour,Je commence la programmation des PICs et notamment du 16F84A en langage assembleur et ca ne marche pas.Le but etait de me familiariser avec ce probleme avec TASM [ par nernit ] lorsque je compile mo code : .NOLIST #define end.end #define END.end #define equ.equ #define EQU.equ #include "ti83asm.inc" #include "tokens.inc" .LIS


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,981 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.