dimanche 16 février 2014

Interruption du timer1 en PicBasic Pro PBP3

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





via Forum FS Generation http://ift.tt/1gGLIw9

Aucun commentaire:

Enregistrer un commentaire