Développe un peu tes idées
-----
Développe un peu tes idées
En fait, pour envoyé mes trames avec le respect des temps, on ma conseillé de prendre un timer (dans mon cas timer4 dispo) avec son interruption pour envoyer les trames et tu me propose d'interrompe les autres interruptions le temps de générer les trames, ce qui serait équivalent non ? seulement pour le moment je n'ai pas encore identifier le code pour ce faire.
donc je sais pas trop ce qui est conseillé, maintenant j'ai bien activé mon timer4 mais j'ai du mal à implémenter son interruption, car quand je l'active, ma pile TCP/IP ne fonctionne plus alors que celle-ci n'utilise pas le timer4, je comprend rien là.
J'utilise mplab x IDE sous harmony, il me génère une partie du code en cochant des options , comme quand je sélectionne les interruption pour les timers, j'ai donc garder le code correspondant au timer4 et son interruption.
initialise mon timer4 dans system_init :
puis il me génère cette fonction dans system_interrupt.cCode:T4CON = 0x0; // Stop the timer and clear the control register, TMR4 = 0x0; // Clear the timer register PR4 = 0x0FFF; // Load the period register T4CONbits.TCKPS=0; IPC4SET = 0x00000001; // Set priority level = 3 IPC4SET = 0x00000000; // Set subpriority level = 1 IFS0bits.T4IF = 0; IEC0bits.T4IE = 1; T4CONSET = 0x8000; // Start the timer
et dans system_interrupt_a.sCode:void IntHandlerDrvTmrInstance3(void) { DRV_TMR_Tasks_ISR(sysObj.drvTmr3); micro++; }
Code:/* TMR Instance 3 Interrupt */ .extern IntHandlerDrvTmrInstance3 .section .vector_16,code, keep .equ __vector_dispatch_16, IntVectorDrvTmrInstance3 .global __vector_dispatch_16 .set nomicromips .set noreorder .set nomips16 .set noat .ent IntVectorDrvTmrInstance3 IntVectorDrvTmrInstance3: la $26, _IntHandlerDrvTmrInstance3 jr $26 nop .end IntVectorDrvTmrInstance3 .section .DrvTmrInstance3_vector_text, code, keep .set nomicromips .set noreorder .set nomips16 .set noat .ent _IntHandlerDrvTmrInstance3 _IntHandlerDrvTmrInstance3: portSAVE_CONTEXT la s6, IntHandlerDrvTmrInstance3 jalr s6 nop portRESTORE_CONTEXT .end _IntHandlerDrvTmrInstance3
seulement , ma compile ne passe pas , car ces erreur
build/pic32mx_eth_sk+ioexp+11n+freer tos/production/_ext/1922377806/system_interrupt.o: In function `IntHandlerDrvTmrInstance3':
c:/users/tecwave/disque 1t/etude/hardware/programme pic32/wifi/n v1.2/apps/tcpip/web_server_nvm_mpfs/firmware/src/system_config/pic32mx_eth_sk+ioexp+11n+freer tos/system_interrupt.c:83: undefined reference to `DRV_TMR_Tasks_ISR'
collect2.exe: error: ld returned 255 exit status
make[2]: *** [dist/pic32mx_eth_sk+ioexp+11n+freer tos/production/pic32_eth_wifi_web_server.X.pr oduction.hex] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 2s)
quand je passe
#define DRV_TMR_INTERRUPT_MODE de false à true
ma compilation passe, mais ma pile tcp/ip ne fonctionne plus
Code:void IntHandlerDrvTmrInstance3(void) { DRV_TMR_Tasks_ISR(sysObj.drvTmr3); IFS0bits.T4IF = 0; micro++; }
En fait, c'est pas tant ma pile tcp/ip qui ne fonctionne plus mais tout le fonctionnement du CPU je dirai , seul l'interruption du timer4 tourne
Ben à mon avis non ! Une interruption peut interrompre du code joué dans le cadre d'une routine d'interruption. Voila pourquoi il te faut bloquer toutes les interruptions lorsque tu envoies les trames. Ensuite sur le besoin ou non d'utiliser un timer pour générer les trames ça dépend de la précision temporelle requise par rapport à ta fréquence de micro. Mais si tu as réussi à reconnaître des morceaux de trames avec tes boucles while c'est que l'utilisation du timer n'est peut-être pas obligatoire.En fait, pour envoyer mes trames avec le respect des temps, on m'a conseillé de prendre un timer (dans mon cas timer4 dispo) avec son interruption pour envoyer les trames et tu me proposes d'interrompre les autres interruptions le temps de générer les trames, ce qui serait équivalent non ?
Pour le reste, je n'ai pas les compétences pour t'aider...
Bon bah, voila
ce que je sors du micro, avec les bonnes tempos, faut que je vérifie maintenant en réception.
mon code :
Code:uint8_t i; uint16_t trente_mn[67]={9120,4500,540,600,540,1720,540,600,540,600, 540,600,540,600,540,600,540,600,540,1720, 540,600,540,1720,540,1720,540,1720,540,1720, 540,1720,540,1740,540,1720,540,600,540,1700, 560,600,540,600,540,600,520,620,520,620, 520,600,540,1720,540,600,540,1720,540,1720, 540,1740,520,1720,540,1740,540}; uint16_t etat[67]={0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0,1,0,1, 0,1,0,1,0,1,0}; asm volatile("di"); for(i=0;i<67;i++) { duree=trente_mn[i]; duree=((duree*6)); while(duree) { duree--; tempo_micro++; if (tempo_micro==81) {tempo_micro=0;micro=~micro;} IR=etat[i]||micro; } } Diffuseur_val=0; IR=1; // d10 (RC3) asm volatile("ei");
Dernière modification par davidif ; 14/07/2016 à 15h39.
petite question, afin d'y mettre une led infra-rouge emetrice, que pourrais-je prendre entre les led translucide, noir, transparente, 35-L, bleu translucide, quel sont les plus interresante selon vous ?
Celle utilisé sur la télécommande est une transparente.
Merci de votre aide, j'ai pu tester mes temps sur l'appareil à commander et ça fonctionne bien.
J'ai juste mis les temps de la trame et nickel pas besoin d'optimiser les temps par rapport à la boucle, ce que je pensai devoir faire.
good job