Bonjour
Je veux bien donner le code de tout le programme, mais bon, ça va être long et pas forcément facile d'y retrouver l'erreur.
J'ai modifié ce code pour le simplifier au maximum.
En résumé, j'essaye donc de gérer deux leds, le programme n'a pas vraiment d'interet mais c'est un programme de test qui me permettra de réaliser un programme plus complet qui fait une réception RS232 (HSERIN) et génère des impulsions calibrées en fonction des données reçues en RS232.
Vu que les deux "protocoles" ne sont pas synchronisables, je suis obligé de passer par le biais des interruptions.
Le pic utilisé est un PIC16F1825 tournant en interne à 16MHz.
Pour un premier essai, voici ce que ça devrait faire, j'ai éliminé toute la partie RS232 qui fonctionne parfaitement :
J'ai une led(2) qui clignote dans un programme principal et une led(1) qui devrait clignoter grâce aux interruptions du timer1 (16 bits).
La led2 clignote mais la led1 reste éteinte.
Hier j'avais réussi à ce que la led1 clignote grâce à la routine d'interruption ( ben oui elle n'est pas commandée en dehors de cette routine là, donc c'est bien l'interruption qui la faisait clignoter), mais elle clignottait à une cadence ne dépendant pas de ce que je met dans le registre TMR1H-TMR1L.
Evidemment, j'ai une grosse inconnue en PBP3, je n'arrive pas à imaginer le rôle des lignes "disable" et "enable" que j'ai dû ajouter pour respecter la doc de PBP3, mais de toutes manières, ça ne change strictement rien si je les met en commentaire.
Je sais que les deux leds sont bonnes car je les teste au démarrage, on ne sait jamais.
Je sais que le processeur tourne car la led2 clignote.
J'ai changé la "pause 100" par une boucle qui me donne la même temporisation car je me suis rendu compte hier (quand ça tournait à moitié) que l'instruction "pause 100" perturbait l'interruption, je n'ai rien trouvé là dessus mais pourtant, en modifiant de la sorte, j'arrivais à entrer dans la routine d'interruption.
J'ai essayé de couper le timer pour charger les valeurs dans TMR1H-TMR1L et le relancer ensuite, même problème.
Enfin voici le code, j'espère avoir un petit coup de pouce pour trouver l'erreur qui était sûrement expliquée dans la doc du pic ou de PBP3 et qui m'a échappé.
DEFINE OSC 16 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40
tmr1GE var t1gcon.7
TMR1ON var T1CON.0
TMR1IF VAR PIR1.0 ' Alias RCIF (USART Receive Interrupt Flag)
LED1 VAR PORTC.1 ' Alias LED
LED2 VAR PORTC.2 ' Alias LED
IN_SBUS var PORTC.5 'p 5
S1 VAR PORTA.5 ' p 2
i VAR BYTE ' loop counter
' voir fichier "PIC16F1825.INFO"
'Config pour PIC16F1825
'***************************** ******************** *****************************
'Configuration
'***************************** ******************** *****************************
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _CLKOUTEN_OFF
__config _CONFIG2, _PLLEN_OFF & _LVP_OFF
#ENDCONFIG
on interrupt goto timer_int
disable
osccon=%01111011 'page 70
ansela=0 'page 126
anselc=0
option_reg=0 'page 185 bit7 à zéro pour pouvoir activer les résistances de pull up
apfcon0=0 'page 121
apfcon1=0 'page 122
wpuc=%00100000 'page 137 pull up sur C5
trisa=%11011111
trisc=%11111001
recom_test:
gosub essai_timer
gosub test_led
led1=0
debut:
led2=!led2
for i=1 to 100 'si je met "pause 100", la led régie par le timer clignote mais pas à la cadence du timer
pause 1
next i
goto debut
test_led: ' teste les leds au début juste pour voir si le programme démarre
for i=1 to 10
led1=0
pause 50
led2=0
pause 50
led1=1
pause 50
led2=1
pause 50
next i
return
disable
timer_int:
'TMR1ON=0
led1=!led1
tmr1h=200
tmr1l=200
'TMR1ON=1
T1con=%00000101 'page 195
'tmr1GE=1
tmr1if=0
resume
enable
essai_timer:
''pour timer1 :
T1con=%00000100 'page 195
tmr1h=128
tmr1l=128
intcon=%11000000 'page 90
pie1 =%00000001 'page 91
pie3 =0
tmr1if=0
T1con=%00000101 'page 195 lancer une première fois le timer
'tmr1GE=1
return
End
Il faudrait être certain que l'erreur vient bien du code ou s'il y a une astuce dans PBP3 pour l'utilisation des interruptions.
Le programme n'est pas vraiment optimisé mais j'ai tellement fait d'essais qu'il ne ressemble plus à rien.
Le sous-programme "essai_timer" sert uniquement à initialiser le timer, les interruptions et le démarrer une première fois.
Le sous-programme "timer_int" est la véritable routine d'interruption qui change l'état de la led1 et relance le timer
Merci d'avance
Marc
-----