Bon ben, j'a itout refais et ca fonctionne . je n'y comprends plus rien ;
-----
Bon ben, j'a itout refais et ca fonctionne . je n'y comprends plus rien ;
Dernière modification par dje8269 ; 15/09/2014 à 20h44.
C'est en faisant des erreurs; que l'on apprend le mieux !!
Oups le code !!
Par contre je n'ai pas compris l'interet de ces lignes !Code:char uart_rd; #define BP PORTB.F0 // Nomme RBO en BP void main() { ANSELB = 0; // Configure le PORT B en digital ANSELC = 0; // Configure le PORT C en digital TRISB = 0xff ; // Met le PORT B en entrée TRISC = 0x00 ; // Met le PORT C en sortie UART1_Init(9600); // Initialize UART module at 9600 bps Delay_ms(100); // Wait for UART module to stabilize UART1_Write_Text("Hello World !!!"); UART1_Write(10); UART1_Write(13); while (1) { // Endless loop if (UART1_Data_Ready()) { // If data is received, uart_rd = UART1_Read(); // read the received data, UART1_Write(uart_rd); // and send data via UART } if ( BP == 1 ){ UART1_Write_Text("BP appuye"); UART1_Write(10); UART1_Write(13); } else { UART1_Write_Text("BP relache"); UART1_Write(10); UART1_Write(13); } } }
if (UART1_Data_Ready()) { // If data is received,
uart_rd = UART1_Read(); // read the received data,
UART1_Write(uart_rd); // and send data via UART
C'est en faisant des erreurs; que l'on apprend le mieux !!
Bon ben la ca fonctionne pas ;
Lecture de la valeur analogique .
conversion en string ( comme dans ton exemple)
puis envoie dans l'UART pour affichage .
Quand je tourne le potar , les symbols changent a l'écran , mais cela ne correspond a rien , plein de symboles tout bizarre . rien de lisible
Je dois pas etre loin .
Code:char uart_rd ; char txt[7]; unsigned int valeur ; void main() { ANSELB = 1 ; // Configure le PORT B en ANA ANSELC = 0; // Configure le PORT C en digital TRISB = 0xff ; // Met le PORT B en entrée TRISC = 0x00 ; // Met le PORT C en sortie UART1_Init(9600); // Initialize UART module at 9600 bps Delay_ms(100); // Wait for UART module to stabilize UART1_Write_Text("Hello World !!!"); UART1_Write(10); UART1_Write(13); while (1) { // Endless loop if (UART1_Data_Ready()) { // If data is received, uart_rd = UART1_Read(); // read the received data, UART1_Write(uart_rd); // and send data via UART } valeur = ADC_Read(12) ; // Lecture de l'ADC mise dans la variable "valeur" IntToStr(valeur, txt); // convertion de l'int en string UART1_Write_Text(valeur); // Envoie dans l'UART pour affichage UART1_Write(10); UART1_Write(13); } }
C'est en faisant des erreurs; que l'on apprend le mieux !!
Faire un essai sans convertir en string.
tu a mis : UART1_Write_Text(valeur); // Envoie dans l'UART pour affichage
c'est pas plutôt la chaîne de caractère "txt" que tu doit envoyer? donc : UART1_Write_Text(txt); // Envoie dans l'UART pour affichage
Tu dois envoyer le résultat de la conversion sous forme d'une chaine et non la valeur numérique.Bon ben la ca fonctionne pas ;
Lecture de la valeur analogique .
conversion en string ( comme dans ton exemple)
puis envoie dans l'UART pour affichage .
Quand je tourne le potar , les symbols changent a l'écran , mais cela ne correspond a rien , plein de symboles tout bizarre . rien de lisible
Je dois pas etre loin .
Dans MikroBasic le compilateur t'aurai craché l'erreur suivante:
"Incompatible types ("simple type" to "complex type") "
Un bug dans MikroC ?
Dernière modification par adipie ; 16/09/2014 à 07h10.
Désolé hier soir, j'avais décroché et tout eteins , je viens de faire le changement , ca fonctionne !!
Voila l'erreur !c'est pas plutôt la chaîne de caractère "txt" que tu doit envoyer?
en affichant "txt" ca fonctionne impeccable .
Je tourne mon potar et je vois la valeur qui s'inscrit sur hyperterminal ; toujours de 1 à 963 .
J'avance mais qu'est ce que c'est long .
Quand je sais ce que je dois faire , et ou je dois arrivé ca me fais peur lol . J'ai acheté l'ecran LCD et le graphique pour al carte easypic, ca me simplifieras la vie, et dans mon projet futur je compte m'en servir alors ......
Donc ,
- Gestion des BP ok
- Des leds ( donc des I/O) ok
- lecture analogique ok
- affichage 7 segments ok
-Les interruptions , moyen ok
-les timers moyens ok
Il va me manquer deux gros pavés .
Le codage manchester ( pour transmettre les infos en RF sur la télécommande)
et le PWM , pour commander 8 servos moteurs .
Voici le code qui fonctionne sous realterm
Code:char uart_rd ; char txt[7]; unsigned int valeur ; unsigned int valeur2 ; void main() { ANSELB = 1 ; // Configure le PORT B en ANA ANSELC = 0; // Configure le PORT C en digital TRISB = 0xff ; // Met le PORT B en entrée TRISC = 0x00 ; // Met le PORT C en sortie UART1_Init(9600); // Initialize UART module at 9600 bps Delay_ms(100); // Wait for UART module to stabilize UART1_Write_Text("Hello World !!!"); UART1_Write(10); UART1_Write(13); delay_ms(2000) ; while (1) { // Endless loop if (UART1_Data_Ready()) { // If data is received, uart_rd = UART1_Read(); // read the received data, UART1_Write(uart_rd); // and send data via UART } valeur = ADC_Read(12) ; // Lecture de l'ADC mise dans la variable "valeur" IntToStr(valeur, txt); // convertion de l'int en string UART1_Write_Text(txt); // Envoie dans l'UART pour affichage UART1_Write(10); UART1_Write(13); } }
C'est en faisant des erreurs; que l'on apprend le mieux !!
Prochain exercice, Convertir Valeur lue en volt et l'afficher.
Utilise Usart Terminal de MikroC à la place de Realterm
Tu ne lis pas les 10 bits pour le moment, c'est pour cette raison que tu affiches 963 au lieu de 1023
Dernière modification par adipie ; 16/09/2014 à 07h57.
Ca marche , mais juste avant je préférerais réussir a affiché en 10bits ma valeur .Prochain exercice, Convertir Valeur lue en volt et l'afficher.
Des que j'ai réussis a lire en 10bits ; Je convertirais ma valeur lue en volt avec , promis .Utilise Usart Terminal de MikroC à la place de Realterm
Je comprends pas un truc . quand j'écris :
Je lis l'entrée ANAlogique et je place la valeur lue dans la variable déclarée "valeur" qui est une int ( donc en 16bit , un word quoi ! ) . DOnc valeur devrait avoir la bonne valeur ? CàD 1023 non ?valeur = ADC_Read(12) ; // Lecture de l'ADC mise dans la variable "valeur"
IntToStr(valeur, txt); // convertion de l'int en string
Ensuite je fais une conversion de int vers string . d'ailleurs je sais pas pourquoi je suis obligé de convertir ?
Mais je vois pas ou y'a une limitation a 8bit quelques part ? Si j'étais sur 8 bits , je pourrait voir seulement 255 au max non ?
Avant d'aller plus loin il faudrait que j'éclaircisse cette zone d'ombre .
Merci encore pour la patience
C'est en faisant des erreurs; que l'on apprend le mieux !!
Quelle est la valeur en volt sur la patte analogique quand tu affiches 963 ?
La valeur est de 4.73V ce qui correspond a l'echelle :
5/1023= 0.00488
0.00488*963 = 4.706 V
On est bon!
C'est en faisant des erreurs; que l'on apprend le mieux !!
Impeccable !
1023 affiché sur realterm !! C'est tout bon .
C'est en faisant des erreurs; que l'on apprend le mieux !!
Yes !!!
Bon la , je galere a affiche les virgules pour la conversion en volt .
j'arrive a affiché les unités de volt , soit 0,1,2,3 et 4 . mais la précision n'est pas top sans les virgules .
J'ai essayé de définir en float mais ca ne fonctionne pas !!
Un indice ?
C'est en faisant des erreurs; que l'on apprend le mieux !!
Pas evident de gerer les floats .....
Les valeurs correspondent jusqu'a depassement de la valeur max . peut on limiter le nombre apres la virgule ?
j'en suis rendu la :
Code:char uart_rd ; char txt[7]; unsigned int valeur ; unsigned int valeur2 ; float coef ; float volt ; void main() { ANSELB = 1 ; // Configure le PORT B en ANA ANSELC = 0; // Configure le PORT C en digital TRISB = 0xff ; // Met le PORT B en entrée TRISC = 0x00 ; // Met le PORT C en sortie UART1_Init(9600); // Initialize UART module at 9600 bps Delay_ms(100); // Wait for UART module to stabilize coef = 2.00488 ; // coef+2 pour rentrer dnas les valeurs imposées du float UART1_Write_Text("Hello World !!!"); UART1_Write(10); UART1_Write(13); delay_ms(2000) ; while (1) { // Endless loop if (UART1_Data_Ready()) { // If data is received, uart_rd = UART1_Read(); // read the received data, UART1_Write(uart_rd); // and send data via UART } valeur = ADC_Read(12) ; // Lecture de l'ADC mise dans la variable "valeur" valeur2 = valeur*2 ; // Calcul du correction de l'erreur avec le +2 volt = valeur*coef-valeur2 ; floatToStr(volt, txt); // convertion de l'int en string UART1_Write_Text(txt); // Envoie dans l'UART pour affichage UART1_Write(10); UART1_Write(13); } }
C'est en faisant des erreurs; que l'on apprend le mieux !!
Comment faire afficher 0.0008 en sachant qu'une valeur float est égale au minimum à
± 1.17549435082E-38 à ±6.80564774407E38 ???
C'est en faisant des erreurs; que l'on apprend le mieux !!
Impossible d'aider suite allergie au C ...
lol . pas de soucis ; je comprends . j'ai attrapé la maladie de la programmation j'adore ca , mais en C je me heurte a chaque fois à un probléme biscornus !!!
Je n'arrive pas un trouvé un exemple que je pourrais utilisé .
C'est en faisant des erreurs; que l'on apprend le mieux !!
Salut,Pour faire cela il faut utiliser la fonction printf en prenant soin d'inserer :
#include <stdio.h> au début de ton fichier
Pour la syntaxe (compliquée) de printf, lis les tutoriels en C sur internet ;=)
a+
Merci RISC ,je vais fouiller dans cette direction alors ! Tout est compliqué en C . je commence aussi à me lasser de galerer comme ca ! .
C'est en faisant des erreurs; que l'on apprend le mieux !!
Ce n'est pas le C qui est compliqué, mais toi !
Tu as une aide précieuse dans ton logiciel MicroC et dans Internet, il faut la consulter.
Regarde dans la librairie "Sprint Library" de MikroC, tout est expliqué
Teste le code suivant que je n'ai pas réussi à tester avec la version de demo:
Code:void main(){ UART1_Init(4800); // Initialize UART module at 4800 bps Delay_ms(10); UART1_Write_Text("Floating point number representation"); // Write message on UART sprintf(buffer, "%12e", ww); // Format ww and store it to buffer UART1_Write_Text("rne format:"); // Write message on UART UART1_Write_Text(buffer); // Write buffer on UART sprintf(buffer, "%12f", ww); // Format ww and store it to buffer UART1_Write_Text("rnf format:"); // Write message on UART UART1_Write_Text(buffer); // Write buffer on UART sprintf(buffer, "%12g", ww); // Format ww and store it to buffer UART1_Write_Text("rng format:"); // Write message on UART UART1_Write_Text(buffer); // Write buffer on UART }
Un bon langage est un langage avec lequel tu te sens à l'aise, Si le C ne te convient pas essaye Mikrobasic, c'est un langage un peu plus intuitif. Le revers de la médaille c'est que c'est moins utilisé et par conséquent plus difficile de trouver de l'aide extérieure. Ca ne veux pas dire non plus que tu aurais échappé aux obstacles que tu rencontres aujourd'hui.
Bonjour à tous ,
C'est exact gabuzo , j'ai choisi le C après une longue hésitation , je dois bien , l'avoué . Mais ce qui m'as séduit c'est effectivement une communauté assez large .
J'ai tésté ton code adipie , qui est en fait celui de l'exemple du manuel . il manquait juste les déclarations des variables "ww" et "buffer" .
effectivement je vois le chiffre mis en forme de differente facon . Mais apres plusieurs modifs , je n'arrive pas a affiché seulement 2 chiffres apres la virgule .
Je lis les exemples , je regarde internet , mais mon vocabulaire anglais n'est pas trés fournis, surtout en anglais technique . donc deja j'ai du mal a comprendre l'anglais , plus les complications du langage C , font qui j'y arrive pas. Crois moi j'y mets du mien pourtant . Les traducteurs en langage technique sont nul :
Par exemple string , sans pensée cochonne hein ! , bande de pervers , il me le traduit en ficelle, mais en C ??!!!?? .
J'ai regardé les tableaux , les exemples etc ..... mais j'ai rient trouvé pour diminuer le nombre de chiffres apres la virgule ! ou alors j'ai pas compris certes .
C'est en faisant des erreurs; que l'on apprend le mieux !!
Si les fonctions de formatage du C te font souffrir tu peux assurer le formatage toi même suivant l'exemple ci-dessous qu'il suffit de traduire de MikroBasic en MikroC
Code:program MyProject 'Formatage d'un nombre à deux chiffres après la virgule dim v1 as float v2, vd, vm as longword vdstr, vmstr, sf as string[10] main: UART1_Init(9600) 'Init UART v1 = 12345.5897 'Valeur initiale Sf = "" while true vd = longword (floor(v1)) 'Extraction de la parie entière longwordtostr(vd, vdstr) ltrim(vdstr) 'Suppres. espaces avant vm = longint(v1 * 100 ) mod 100 'Extraction après la virgule longwordtostr(vm, vmstr) ltrim(vmstr) 'Suppres. espaces avant strcat(sf,vdstr) 'Création de la chaine à afficher strcat(Sf,".") strcat(sf,vmstr) UART1_Write_Text(sf) sf = "" delay_ms(2000) wend end.
Bon je baisse les bras sur les chiffres à virgule !!!
C'est en faisant des erreurs; que l'on apprend le mieux !!
Dommage de jeter l'éponge si vite.
Tu prends ton chiffre 1234.56789 et tu extrais la partie entière par [Floor(1234.56789) = 1234]
Pour extraire 2 caractères après la virgule, tu multiplies ton chiffre par 100 et avec l'opérateur Modulo 100 tu extrais ces deux chiffres [123456 mod 100 = 56]
Maintenant tu assemble la partie entière + le point décimal + les deux derniers chiffres dans une chaîne que tu peux envoyer par l'Uart ou afficher sur le LCD [1234.56]
Tu peux alors enfermer cette manipulation dans une fonction que tu pourras appeler chaque fois que tu devras formater un nouveau nombre.
J'avais téléchargé la version de démo MikroC pour écrire cette fonction et la tester, mais cette version est limitée à pas grand chose.
Peux tu compiler et tester ce bout de code.
Code://Formatage d'un nombre double v1; char vdstr; char vmstr; char sf; long v2; long vd ; long vm ; void main(){ UART1_Init(9600); //'Init UART v1 = 12345.5897; //'Valeur initiale Sf = ""; while (1) { v2 = (floor(v1*100)); vd = v2 / 100; //'Extraction de la parie entière longwordtostr(vd, vdstr); ltrim(vdstr); //'Suppres. espaces avant vm = v2 % 100; //'Extraction avec 2 après la virgule longwordtostr(vm, vmstr); ltrim(vmstr); //'Suppres. espaces avant strcat(sf,vdstr); //'Création de la chaine à afficher strcat(Sf,"."); strcat(sf,vmstr); UART1_Write_Text(sf); sf = ""; delay_ms(2000); } }