Et pourtant chez moi ça marche nikel, sauf pour l'affichage des secondes que je n'arrive pas à avoir correctement...
-----
Et pourtant chez moi ça marche nikel, sauf pour l'affichage des secondes que je n'arrive pas à avoir correctement...
nota:sauf pour l'affichage des secondes
j'avais remarqué des aleas aussi avec printf
j'ai donc plutot utilisé fprint-_H_USART,.. pour la mise en forme
et le format 5u au lieu de 5d car UNSIGNED...
voici l'exemple de mon code utilisé
et le script terminal VBRAY qui envoi la trame cycle toutes les 200mSCode:while(1) { if (seconde==1) { secs++; seconde=0; } if (received==1) { n1++; if (n1>5) { k=fprintf(_H_USART,(const rom unsigned char *)"CYCLE_ANALYST: %s COMPTE_TOUR: %05u Secs=%05u \r\n ",buffer,compteur,secs ); n1=0; } received=0; // raz drapeau rx uart Index1=0; i1=0; buffer[0]=0; RCREG=0; } else { readDS1307(); Transform_Time_BCD_To_Binary(sec, min, hr, week_day, day, mn, year); addr=LCD_ADDR; k=fprintf(_H_USART,(const rom unsigned char *)"Time is %02d:%02d:%02d ",hr,min,sec); LCD_putcmd(LCD_LINE1,1); txt=&Texte[0]; k=sprintf(txt,(const rom unsigned char *)"Time is %02dH %02d %02ds ",hr,min,sec); LCD_puts(txt); txt=&Texte[0]; LCD_putcmd(LCD_LINE2,1); k=sprintf(txt,(const rom unsigned char *)"Date is %02d/%02d/20%02d ",day,mn,year); LCD_puts(txt); LCD_putcmd(LCD_LINE3,1); txt=&Texte[0]; k=sprintf(txt,(const rom unsigned char *)"Secs=%05d ",secs); LCD_puts(txt); LCD_putcmd(LCD_LINE4,1); txt=&Texte[0]; k=sprintf(txt,(const rom unsigned char *)"Tour=%05d ",compteur); LCD_puts(txt); // 10-Bit ADC Value for DAC } }
Code:program CycleAnalyst; var msg: string; var j: integer; // begin msg:='159.59 50.79 0.1 0.00 0.0000;'+chr(13)+chr(10); ShowMessage('Send Cycle Analyst msg'+chr(10)+chr(13)); Delay(1400); begin j:=0; while (j<10000) do begin ComSendStr(msg); Delay(200); j:=j+1; end; end; end.
Dernière modification par paulfjujo ; 12/06/2014 à 10h10.
Ca ne marche toujours pas, en fait c'est la fin de la trame d'affichage qui a un problème à chaque fois.
Les caractères sont corrects jusqu'à la fin de chaque ligne, quoi que j'écrive dans le printf (ou fprintf)...
Pour tester, j'ai échangé la place de compteur et de secs dans l'affichage comme ceci:
Je constate que là, l'affichage des secondes est nikel, mais encore une fois ça ne marche plus après le deuxième paramètre (en rouge)Code:k=fprintf(_H_USART,"CYCLE_ANALYST: %s ; COMPTE_TOUR: %05u ; SECS: %05u\r\n",buffer,secs,compteur);
De base, j'avais cet affichage:Code:CYCLE_ANALYST: -159.46 50.62 0.1 0.00 0.0000 ; COMPTE_TOUR: 00012 ;‰û®¨*'‚j CYCLE_ANALYST: -159.46 50.61 0.1 0.00 0.0000 ; COMPTE_TOUR: 00013 ;KïÔMé 0
Avec ce résultat:Code:k=fprintf(_H_USART,"CYCLE_ANALYST: %s ; COMPTE_TOUR: %05u ; SECS: %05u\r\n",buffer,compteur,secs);
Code:JCYCLE_ANALYST: -159.45 50.63 0.9 0.00 0.0000 ; COMPTE_TOUR: 00870 ;I[W¨*'’Êj CYCLE_ANALYST: -159.45 50.68 0.1 0.00 0.0000 ; COMPTE_TOUR: 00450 ;KïÔMé 30
Ce comportement erratique est tout à fait anormal
et l'ordre n'a aucune importance (en theorie)
En pratique, je ne sais pas trop comment le compliateur gere le printf
et la memoire RAM intermediare indispensable
et je supose qu'il doit y avoir un probleme de chevauchement de BANK RAM
j'ai deja rencontré ce genre d'incident, resolu en deplacant l'ordre de decalaration de variable
ou en modifiant le linker pour accoler des BANK RAM
mes tests sont realisés avec un 18F26K22 qui a >3,8Ko de ram et 65K de ROM
de plus j'ai declaré le buffer dans une zone bien specifique et reservée de 512 bytes
avec un fichier linker modifié pour.Code:#define MAXLEN 40 #define MAXLEN1 128 #pragma udata GrossBank static unsigned char bufferMAXLEN1]; #pragma udata
Dans ce genre de probleme il faut analyser le fichier de sortie asm
pour verifier s'il peut y avoir des probleme de changement de page ou bank RAM.
poste le resultat de compilation pour voir les warnings residuels ....
Je t'avouerai que je n'ai pas tout compris...
Tu veux que je poste le résultat de compilation de MPLAB?
Ces warnings proviennent des printf que j'ai dans le programme:Code:Clean: Deleting intermediary and output files. Clean: Done. Executing: "C:\mcc18\bin\mcc18.exe" -p=18F452 "fonctionne.c" -fo="fonctionne.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- G:\Stage\Compte-tour\MPLAB\fonctionne\fonctionne.c:202:Warning [2066] type qualifier mismatch in assignment G:\Stage\Compte-tour\MPLAB\fonctionne\fonctionne.c:212:Warning [2066] type qualifier mismatch in assignment Executing: "C:\mcc18\bin\mplink.exe" /l"C:\mcc18\lib" /k"C:\MCC18\lkr" "C:\MCC18\lkr\18f452.lkr" "fonctionne.o" /m"fonctionne.map" /w /o"fonctionne.cof" MPLINK 3.90, Linker Copyright (c) 2004 Microchip Technology Inc. Errors : 0 MP2HEX 3.90, COFF to HEX File Converter Copyright (c) 2004 Microchip Technology Inc. Errors : 0
Code:k=fprintf(_H_USART,"CYCLE_ANALYST: %s ; COMPTE_TOUR: %05u ; SECS: %05u",buffer,compteur,secs); printf("\r\n");
ton resultat de compil n'est pas tres bavard
seulement 2 warning !
et ta version MPLAB est obsolete !
j'utilise la derniere version MPLAB V 8.92
et derniere version C18
Code:---------------------------------------------------------------------- Release build of project `C:\_C18\_MesProjets_C18\_18F26K22\18F26K22_LCD4x20_I2C_For_Tests.mcp' started. Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mcc18.exe v3.44, mplib.exe v4.45 Thu Jun 12 11:23:41 2014 MPLINK 4.45, Linker Device Database Version 1.10 Copyright (c) 1998-2011 Microchip Technology Inc. Errors : 0 MP2HEX 4.45, COFF to HEX File Converter Copyright (c) 1998-2011 Microchip Technology Inc. Errors : 0
Je vais essayer de mettre à jour le logiciel ainsi que le compiler alors, je vous tiens au courant dès que je l'ai testé sous ce logiciel.
J'ai installé MPLAB + le compiler C18, mais quand je compile j'ai ceci:
Je ne comprends pas ce que c'est...Code:Error - Device not specified. Use /p option to specify a device. Errors : 1
il faut verifier que tous les chemins soient bien precises:
il va sans dire, que les chemins peuvent etres differents queprojet
Build options for project
output directory ex: C:\_C18\_MesProjets_C18\_18F26 K22
intermediate directory ex: C:\_C18\tmp
include search path ex: C:\Program Files\Microchip\mplabc18\h
librairie Search path ex:C:\Program Files\Microchip\mplabc18\lib
linker search path ex: C:\Program Files\Microchip\mplabc18\bin\L KR
ceux que j'utilise..
et aussi
et dans le programmeset langage tools suite
Active tools suite ex: Microchip C18 toolsuite
Location ex: C:\Program Files\Microchip\mplabc18\bin\m cc18.exe
#include <p18f452.h>
Dernière modification par paulfjujo ; 12/06/2014 à 14h33.
J'ai gardé ma version actuelle de MPLAB, j'ai juste mis à jour le C18.
J'ai modifié les affichages:
Dans le void juste avant la boucle FOREVER:
Dans la boucle FOREVER:Code:putrsUSART("\r\n"); putrsUSART(" CYCLE_ANALYST COMPTEUR SEC\r\n");
Et j'ai comme affichage:Code:putrsUSART("\r\n"); k=fprintf(_H_USART,"%s | %05u | %05u",buffer,compteur,secs);
Ca m'a l'air nikel comme ceci!!Code:CYCLE_ANALYST COMPTEUR SEC -159.40 50.55 0.2 0.00 0.0000 ; 00000 ; 00003 -159.40 50.55 0.2 0.00 0.0000 ; 00000 ; 00004 -159.40 50.56 0.3 0.00 0.0000 ; 00000 ; 00005 -159.40 50.56 0.3 0.00 0.0000 ; 00000 ; 00006 -159.40 50.56 0.3 0.00 0.0000 ; 00000 ; 00007 -159.40 50.56 0.3 0.00 0.0000 ; 00000 ; 00008 -159.40 50.53 0.8 0.00 0.0000 ; 00000 ; 00009 -159.40 50.47 2.2 0.00 0.0000 ; 00120 ; 00010 -159.40 50.39 5.1 0.00 0.0000 ; 01080 ; 00011 -159.40 50.40 5.4 0.00 0.0000 ; 01245 ; 00012 -159.40 50.33 7.2 0.00 0.0000 ; 02055 ; 00013 -159.40 50.29 8.0 0.00 0.0000 ; 02535 ; 00014 -159.39 50.33 6.2 0.00 0.0000 ; 03135 ; 00015 -159.39 50.41 3.7 0.00 0.0000 ; 03465 ; 00016 -159.39 50.46 2.7 0.00 0.0000 ; 02850 ; 00017 -159.39 50.47 1.4 0.00 0.0000 ; 02100 ; 00018 -159.39 50.51 0.4 0.00 0.0000 ; 01395 ; 00019 -159.39 50.49 0.2 0.00 0.0000 ; 00600 ; 00020 -159.39 50.51 0.1 0.00 0.0000 ; 00525 ; 00021 -159.39 50.49 0.3 0.00 0.0000 ; 00600 ; 00022 -159.39 50.49 0.3 0.00 0.0000 ; 00000 ; 00023 -159.39 50.49 0.2 0.00 0.0000 ; 00000 ; 00024
Nickel-chrome!
les warning 2006 ont disparu ?
je ne savais pas que | generait un point virgule !Code:k=fprintf(_H_USART,"%s | %05u | %05u",buffer,compteur,secs);
juste pour verifier la contre-mesure :
Est-ce çà fonctionne pareil lorsque tout est dans le meme
avec melange de constantes TEXTE et de variables ..Code:k=fprintf(_H_USART,"...
Les warnings sont toujours présents oui...
Oups, j'ai modifié les ; en | entre temps j'avais pas fait attention!
Au final j'ai même supprimé les démarcations, puisqu'au final je transfère ce fichier dans un fichier excel, du coup les démarcations se font automatiquement!
En plus je me rends compte que de mettre le texte au tout début rend la lecture plus pratique, comme un tableau!
Et pour le fprintf, ça fonctionne comme tout à l'heure, vraiment bizarre...
Y a-t-il moyen de remplacer les points par les virgules dans le programme pour les données du Cycle Analyst ou il faut forcément le faire via Excel?
Et dernier problème:
J'aimerais utiliser un mini PC qui pourrait supporter le MCP2200 et avoir un hyperterminal pour pouvoir l'emmener facilement sur la moto pour faire les mesures.
Est-ce que ceci pourrait convenir (je ne m'y connais pas vraiment...):
Ou encore celui ci
Le MCP2200 peut-il fonctionner sur android? Et existe-t-il un hyperterminal convenable?
Sinon, y a t il une autre solution pour pouvoir continuer avec windows 7?
les soluces Mini PC Android .. c'est tres petit ,pas emcombrant, pas cher,
mais il faut racorder dessus un clavier et un ecran !
As tu regardé coté tablette Android ..
tu envoie les donnees en BlueTooth via un module BT HC06 connecté sur le TX
de l'UART PIC au lieu du MCP200.
et tu trouve un appli simili excel
tu peux aussi developper ton programme en RFO BASIC ! ou avec Appinventor.
ou un EEPC (avec clavier ecran) , mais plus encombrant et autonomie ...?..
Je n'ai pas assez de temps pour ça, mon stage se termine la semaine prochaine... Je dois finir ceci avec ce que j'ai fait, c'est à dire programme sur MPLAB, MCP2200 etc..
Les mini PC android peuvent se brancher en HDMI. Il suffirait de configurer les connexions via l'hyperterminal lorsque le PC est branché à un écran, de lancer l'enregistrement, de le débrancher pour le mettre sur la moto et ça enregistrera automatiquement lorsque le contact est effectué non?
Mais je sais pas si le MCP2200 est compatible avec android
Sinon y a-t-il d'autres solutions?
en supposant donc que son alim n'est JAMAIS coupée dans la manoeuvrede le débrancher pour le mettre sur la moto
init sur ecran TV via HDMI + clavier , transfert sur la moto, retour sur ecran TV HDMI + clavier..
que le debranchement /rebranchement du clavier ne le perturbe pas (le programme terminal)
à moins d'emmener le clavier connecté au mini PC, sur la moto ?
Je ne sais pas, on peut trouver un autre mini PC pour cela, mais je ne sais pas si mon montage fonctionnerait correctement avec android.
Aucune idée si le MCP2200 est compatible, s'il y a un hyperterminal qui me permettrai d'enregistrer les informations sur un bloc note.
Si déjà ça c'est possible, alors je verrai le PC qui correspondrait le mieux.
Sinon, sous windows et pas cher, je trouve pas pour le moment..
sinon,il te reste le stockage via ton PIC, sur des EEPROM 24LC256 ou 512
et depouiller sur PC apres coup..
ou via une carte SD 1go , mais ce PIC sera un peu trop juste en RAM et ROM..
Sur une cartr SD? Je vais devoir regarder alors parce que je n'ai aucune idée de savoir comment faire
déja testé ICI
Dernière modification par paulfjujo ; 13/06/2014 à 18h24.
Bonjour!
Je reviens après quelques jours d'absence, et une question:
Est-il possible d'utiliser un data logger pour enregistrer ces informations sur la moto?
Avec ce test, il suffit de connecter les broches comme indiquées sur le schéma?déja testé ICI
Et niveau programmation, cela entraînerait de grosse modifications dans mon programme?
Je suis désolé de ces questions, je n'ai jamais traité la mémoire du PIC 18f452 et l'enregistrement via le PORTC, c'est la première fois que je le vois :/
Et comment faire la conversion ensuite pour récupérer correctement les données? Parce que j'imagine que les données ne vont pas s'enregistrer comme si j'utilisais le MCP2200
Avant de faire cela, je dois récupérer une dernière valeur (on vient de me le dire à l'instant).
Il s'agit d'une valeur de résistance d'un capteur de température.
Pour la récupérer et l'inclure dans mon UART, je dois utiliser le PORTA pour cela non?
bonjour,
Avec ce test, il suffit de connecter les broches comme indiquées sur le schéma?
Le schema proposé est ici pour çà, mais tu peux tres bien envisager d'autres combinaison d'entree sortie affectée
du moment que le programme s'y retrouve.
Le rajout de cette fonctionalité ne modifiera pas ton application déja presente,Et niveau programmation, cela entraînerait de grosse modifications dans mon programme?
mais necessite des ressources en RAM et ROM relativement importantes
et je ne sais pas si ce PIC peut le supporter..
Consulte le source C18 fournit dans mon exemple , ... et propose nous quelque chose en retour..
Et si, tu peux l'imaginer !.. en stockant la trame ascii envoyée sur l'EEPROMEt comment faire la conversion ensuite pour récupérer correctement les données?
Parce que j'imagine que les données ne vont pas s'enregistrer comme si j'utilisais le MCP2200
au lieu (ou en meme temps) que l'UART.
stockage en texte ..terminateur <CR> <LF>
ou eventuellement en separant les champs de chaque donnee , par un ";" , tu as alors un fichier au format CSV ,
exploitable directement via excel.
(nota: ; est preferable pour nous les francais .. vu que le separateur decimal est deja une virgule..)
il faudrait etre plus precis.. une CTN, une CTP, une PT100 ou 1000 ou ?Il s'agit d'une valeur de résistance d'un capteur de température.
Pour la récupérer et l'inclure dans mon UART, je dois utiliser le PORTA pour cela non?
Quelle gamme de mesure ?
Dans tous les cas ,il faudra faire une adaptation hardware.,pour mettre à niveau
la mesure analogique resultante. de ton delta R. pour un delta Temperature donné.
Écoute, on va faciliter les choses, j'ai commandé le PIC dont vous vous êtes servis pour l'exemple de la carte SD!
Par contre j'ai pas exactement compris l'organisation du programme, donc je vais essayer de voir comment envoyer ces données facilement sur la carte SD avec ce nouveau PIC, qui apparemment semble similaire au 18f452 au niveau des broches et de la programmation. Donc pas de soucis pour adapter mon programme à celui ci.
PS: désolé pour le manque de précision pour le capteur de température, mais j'ai réussi à récupérer ce que je souhaite! Donc c'est réglé de ce côté. Il me manque plus qu'à stocker tout cela dans la carte SD
il n'y pas d'ordinogramme,mais les nombreux commentaires concernant....pour l'exemple de la carte SD!
Par contre j'ai pas exactement compris l'organisation du programme,..
l'historique du developpement et les deboires rencontres, devraient t' etre profitables.
De plus le resultat sur le terminal en montre les differentes etapes :
nota 1: l'usage de l'UART comme debugger ,me semble indispensableCode:Test Petite FAT rev 13/12/2013 Mplab C18 PIC18F26k22 Q=10Mhz x 4 (PLL) Init SD-card Sandisk 2GB. SD-card initialisee. Essai de monter le system de fichier Montage systeme de fichier OK Liste des fichiers : /SAUVE001.TXT /TRAME___.TXT /SAUVE002.TXT /TESTFILE.TXT /SAUVE003.TXT Ouverture fichier TESTFILE.TXT OK Lecture OK de 31 bytes.. reste= 32 OK Hello,Ceci est un texte de tst d Essai Ouverture fichier SAUVE003.TXT Ouverture fichier SAUVE003.TXT OK FResult = 0 Deplace pointer au debut buffer initialisé FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 512 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 1024 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 1536 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 2048 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 2560 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 3072 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 3584 FResult = 0 Ecriture effective de 512 bytes sur SAUVE003.TXT Nouveau pointer de fichier = 4096 Finalise ecriture = 4096 FResult = 0 inscription de 0 zeros Demontage du system de fichier...OK .
pour tracer l'evolution du programme..
quitte à tout mettre hors service ,ce tracage ,une fois le programme certifié OK.
nota 2: je n'ai pas de pin me donnant l'info presence card SD .. sur ma breakboard MiniInTheBox
je saute donc par dessus ce test..!
n'importe comment , si la carte n'est pas là.. çà bloque d'office apres coup.
Dernière modification par paulfjujo ; 25/06/2014 à 12h08.
Avant m'occuper de la carte SD, je viens d'avoir d'autres problèmes...
Je n'arrive pas à écrire sur l'UART avec mon code sur ce pic (ça me met des points d'interrogations au démarrage du programme et c'est tout), et l'affichage sur le LCD est mauvais.
Il y a des différences de programmation entre le 18f452 et le 18f46k22?
Code:#include <p18cxxx.h> #include <p18f46k22.h> // d?claration SFR pour ICD2 #include <delays.h> // d?claration prototype fonctions delay #include <usart.h> // pour fonctions UART #include <string.h> // pour strmcp #include <stdio.h> // pour printf #include <stdlib.h> // pour atoi #include <math.h> #define FOREVER while(1) #define MAXLEN 40 #define NBsecondes 4 // (n*5)-1 , n étant le nb de secondes souhaité. #define Aimant 4 // nb d'aimant pour un tour // D?finir des nouveaux types donn?es typedef unsigned char BYTE; typedef unsigned int WORD; // **** configuration du circuit ************* // configuration avec quartz #ifdef OSCILLATEUR_INTERNE #pragma config FOSC = INTIO67, FCMEN = OFF, PLLCFG=OFF // CONFIG1H #else #pragma config FOSC = HSMP, PLLCFG=ON, PRICLKEN=ON ,FCMEN=OFF #endif #pragma config IESO=OFF,PWRTEN=OFF,BOREN=OFF,WDTEN=OFF,CCP2MX=PORTC1 #pragma config PBADEN=OFF,T3CMX=PORTC0,P2BMX=PORTC0 #pragma config MCLRE=EXTMCLR,STVREN=OFF,LVP=ON,XINST=OFF,DEBUG=OFF #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L #pragma config CPB = OFF, CPD = OFF // CONFIG5H #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L #pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L #pragma config EBTRB = OFF // d?finitions LCD #define LCD_D4 LATBbits.LATB4 // data afficheur bit ? bits #define LCD_D5 LATBbits.LATB1 // data afficheur bit ? bits #define LCD_D6 LATBbits.LATB2 // data afficheur bit ? bits #define LCD_D7 LATBbits.LATB3 // data afficheur bit ? bits #define LCD_D4_DIR TRISBbits.TRISB4 // data direction afficheur bit ? bits #define LCD_D5_DIR TRISBbits.TRISB1 // data direction afficheur bit ? bits #define LCD_D6_DIR TRISBbits.TRISB2 // data direction afficheur bit ? bits #define LCD_D7_DIR TRISBbits.TRISB3 // data direction afficheur bit ? bits #define LCD_E LATAbits.LATA2 // cde afficheur E //#define LCD_RW PORTAbits.RA2 // cde afficheur RW #define LCD_RS LATAbits.LATA5 // cde afficheur RS #define LCD_E_DIR TRISAbits.TRISA2 // cde direction afficheur E //#define LCD_RW_DIR TRISAbits.TRISA2 // cde direction afficheur RW #define LCD_RS_DIR TRISAbits.TRISA5 // cde direction afficheur RS //***** prototypes de fonctions ******************** char k; unsigned int temp,i,j; unsigned char rotation_brute; unsigned short int sequence; int n1; float a; void Init_CAN (void); unsigned char convertir (void); void Init_LCD (void); void Init_Interrupt (void); void Init_UART (void); void Affiche_Compteur (void); // <-- integree dans la main boucle FOREVER //void Affiche_USART (void); void w_cde_nibble( unsigned char ); // ?crit le quartet fort du char x en mode cde void w_cde_octet( unsigned char ) ;// ?crit le quartet fort du char x en mode cde puis le quartet faible void w_data_octet( unsigned char ) ;// ?crit le quartet fort du char x en mode data puis le quartet faible //volatile unsigned double temperature, bits; volatile unsigned char result, temperature; volatile unsigned double vTemp, rTemp; volatile char str[20] = ""; volatile unsigned int tour; volatile unsigned int compteur,seconde,secs; volatile char buffer[MAXLEN]; volatile int Index1; volatile int received; // flag reception trame //sous prog d'int void Interrupt_B0(void); // on déclare que lors d'une interruption #pragma code highVector=0x08 void atInterrupthigh(void) { // on doit éxecuter le code de la fonction MyHighInterrupt _asm GOTO Interrupt_B0 _endasm } #pragma code // retour à la zone de code // ************************ // Interruptions // ************************ #pragma interrupt Interrupt_B0 void Interrupt_B0(void) { static char C ; static char i; if ((INTCONbits.INT0IE==1) && (INTCONbits.INT0IF==1)) { // Si une interruption du port B0 est détectée tour++; // incrémenter la variable de tour INTCONbits.INT0IF=0; } //========= IT Timer0 ============== if ((INTCONbits.TMR0IE==1) && (INTCONbits.TMR0IF ==1)) { j=60/Aimant; compteur = tour*j; // Multiplier le nombre de tour/seconde par 60 (pour tour/min) TMR0H=0x67; TMR0L=0x68; tour=0; seconde=1; // drapeau seconde ecoulee secs++; INTCONbits.TMR0IF = 0; } //=== IT Serial UART RX ================= if ((PIE1bits.RCIE==1) && (PIR1bits.RCIF)) // si un car arrive { C =RCREG ; // le lire => RAZ RCIF if(RCSTAbits.FERR || RCSTAbits.OERR) { RCSTAbits.CREN = 0 ; RCSTAbits.CREN= 1 ; } if ((C==10) || (i>=MAXLEN-1)) { buffer[i]=0; // fin de chaîne si LF recu if (buffer[i-1]==13) { received=1; // si caractere precedent=13=CR buffer[i-1]=0; // optionnel si on veut eliminer le CR resideul dans le buffer Index1=i; i=0; PIE1bits.RCIE=0; // on stoppe les IT reception jusqu'à ce qu'on lise le buffer } else // on annule tout { received=0; // caractere precedent different de 13=CR Index1=0; i=0; buffer[0]=0; } } else { if (C==0x2E) // Si caractère reçu = '.' { // On va le modifier par ',' C=0x2C; // Pour faciliter Excel } buffer[i]=C ; // stockage i++; Index1++; received=0; } } } //fin interruption //************* Programme principal *******************/ void main(void) { //***** init variables **************************** TRISA=0; // PORTA configuré en sortie TRISB=0b00000001; // PORTB configuré en sortie sauf port0 TRISC=0b10000000; vTemp=0.0; rTemp=0.0; result=0; temperature=0.0; compteur=0; temp=0; seconde=0; tour=0; secs=0; i=0; j=0; received=0; buffer[0]=0; Index1=0; n1=0; a=2.45; Init_CAN(); //***** init Ports **************************** Init_LCD(); //***** init Ports **************************** Init_UART(); //***** init Interrupt **************************** Init_Interrupt(); //***** boucle forever **************************** k=fprintf(_H_USART,"\r\n\r\n"); k=fprintf(_H_USART," CYCLE_ANALYST \r\n"); k=fprintf(_H_USART,"Ah V A Vitmax Vit Compte_tour SEC"); FOREVER { result=convertir(); vTemp = (((unsigned int)result*5.0)/255.0); rTemp = (820.0*vTemp)/(5.0-vTemp); temperature=(unsigned char)((rTemp-444.0)/5.56); if (received==1) { n1++; if (n1>NBsecondes) { k=fprintf(_H_USART,"\r\n"); k=fprintf(_H_USART,"%s %05u %05u %d",buffer,compteur,secs, temperature); n1=0; } seconde=0; // raz drapeau secondes ecoulees received=0; // raz drapeau rx uart Index1=0; RCREG=0; PIE1bits.RCIE=1; // re-enable interrupt USART } else { Affiche_Compteur (); } } } //***** ecriture des fonctions **************************** void Init_CAN(void) { ADCON1 = 0b00000100; /* Justifié à gauche Fosc/8 RA0=AN0 analogique */ ADCON0 = 0b01000001; /* Fosc/8 AN0 CAN=activé */ TRISAbits.RA0 = 1; /* RA0 = AN0 en entrée */ } unsigned char convertir(void) { Delay10TCYx( 5 ); /* attente 5x10x1=50us */ ADCON0bits.GO = 1; /* lancement conversion */ while(ADCON0bits.GO); /* attente fin de conversion */ return (ADRESH); /* retour du resultat */ } void Init_LCD (void) { // LCD ADCON1=0x0E; // RA1,2,3 en logique (port A analogique par d?faut) LATA=0xF1; // RA1,2,3 ? 0 force par le LATCH (pour pas de glitch sur E !) PORTA=0xF1; // RA1,2,3 ? 0 force par le port (pour pas de glitch sur E !) par securit? ! bof ! LCD_E_DIR=0; // ports en sortie // LCD_RW_DIR=0; // ports en sortie LCD_RS_DIR=0; // ports en sortie LCD_D4_DIR=0; // ports en sortie LCD_D5_DIR=0; // ports en sortie LCD_D6_DIR=0; // ports en sortie LCD_D7_DIR=0; // ports en sortie //***** init LCD **************************** w_cde_nibble( 0x30 ); // 3 control Delay10KTCYx(150); // delay = 15mS w_cde_nibble( 0x30 ); // 3 control Delay10KTCYx(50); // delay = 5mS w_cde_nibble( 0x30 ); // 3 control Delay10TCYx(50); // delay = 100?S w_cde_nibble( 0x20 ); // 2 mode 4 bits w_cde_octet( 0x28 ) ;// fonction set attention si 2F il ecrit en bas a droite ? l'envers avec 4 caracteres de masques (affiche a partir du 5eme car ecrit !) w_cde_octet( 0x0F ) ;// display on w_cde_octet( 0x06 ) ;// mode d'entree w_cde_octet( 0x01 ) ;// clear display (facultatif) w_cde_octet( 0x80 ) ;// DDRAM 0000 (facultatif) w_cde_octet( 0x02 ) ;// home (facultatif) Delay1KTCYx(250); // delay = 5mS INDISPENSABLE pour CDE HOME ! w_cde_octet( 0x83 ) ;// 4eme case de la 1ère ligne w_data_octet( 0x54 ) ;// T w_data_octet( 0x41 ) ;// A w_data_octet( 0x43 ) ;// C w_data_octet( 0x48 ) ;// H w_data_octet( 0x59 ) ;// Y w_data_octet( 0x4D ) ;// M w_data_octet( 0x45 ) ;// E w_data_octet( 0x54 ) ;// T w_data_octet( 0x52 ) ;// R w_data_octet( 0x45 ) ;// E w_cde_octet( 0xC0 ) ;// passage seconde ligne w_cde_octet( 0xC8 ) ;// passage milieu seconde ligne w_data_octet( 0x54 ) ;// T w_data_octet( 0x52 ) ;// R w_data_octet( 0x2F ) ;// / w_data_octet( 0x4D ) ;// M w_data_octet( 0x4E ) ;// N } void Init_Interrupt (void) { T0CON =0b00000110; // Config T0CON pour avoir prescaler 128 et le timer sur 16bits. TMR0H=0x67; TMR0L=0x68; T0CONbits.TMR0ON = 1; // Timer 0 marche (debut du comptage) RCONbits.IPEN=0; INTCON2bits.INTEDG0=1; // front montant RB0 INTCON2bits.TMR0IP=1; // high level INTCON2bits.RBIP=0; INTCONbits.PEIE = 1; INTCONbits.INT0IF=0; INTCONbits.INT0IE=1; // autorise RB0 interrupt INTCONbits.TMR0IE = 1; // Autorise TMR0 interrupt INTCONbits.PEIE = 1; // autorisation des IT des périphériques INTCONbits.GIE = 1; // active global interrupt PIE1bits.RCIE=1; } void Init_UART (void) { Open1USART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 129 ); } void Affiche_Compteur (void) // fonction d'affichage de nombre sur plusieurs digits { unsigned int temp; unsigned char rotation_brute; rotation_brute = (compteur/1000)+48; temp = compteur % 1000; w_cde_octet( 0xC0 ) ; // passage seconde ligne w_cde_octet( 0xC3 ) ; // passage à la 4eme case de la seconde ligne w_data_octet( rotation_brute ) ; // Afficher les milliers rotation_brute = (temp/100)+48; temp = temp % 100; w_data_octet( rotation_brute ) ;// // Afficher les centaines rotation_brute = (temp/10)+48; w_data_octet( rotation_brute ) ;// // Afficher les dizaines rotation_brute = (temp % 10)+48; w_data_octet( rotation_brute ) ;// // Afficher les unités } void w_cde_nibble( unsigned char x) // écrit le quartet fort du char x en mode cde { LCD_RS=0; // mode cde LCD_E=1; // monte enable if (x&0x80) LCD_D7=1; else LCD_D7=0; // écriture des bits if (x&0x40) LCD_D6=1; else LCD_D6=0; // écriture des bits if (x&0x20) LCD_D5=1; else LCD_D5=0; // écriture des bits if (x&0x10) LCD_D4=1; else LCD_D4=0; // écriture des bits LCD_E=0; // descends enable Delay10TCYx(50); // delay = 100µS } void w_cde_octet( unsigned char x) // écrit le quartet fort du char x en mode cde puis le quartet faible { LCD_RS=0; // mode cde LCD_E=1; // monte enable if (x&0x80) LCD_D7=1; else LCD_D7=0; // écriture des bits if (x&0x40) LCD_D6=1; else LCD_D6=0; // écriture des bits if (x&0x20) LCD_D5=1; else LCD_D5=0; // écriture des bits if (x&0x10) LCD_D4=1; else LCD_D4=0; // écriture des bits LCD_E=0; // descends enable Delay10TCYx(5); // delay = 10µS LCD_E=1; // monte enable if (x&0x08) LCD_D7=1; else LCD_D7=0; // écriture des bits if (x&0x04) LCD_D6=1; else LCD_D6=0; // écriture des bits if (x&0x02) LCD_D5=1; else LCD_D5=0; // écriture des bits if (x&0x01) LCD_D4=1; else LCD_D4=0; // écriture des bits LCD_E=0; // descends enable Delay10TCYx(50); // delay = 100µS } void w_data_octet( unsigned char x ) // écrit le quartet fort du char x en mode data puis le quartet faible { LCD_RS=1; // mode data LCD_E=1; // monte enable if (x&0x80) LCD_D7=1; else LCD_D7=0; // écriture des bits if (x&0x40) LCD_D6=1; else LCD_D6=0; // écriture des bits if (x&0x20) LCD_D5=1; else LCD_D5=0; // écriture des bits if (x&0x10) LCD_D4=1; else LCD_D4=0; // écriture des bits LCD_E=0; // descends enable Delay10TCYx(5); // delay = 10µS LCD_E=1; // monte enable if (x&0x08) LCD_D7=1; else LCD_D7=0; // écriture des bits if (x&0x04) LCD_D6=1; else LCD_D6=0; // écriture des bits if (x&0x02) LCD_D5=1; else LCD_D5=0; // écriture des bits if (x&0x01) LCD_D4=1; else LCD_D4=0; // écriture des bits LCD_E=0; // descends enable Delay10TCYx(50); // delay = 100µS }
J'ai reglé le problème du LCD, manque plus que l'UART à configurer.
J'ai modifié l'interruption avec les nouveaux registres de ce PIC (UART1 et plus UART) comme ceci:
Mais PIR1bits.RC1IF ne passe jamais à 1, donc je ne rentre jamais dans l'interruption.Code:if ((PIE1bits.RC1IE==1) && (PIR1bits.RC1IF==1)) // si un car arrive { C =RCREG1 ; // le lire => RAZ RCIF if(RCSTA1bits.FERR || RCSTA1bits.OERR) { RCSTA1bits.CREN = 0 ; RCSTA1bits.CREN= 1 ; } if ((C==10) || (i>=MAXLEN-1)) { buffer[i]=0; // fin de chaîne si LF recu if (buffer[i-1]==13) { received=1; // si caractere precedent=13=CR buffer[i-1]=0; // optionnel si on veut eliminer le CR resideul dans le buffer Index1=i; i=0; PIE1bits.RC1IE=0; // on stoppe les IT reception jusqu'à ce qu'on lise le buffer } else // on annule tout { received=0; // caractere precedent different de 13=CR Index1=0; i=0; buffer[0]=0; } } else { if (C==0x2E) // Si caractère reçu = '.' { // On va le modifier par ',' C=0x2C; // Pour faciliter Excel } buffer[i]=C ; // stockage i++; Index1++; received=0; } } }
De toutes façon, je remarque aussi que RCSTA1bits.FERR et RCSTA1bits.OERR restent sans arrêt à 0...