Positionneur de parabole satellite TV

avec un PIC16C84

Affichage LCD 2 lignes rétro-éclairé

-

1 Principe

Cet automatisme permet de positionner précisément une parabole de réception TV satellite. Cette parabole doit être placée sur une monture équatoriale (axe de rotation dirigé vers l'étoile polaire) motorisée par vérin avec signal de retour sur ILS.

Ce montage compte et décompte les impulsions de l'ILS et asservi la rotation du moteur afin de verouiller la parabole sur des positions précises. Ces positions sont mémorisée dans le microcontroleur PIC16C84.

Le choix du satellite s'effectue avec un commutateur rotatif (1 circuit 12 positions).

2 Le schéma:

3 Le Firmware en langage assembleur PIC

CODE SOURCE en langage assembleur PIC (Microchip)
  1.  
  2. ;SATPOS.ASM
  3. ;POSITIONNEUR PARABOLE SATELLITE TV a PIC16C84 et affichage LCD retro-eclaire
  4.  
  5. ; PRINCIPE
  6. ;le tableau des valeurs de positions des satellites doit etre etabli suivant votre equipement
  7. ;principe : parabole motorisee par verin avec signal de retour sur ILS
  8. ;ce montage pilote le moteur, compte (et decompte ) les impulsions de l'ILS
  9. ;Le choix du satellite s'effectue avec un commutateur rotatif (1 circuit 12 positions).
  10. ;Ensuite le montage asservi la position en fonction de ce choix et des
  11. ; valeurs memo dans le tableau
  12. ;voir ce tableau plus bas dans le code: "tableau des valeurs de positions des satellites"
  13.  
  14. ;REGLAGE PREALABLE
  15. ;conserver la valeur 126 pour T2B 5.0 ºW (Telecom 2B)
  16. ;placer le commutateur sur la position T2B (l'affichage indique T2B)
  17. ;orienter en mode manuel (boutons < et >) la parabole sur T2B (controle sur image TV)
  18. ;RESET-ER le montage (mise a jour de la position courante a 126)
  19. ;en mode manuel, chercher les autres satellites, et noter les valeurs de positions obtenues
  20. ;sur l'affichage LCD
  21. ;vous n'avez plus qu'a mettre a jour le tableau (une fois pour toutes) et a recompiler le soft
  22. ;et a reprogrammer le PIC
  23.  
  24. ;par la suite, le choix d'un satellite par le commutateur rotatif suivi d'un appui sur le
  25. ;bouton GOTO pointera la parabole sur le satellite.
  26. ;lorsque l'alim du montage est coupee, la position est retenue
  27. ;- d'une part, par la monture de la parabole...
  28. ;- et d'autre part par la position du commutateur rotatif.
  29. ;il ne faut donc pas toucher au commutateur lorsque le montage est hors tension !
  30. ;en pour que tout se passe bien, il suffit que le commutateur rotatif soit positionne
  31. ;sur le bon satellite a la mise sous tension.
  32.  
  33. ;dans le cas contraire, si la parabole est totalement desorientee, il suffit de:
  34. ;1- chercher un satellite manuellement (boutons < et >)
  35. ;2- positionner correctement le commutateur rotatif ( affichage du bon sat sur le LCD)
  36. ;3- RESETER
  37.  
  38.  
  39. ;pour Qx=3,2768Mhz
  40. ;RAPPEL REGISTRE D'ETAT = STATUS : p:30
  41. ;----------------------------------------------------------------------
  42. ;
  43. ; w = 7
  44. ; wreg = 7
  45. ;
  46. LIST P=PIC16C84
  47. ;qq
  48. include p16c84.inc
  49.  
  50.  
  51. ;SVP definir ScratchPadRam ici:
  52. ;Si vous utilisez un PIC16C5X definissez "departRam equ 0x10"
  53. ;sinon definissez "departRam equ 0x20"
  54. ;----------------------------------------------------------------------
  55. w equ 0
  56. f equ 1
  57.  
  58. ;attention: le PIC16C84 possede 36 octets de RAM
  59. ;adresses OCh a 2Fh
  60. ;attention: le nb qui suit Ram0+... doit etre ecrit en Hexa !
  61.  
  62. Ram0 equ 000C
  63. AA equ Ram0+00 ;mon registre de travail
  64. BB equ Ram0+01 ;mon registre de travail
  65. CC equ Ram0+02 ;mon registre de travail
  66. DD equ Ram0+03 ;mon registre de travail
  67. WW equ Ram0+04 ;pour sauvegarder w pendant INT
  68.  
  69. nb0 equ Ram0+05
  70. nb1 equ Ram0+06
  71.  
  72. t1 equ Ram0+07 ;pour les tempos
  73. t2 equ Ram0+08
  74. t3 equ Ram0+09
  75.  
  76. dtlcd equ Ram0+0A ;data vers afficheur LCD
  77.  
  78. aff1 equ Ram0+0B
  79. aff2 equ Ram0+0C
  80. aff3 equ Ram0+0D
  81. aff4 equ Ram0+0E
  82.  
  83. bitn equ Ram0+0F
  84. memo1 equ Ram0+10 ;variable de travail
  85. memo2 equ Ram0+11 ;variable de travail
  86. memo3 equ Ram0+12 ;variable de travail
  87. compte equ Ram0+133
  88.  
  89. pos1 equ Ram0+14
  90.  
  91. val0 equ Ram0+15 ;position actuelle de l'antenne
  92.  
  93.  
  94. moteur equ Ram0+16 ;00=arret 01=droite 10=gauche 11=arret 1xx=rotation 0xx=arret
  95. ils equ Ram0+17 ;=0 ou 1 memo ILS
  96.  
  97.  
  98.  
  99. org 0 ;start address 0
  100.  
  101. goto start
  102.  
  103. ;----------------------------------------------------------------------
  104. ;traitement interruption
  105. ;ici INT par RB0
  106.  
  107. org 0004 ;INT
  108.  
  109. movwf WW
  110.  
  111. call cptils
  112. call tp2ms
  113.  
  114. movf WW,w
  115.  
  116. bcf INTCON,1
  117. retfie
  118.  
  119.  
  120. ;----------------------------------------------------------------------
  121. ;INITIALISATION DES PORTS
  122. ;----------------------------------------------------------------------
  123. org 0020
  124.  
  125.  
  126. start
  127.  
  128. restart clrwdt
  129.  
  130. movlw B'00000000' ;0=sortie 1=entree (RA4=aussi RTCC) attention RA4 =drain ouvert
  131. ;il faut donc cabler une R a VDD
  132. TRIS PORTA ;config du port A (TRISA en page 1)
  133. movlw B'00111101'
  134. TRIS PORTB ;config du port B (RB0 aussi entree INT )
  135.  
  136. bcf PORTB,6 ;sortie vers LM272 (pilote moteur)
  137. bcf PORTB,7 ;sortie vers LM272 (pilote moteur)
  138. clrf moteur
  139. ;----------------------------------------------------------------------
  140. ;PROGRAMMATION DU REGISTRE OPTION
  141. ;VOIR page 144 et 143
  142. ;soit Timer0 = 1/128 -> PS2,1,0 = 111b VOIR PAGE 135
  143. ;PSA (bit3) = 1 -> prediv affecte au chien de garde voir p:73
  144. ;RTE (bit4) = 0 -> inc sur front montant
  145. ;RTS (bit5) = 0 -> branche Timer0 sur horloge interne
  146. ;INTEDG=0 = INT sur front descendent de RB0
  147. ;RBPU (bit7)=1 -> pas de R tirage a Vdd du port B (10k ext a GND sur PB2, et a VCC sur PB3,4,5)
  148.  
  149.  
  150. ; bits: 76543210
  151. movlw B'10001111'
  152. OPTION
  153. ;----------------------------------------------------------------------
  154.  
  155. ;PROG DU REGISTRE INTCON
  156. ;voir page 155 et surtout p:136
  157. ;bit0 RBIF=x (sortie?)
  158. ;bit1 INTF=x (sortie?)
  159. ;bit2 RTIF=x (SORTIE?)
  160. ;bit3 RBIE=0 -> INT du port RB4 a RB7 interdites.
  161. ;bit4 INTE=1 -> INT de RB0/INT autorisees.
  162. ;bit5 RTIE=0 -> INT par debordement Timer0 interdites.
  163. ;bit6 EEIE=0 -> INT EEPROM interdites
  164. ;bit7 GIE=1 ->INT GLOBALE autorisee.
  165.  
  166. movlw B'10010000'
  167. movwf INTCON
  168.  
  169.  
  170. ;----------------------------------------------------------------------
  171. ;Initialisation des variables
  172.  
  173. clrf TMR0
  174. clrf nb0
  175. clrf nb1
  176. clrf moteur
  177.  
  178. movlw .128 ;valeur moyenne correspondant a T2B (5ºW)
  179. movwf val0
  180.  
  181. bcf PORTB,6
  182. bcf PORTB,7
  183.  
  184.  
  185. ;-----------------------------------------------------------------------
  186. ;essai
  187.  
  188. ;-----------------------------------------------------------------------
  189. ;RAZ LCD
  190. call dspclr
  191. call home
  192. call fset
  193. call setmod0
  194. call dsp10
  195.  
  196. movlw 00h
  197. call ddras
  198.  
  199. movlw .0 ;offset "SatPos"
  200. call texte1
  201. movlw .2
  202. call tx100ms
  203.  
  204. movlw 00h
  205. call ddras
  206.  
  207. call dspclr ;efface LCD
  208.  
  209. call scr1 ;lit le commutateur rotatif. resultat dans pos1
  210. call affisat
  211. call satpos ;retourne dans w, l'octet orientation du sat pointe par le commt rotatif
  212. movwf val0 ;initialise la variable de position courante avec cette valeur
  213. call affipos
  214.  
  215.  
  216. ;----------------------------------------------------------------------
  217. ;BOUCLE PRINCIPALE
  218.  
  219.  
  220. auto clrwdt
  221. call tp100ms
  222.  
  223. btfss PORTB,3 ;bouton <
  224. goto manuel ;passe en manuel ?
  225. btfss PORTB,4 ;bouton >
  226. goto manuel ;passe en manuel ?
  227.  
  228. movlw 00h
  229. call ddras
  230.  
  231. movf pos1,w
  232. movwf memo1
  233. call scr1
  234.  
  235. movf memo1,w
  236. subwf pos1,w ;ne touche pas pos1
  237. btfsc STATUS,2 ;bit z
  238. goto auto2 ;saute l'affichage si pos1 inchange
  239.  
  240. call affisat
  241.  
  242. auto2 btfsc PORTB,5 ;3eme bouton
  243. goto auto ;boucle courte (sans pointer) tant que touche pas enfoncee
  244.  
  245. call pointer ;rotation de l'antenne si appui du 3eme bouton . c'est une boucle
  246. call affipos ;lorsque pointage fini
  247.  
  248. goto auto
  249.  
  250.  
  251. manuel clrwdt
  252.  
  253. call testbtn
  254. call cmdmotr
  255. call affipos
  256.  
  257. btfss PORTB,5 ;bouton M
  258. goto auto ;passe en auto
  259.  
  260. goto manuel
  261.  
  262.  
  263. ;----------------------------------------------------------------------
  264. ;DEBUT DES PROCEDURES
  265.  
  266.  
  267. ;----------------------------------------------------------------------
  268. ;traitement des impultions ILS detectees par INT de RB0
  269. cptils btfsc moteur,0
  270. goto incils
  271. goto decils
  272.  
  273. incils incf val0,f
  274. goto findec1
  275.  
  276. decils decf val0,f
  277. goto findec1
  278.  
  279.  
  280. findec1 return
  281.  
  282.  
  283. ;----------------------------------------------------------------------
  284. ;test appui boutons commande manuelle. pas de touche enfoncee = pas de changement du sens
  285. ;positionne 3 bits de la variable 'moteur'
  286. testbtn clrwdt
  287. bcf moteur,2
  288. btfss PORTB,3 ;test touche <
  289. goto sens1
  290. goto test2
  291.  
  292. sens1 bcf moteur,1 ;sens
  293. bsf moteur,0 ;sens
  294. bsf moteur,2 ;marche
  295. goto fin1
  296.  
  297. test2 btfss PORTB,4 ;test touche >
  298. goto sens2
  299. goto stop1 ;pas de touche enfoncee
  300.  
  301. sens2 bcf moteur,0
  302. bsf moteur,1
  303. bsf moteur,2 ;marche
  304. goto fin1
  305.  
  306. stop1 bcf moteur,2 ;bit arret/marche
  307. fin1 return
  308.  
  309. ;----------------------------------------------------------------------
  310. ;commande moteur
  311. cmdmotr clrwdt
  312. btfss moteur,2 ;test bit arret/marche
  313. goto stop2
  314.  
  315. btfsc moteur,0
  316. bsf PORTB,6
  317. btfss moteur,0
  318. bcf PORTB,6
  319.  
  320. btfsc moteur,1
  321. bsf PORTB,7
  322. btfss moteur,1
  323. bcf PORTB,7
  324. goto fin2
  325.  
  326. stop2 bcf PORTB,6 ;stop le moteur
  327. bcf PORTB,7
  328. return
  329.  
  330. fin2 return
  331.  
  332.  
  333.  
  334. ;----------------------------------------------------------------------
  335. ;tableau des noms de satellites
  336. ;le texte doit obligatoirement finir par .0 pour sortir de la boucle
  337. txt1 addwf PCL,f
  338.  
  339. retlw 'S' ;0
  340. retlw 'a'
  341. retlw 't'
  342. retlw 'P'
  343. retlw 'o'
  344. retlw 's'
  345. retlw .0 ;bsf w bit 7 -> fin
  346.  
  347. retlw 'A' ;7
  348. retlw 'S'
  349. retlw 'T'
  350. retlw 'R'
  351. retlw 'A'
  352. retlw .0 ;bsf w bit 7 -> fin
  353.  
  354. retlw 'E' ;13
  355. retlw 'U'
  356. retlw 'T'
  357. retlw '-'
  358. retlw 'W'
  359. retlw '2'
  360. retlw .0 ;bsf w bit 7 -> fin
  361.  
  362. retlw 'H' ;20
  363. retlw 'o'
  364. retlw 't'
  365. retlw 'B'
  366. retlw 'i'
  367. retlw 'r'
  368. retlw 'd'
  369. retlw .0 ;bsf w bit 7 -> fin
  370.  
  371. retlw 'E' ;28
  372. retlw 'U'
  373. retlw 'T'
  374. retlw '-'
  375. retlw 'W'
  376. retlw '1'
  377. retlw .0 ;bsf w bit 7 -> fin
  378.  
  379. retlw 'I' ;35
  380. retlw '7'
  381. retlw '0'
  382. retlw '7'
  383. retlw .0 ;bsf w bit 7 -> fin
  384.  
  385. retlw 'T' ;40
  386. retlw '2'
  387. retlw 'B'
  388. retlw .0 ;bsf w bit 7 -> fin
  389.  
  390. retlw 'T' ;44
  391. retlw '2'
  392. retlw 'A'
  393. retlw '-'
  394. retlw '2'
  395. retlw 'D'
  396. retlw .0 ;bsf w bit 7 -> fin
  397.  
  398. retlw 'H' ;51
  399. retlw 'i'
  400. retlw 's'
  401. retlw 'p'
  402. retlw 'a'
  403. retlw 's'
  404. retlw 'a'
  405. retlw 't'
  406. retlw .0 ;bsf w bit 7 -> fin
  407.  
  408.  
  409.  
  410. ;----------------------------------------------------------------------
  411. ;tableau des valeurs de positions des satellites
  412. ;taper les valeurs correspondant a votre equipement (monture + verin + ILS + site)
  413. tabpos addwf PCL,f
  414. retlw .196 ; ASTRA 19.2 ºE
  415. retlw .189 ; EUT-W2 16.0 ºE
  416. retlw .180 ; HotBird 13.0 ºE
  417. retlw .170 ; EUT-W1 10.0 ºE
  418. retlw .140 ; I-707 1.0 ºW
  419. retlw .126 ; T2B 5.0 ºW
  420. retlw .111 ; T2A 8.0 ºW
  421. retlw .35 ; Hispasat 30.0 ºW
  422. retlw .128 ; non utilise
  423. retlw .128 ; non utilise
  424. retlw .128 ; non utilise
  425.  
  426. ;----------------------------------------------------------------------
  427. ;w doit contenir la position du commutateur rotatif [1..11]
  428. satpos movlw .1
  429. subwf pos1,w ;position (0..10) du commutateur rotatif de selection du sat
  430. call tabpos ;retourne la valeur de l'octet de consigne de position dans w
  431. return
  432.  
  433. ;----------------------------------------------------------------------
  434. ;decodage de la position du commutateur rotatif et
  435. ;affichage du nom du satellite en fontion de la variable pos1
  436.  
  437. affisat movlw 00h ;affiche partie gauche du LCD
  438. call ddras
  439. call dspclr ;efface LCD
  440.  
  441. movlw .1
  442. subwf pos1,w ;ne touche pas pos1 ! result dans w
  443. btfss STATUS,2 ;bit z
  444. goto sat2
  445.  
  446. ;traitement sat1
  447. movlw .7 ;astra
  448. call texte1
  449. goto finafst
  450.  
  451. sat2 movlw .2
  452. subwf pos1,w
  453. btfss STATUS,2
  454. goto sat3
  455.  
  456. ;traitement sat2
  457. movlw .13 ;EUT-W2
  458. call texte1
  459. goto finafst
  460.  
  461. sat3 movlw .3
  462. subwf pos1,w
  463. btfss STATUS,2
  464. goto sat4
  465.  
  466. ;traitement sat3
  467. movlw .20 ;HotBird
  468. call texte1
  469. goto finafst
  470.  
  471. sat4 movlw .4
  472. subwf pos1,w
  473. btfss STATUS,2
  474. goto sat5
  475.  
  476. ;traitement sat4
  477. movlw .28 ;EUT-W1
  478. call texte1
  479. goto finafst
  480.  
  481. sat5 movlw .5
  482. subwf pos1,w
  483. btfss STATUS,2
  484. goto sat6
  485.  
  486. ;traitement sat5
  487. movlw .35 ;I707
  488. call texte1
  489. goto finafst
  490.  
  491. sat6 movlw .6
  492. subwf pos1,w
  493. btfss STATUS,2
  494. goto sat7
  495.  
  496. ;traitement sat6
  497. movlw .40 ;T2B
  498. call texte1
  499. goto finafst
  500.  
  501. sat7 movlw .7
  502. subwf pos1,w
  503. btfss STATUS,2
  504. goto sat8
  505.  
  506. ;traitement sat7
  507. movlw .44 ;T2A-2D
  508. call texte1
  509. goto finafst
  510.  
  511. sat8 movlw .8
  512. subwf pos1,w
  513. btfss STATUS,2
  514. goto sat9
  515.  
  516. ;traitement sat8
  517. movlw .51 ;Hispasat
  518. call texte1
  519. goto finafst
  520.  
  521. sat9
  522.  
  523.  
  524. finafst return
  525.  
  526. ;----------------------------------------------------------------------
  527. ;affichage de la position actuelle
  528. affipos movlw 40h ;affiche partie droite du LCD
  529. call ddras
  530. movf val0,w
  531. call affiw
  532. call affi4
  533. call tp10ms
  534. return
  535.  
  536. ;-----------------------------------------------------------------------
  537. ;actionne le moteur pour pointer le satellite
  538. pointer call dspclr ;efface LCD
  539. call affisat
  540.  
  541. bcl2 clrwdt
  542.  
  543. movlw 40h
  544. call ddras
  545. movlw ' ' ;fait clignoter la fleche
  546. call ecrire
  547.  
  548. btfss PORTB,3 ;bouton <
  549. goto finptr ;sort
  550. btfss PORTB,4 ;bouton >
  551. goto finptr ;sort
  552.  
  553. call satpos
  554. movwf memo2
  555.  
  556. subwf val0,w
  557. btfsc STATUS,0 ;bit c
  558. goto sens11
  559. goto sens22
  560.  
  561. sens11 bcf moteur,0
  562. bsf moteur,1
  563. movlw 40h
  564. call ddras
  565. movlw '>'
  566. call ecrire
  567. goto action
  568.  
  569. sens22 bcf moteur,1
  570. bsf moteur,0
  571. movlw 40h
  572. call ddras
  573. movlw '<'
  574. call ecrire
  575. goto action
  576.  
  577. action bsf moteur,2
  578. call cmdmotr
  579.  
  580. ; call affipos
  581.  
  582. movf memo2,w
  583. subwf val0,w
  584. btfss STATUS,2 ;bit z
  585. goto bcl2 ;boucle
  586. goto finptr ;si la position de la consigne est atteinte
  587.  
  588. finptr bcf moteur,2
  589. call cmdmotr ;stop
  590. return
  591.  
  592. ;-----------------------------------------------------------------------
  593. ;le texte doit obligatoirement finir par .0 pour sortir de la boucle
  594. texte1 movwf DD
  595.  
  596. looptx1 movf DD,w
  597. call txt1
  598. andlw .255 ; pos bit z
  599. btfsc STATUS,2 ;test bit z
  600. return
  601. call ecrire
  602. incf DD,f
  603. goto looptx1
  604.  
  605.  
  606.  
  607. ;----------------------------------------------------------------------
  608. ;scrute le 4017
  609. ;resultat dans pos1
  610.  
  611. scr1 clrwdt
  612. bsf PORTB,1 ;RAZ 4017
  613. call tp300us
  614. bcf PORTB,1 ;FIN RAZ
  615. clrf pos1
  616. incf pos1 ;pour partir de 1 et pas de 0
  617.  
  618. bcl4017 clrwdt
  619. btfsc PORTB,2
  620. return
  621. call clk4017
  622. incf pos1
  623. movlw .11
  624. xorwf pos1,w ;debordement ? (toutes les sorties du 4017 NC)=pos10b
  625. btfss STATUS,2 ;bit z
  626. goto bcl4017
  627. return
  628.  
  629.  
  630. ;-----------------------------------------------------------------------
  631. clk4017 clrwdt
  632. bsf PORTA,4
  633. call tp300us
  634. bcf PORTA,4
  635. return
  636.  
  637.  
  638.  
  639. ;***********************************************************************************************
  640. ;debut des procedures d'affichage LCD
  641. ;----------------------------------------------------------------------
  642. ;FUNCTION SET
  643.  
  644. fset bcf PORTA,2 ;E=0
  645. bcf PORTA,3 ;R/S=0
  646.  
  647. movlw .56 ;(32+16+8)
  648. movwf dtlcd
  649.  
  650. call dt_out ;transmission serie vers 4015 -> DATA // LCD
  651. call impuls
  652. return
  653. ;----------------------------------------------------------------------
  654. ;DISPLAY CLEAR
  655. dspclr bcf PORTA,2 ;E=0
  656. bcf PORTA,3 ;R/S=0
  657.  
  658. movlw .1
  659. movwf dtlcd
  660. call dt_out
  661. call impuls
  662. return
  663. ;----------------------------------------------------------------------
  664. ;RETURN HOME
  665. home clrf PORTA
  666. movlw .2
  667. movwf dtlcd
  668. call dt_out
  669. call impuls
  670. return
  671.  
  672. ;----------------------------------------------------------------------
  673. ;ENTRY MODE SET 0
  674. ;le curseur se deplace
  675.  
  676. setmod0 bcf PORTA,2 ;E=0
  677. bcf PORTA,3 ;R/S=0
  678.  
  679. movlw .6 ;( 4+2 sens inverse si 4+0 )
  680. movwf dtlcd
  681. call dt_out
  682. call impuls
  683. return
  684. ;----------------------------------------------------------------------
  685. ;ENTRY MODE SET 1
  686. ;curseur gele
  687. setmod1 bcf PORTA,2 ;E=0
  688. bcf PORTA,3 ;R/S=0
  689.  
  690. movlw .7 ;( 4+2+1 )
  691. movwf dtlcd
  692. call dt_out
  693. call impuls
  694. return
  695.  
  696. ;----------------------------------------------------------------------
  697. ;DISPLAY ON OFF
  698. dsp10 bcf PORTA,2 ;E=0
  699. bcf PORTA,3 ;R/S=0
  700.  
  701. movlw .12 ;( 8+4 )
  702. movwf dtlcd
  703. call dt_out
  704. call impuls
  705. return
  706. ;----------------------------------------------------------------------
  707. ;DDRAM ADRESS SET (A)
  708. ;w doit contenir l'adresse (position d'affichage. voir doc)
  709. ddras bcf PORTA,2 ;E=0
  710. bcf PORTA,3 ;R/S=0
  711. addlw .128
  712. movwf dtlcd
  713. call dt_out
  714. call impuls
  715. return
  716. ;----------------------------------------------------------------------
  717. ;CURSOR OR DISPLAY SHIFT
  718. ;DEFILEMENT DU TEXTE
  719. shiftT bcf PORTA,2 ;E=0
  720. bcf PORTA,3 ;R/S=0
  721.  
  722. movlw .24 ;( 16+8 )
  723. movwf dtlcd
  724. call dt_out
  725. call impuls
  726. return
  727. ;----------------------------------------------------------------------
  728. ;CURSOR OR DISPLAY SHIFT
  729. ;DEFILEMENT DE LA POSITION D'AFFICHAGE (CURSEUR)
  730. shiftC bcf PORTA,2 ;E=0
  731. bcf PORTA,3 ;R/S=0
  732.  
  733. movlw .16 ;( 16 )
  734. movwf dtlcd
  735. call dt_out
  736. call impuls
  737. return
  738.  
  739. ;----------------------------------------------------------------------
  740. ;ECRIRE
  741. ;w doit contenir la valeur ASCII du caractere a afficher
  742. ecrire clrwdt
  743. bcf PORTA,2 ;E=0
  744. bsf PORTA,3 ;R/S=1
  745.  
  746. movwf dtlcd
  747.  
  748. call dt_out
  749.  
  750. bsf PORTA,2 ;impuls E a 1 avec RS=1
  751. call tp10ms
  752. bcf PORTA,2 ;fin impulsion
  753. call tp10ms
  754. return
  755.  
  756. ;----------------------------------------------------------------------
  757. ;impulsion E a 1 avec RS=0
  758. impuls bcf PORTA,3 ;R/S=0
  759. bsf PORTA,2 ;impulsion E a 1
  760. call tp10ms
  761. bcf PORTA,2 ;fin impulsion
  762. call tp10ms
  763. return
  764.  
  765. ;----------------------------------------------------------------------
  766. ;SORTIE DATA (8 bits) en serie sur PA0 vers CD4015. PA1=Clock 4015.
  767.  
  768. dt_out movlw .8
  769. movwf bitn
  770. dtbcl rlf dtlcd,f
  771. bcf PORTA,0 ;bit = 0 (a priori)
  772. btfsc STATUS,0 ;test carry
  773. bsf PORTA,0 ;non, bit = 0
  774.  
  775. out bsf PORTA,1 ;clock 4015
  776. call tp300us
  777. bcf PORTA,1 ;fin clock
  778. call tp300us
  779. decfsz bitn,f
  780. goto dtbcl
  781. return
  782.  
  783.  
  784. ;------------------------------------------------------------------------
  785. ;affichage physique de 4 NOMBRES.
  786. affi4 clrwdt
  787. movlw .10
  788. subwf aff4,w ;pour detecter depassement...
  789. btfsc STATUS,0 ;bit de carry
  790. goto depass
  791.  
  792. movf aff4,w
  793. addlw .48 ;code ASCII de zero
  794. call ecrire
  795.  
  796. affi3 movf aff3,w
  797. addlw .48 ;code ASCII de zero
  798. call ecrire
  799.  
  800. affi2 movf aff2,w
  801. addlw .48 ;code ASCII de zero
  802. call ecrire
  803.  
  804. movf aff1,w
  805. addlw .48 ;code ASCII de zero
  806. call ecrire
  807. goto finaff
  808.  
  809. depass movlw "-"
  810. call ecrire
  811. movlw "-"
  812. call ecrire
  813. movlw "-"
  814. call ecrire
  815. movlw "-"
  816. call ecrire
  817.  
  818. finaff return
  819.  
  820. ;------------------------------------------------------------------------
  821. ;nb decimaux dans AA(unites) et BB(centaines) au prealable
  822. affdeci clrwdt
  823. movf BB,w
  824. movwf CC ;memo BB danc CC because cvBDU utilise BB
  825. call cvBDU
  826. movf AA,w ;ld A,V
  827. movwf aff1 ;ld Aff1,A
  828. movf BB,w ;ld A,W
  829. movwf aff2 ;ld Aff2,A
  830.  
  831. movf CC,w ;ld A,BB ;0..99
  832. movwf AA
  833. call cvBDU
  834. movf AA,w
  835. movwf aff3
  836. movf BB,w
  837. movwf aff4
  838. return
  839.  
  840. ;-----------------------------------------------------------------------
  841. ;affiche un octet complet dans variables aff1..4
  842. ;W doit contenir l'octet a afficher
  843. affiw clrwdt
  844. movwf AA
  845. call cvBDU ;BB=18 et AA=4
  846. movf AA,w
  847. movwf aff1 ;aff1=4
  848.  
  849. movf BB,w ;w=18
  850. movwf AA ;AA=18
  851. call cvBDU ;BB=1 et AA=8
  852.  
  853. movf AA,w
  854. movwf aff2 ;aff2=8
  855. movf BB,w
  856. movwf aff3 ;aff3=1
  857.  
  858. clrf aff4
  859. return
  860. ;-----------------------------------------------------------------------
  861. ;affiche un temps <= 51s
  862. affitp clrwdt
  863. clrf nb1
  864. movwf nb0
  865. bcf STATUS,0 ;RAZ bit de carry
  866. rlf nb0 ;multiplie par deux toutes les valeurs
  867. rlf nb1 ;recupere la retenue...
  868. call affnb
  869. movf aff3,w
  870. addlw .48 ;code ASCII de zero
  871. movf aff3,f ;ne fait rien mais positionne le bit z
  872. btfsc STATUS,2 ;bit z
  873. blanc movlw .32
  874. call ecrire
  875.  
  876. movf aff2,w
  877. addlw .48
  878. call ecrire
  879.  
  880. movlw "."
  881. call ecrire
  882.  
  883. movf aff1,w
  884. addlw .48
  885. call ecrire
  886.  
  887. movlw "s"
  888. call ecrire
  889.  
  890. return
  891.  
  892. ;-----------------------------------------------------------------------
  893. ;affichage nombre 0..9999
  894. ;nb0 et nb1 contiennent un nb 0..9999
  895. affnb clrwdt
  896. movf nb0,w ;ld A,nb0
  897. movwf AA
  898. call cvBCU ;convertit nb0 en BCD
  899. ;resultat dans AA(unites) et BB(centaines)
  900.  
  901. ;on va ajouter nb1 x 256
  902.  
  903. movf nb1,w ;ld A,nb1
  904. movwf memo3 ;ld memo3,A pour'pas toucher nb1
  905.  
  906. incf memo3,f ;hors boucle
  907. bcl1 decfsz memo3,f
  908. goto saut1 ;jrnz ici1
  909. goto suitef
  910. ;ld A,AA
  911. saut1 movlw .56
  912. addwf AA,f ;+56 retenue decimale possible
  913. movf AA,w
  914. sublw .99 ;carry =0 si AA>99
  915. btfsc STATUS,0 ;bit de carry
  916. goto st1 ;donc saut si carry=1, c.a.d si A>99
  917. ;jrc st1
  918. movlw .100
  919. subwf AA,f
  920. incf BB,f ;ajout retenue decimale
  921.  
  922. st1 movlw .2
  923. addwf BB,f ;(+200) soit en tout +256
  924.  
  925. goto bcl1
  926.  
  927. suitef call affdeci
  928. return
  929.  
  930. ;------------------------------------------------------------------------
  931.  
  932. ;CONVERSION BINAIRE(1) (1 octet incomplet 0..99 et pas 0..255) --> BCD
  933. ;nombre a convertir dans AA
  934. ;resultat dans BB (dizaines) et dans AA (unites)
  935. ;ex: AA=237 -> BB=23 et AA=7
  936. ;ex2 AA=84 -> BB=8 et AA=4
  937.  
  938. cvBDU clrf BB
  939.  
  940. conv2 movlw .10
  941. subwf AA,w ;w=AA-10 positionne le bit de carry si A<10
  942. btfss STATUS,0 ;bit de carry
  943. goto conv3 ;donc saut ->conv3 si carry=1, c.a.d si A<10
  944. movlw .10
  945. subwf AA,f ;en boucle : revient a diviser A par 10
  946. incf BB,f
  947. goto conv2 ;9 passages au max si nb <= 99
  948. conv3 return
  949.  
  950. ;--------------------------------------------------------------------
  951. ;CONVERSION BINAIRE(2) (1 octet complet 0..255) --> BCD
  952. ;nombre a convertir dans AA
  953. ;resultat dans BB (centaines) et dans AA (unites)
  954. ;ex: AA=237 -> BB=23 et AA=7
  955.  
  956. cvBCU clrf BB
  957.  
  958. conv4 movlw .100
  959. subwf AA,w ;w=AA-100 positionne le bit de carry si A<100
  960. btfss STATUS,0 ;bit de carry
  961. goto conv5 ;donc saut ->conv3 si carry=1, c.a.d si A<100
  962. movlw .100
  963. subwf AA,f ;en boucle : revient a diviser A par 100
  964. incf BB,f
  965. goto conv4 ;9 passages au max si nb <= 999
  966. conv5 return
  967.  
  968.  
  969. ;--------------------------------------------------------------------
  970.  
  971. ; Qx = 3,2768Mhz
  972.  
  973. tp300us movlw .79
  974. movwf t1
  975.  
  976. t3loop1 decfsz t1,f
  977. goto t3loop1
  978. return
  979.  
  980. ;----------------------------------------------------------------------
  981. ; Qx = 3,2768Mhz
  982.  
  983. tp2ms clrwdt
  984. movlw .16
  985. movwf t1
  986.  
  987. t4loop1 movlw .32
  988. movwf t2
  989.  
  990. t4loop2 decfsz t2,f
  991. goto t4loop2
  992. decfsz t1,f
  993. goto t4loop1
  994. return
  995.  
  996. ;----------------------------------------------------------------------
  997. ; Qx = 3,2768Mhz
  998.  
  999. tp10ms clrwdt
  1000. movlw .82
  1001. movwf t1
  1002.  
  1003. t1loop1 movlw .32
  1004. movwf t2
  1005.  
  1006. t1loop2 decfsz t2,f
  1007. goto t1loop2
  1008. decfsz t1,f
  1009. goto t1loop1
  1010. return
  1011.  
  1012. ;----------------------------------------------------------------------
  1013. ; Qx = 3,2768Mhz
  1014.  
  1015. tp100ms clrwdt
  1016. movlw .170
  1017. movwf t1
  1018.  
  1019. t2loop1 movlw .160
  1020. movwf t2
  1021.  
  1022. t2loop2 clrwdt
  1023. decfsz t2,f
  1024. goto t2loop2
  1025. decfsz t1,f
  1026. goto t2loop1
  1027. return
  1028. ;----------------------------------------------------------------------
  1029. ; Qx = 3,2768Mhz
  1030. ;tempo n x 100ms
  1031. ;charger w avec n avant l'appel de cette procedure
  1032.  
  1033. tx100ms clrwdt
  1034. movwf t3
  1035.  
  1036. txloop clrwdt ;chien de garde
  1037. call tp100ms
  1038. decfsz t3,f
  1039. goto txloop
  1040. return
  1041.  
  1042. ;----------------------------------------------------------------------
  1043. ; Qx = 3,2768Mhz
  1044. ;tempo n x 10ms
  1045. ;charger w avec n avant l'appel de cette procedure
  1046.  
  1047. tx10ms clrwdt
  1048. movwf t3
  1049.  
  1050. txlp2 clrwdt ;chien de garde
  1051. call tp10ms
  1052. decfsz t3,f
  1053. goto txlp2
  1054. return
  1055.  
  1056. ORG 2007H ; Fuses
  1057. DATA 3FF1H ;osc=XT
  1058.  
  1059.  
  1060. ;----------------------------------------------------------------------
  1061. end
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  

4 -



21749