begin process at 2008 09 05 19:03:57
1 237 429 membres
369 nouveaux aujourd'hui
14 313 membres club

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)

PIC 18F2550 le 30/06/2008 11:06:06

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



Classé sous : temp, bit, attendre, define, firmware

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS