Déclencheur automatique pour APN
basé sur un Microcontroleur ATmega8

Cet automatisme permet de piloter un servo-moteur du type de ceux utilisés en aéromodélisme ou en robotique de loisirs afin d'appuyer sur le bouton de prise de vue d'un appareil photo numérique.

Le déclenchement peut se faire manuellement par appui à distance sur un bouton poussoir, ce qui permet d'éviter de toucher l'APN, et donc de s'affranchir des vibrations. Vous me direz qu'il est possible d'utiliser le retardateur de l'APN, mais dans certains cas, comme par exemple en astronomie d'amateur, lorsque l'appareil est fixé sur un télescope lui même situé sur une petite monture équatoriale plus ou moins (in)stable, les oscillations peuvent perdurer bien plus longtemps que la durée maximale du retardateur. Le servo effectura une pression douce et progressive sur le bouton de l'appareil.
Il peut également se faire automatiquement à intervalles réguliers de 10s, 30s, 1mn, 5mn et 10mn, sélectionnables ce qui permet de réaliser des films très fortement accéléres en recréant un .avi (ou gif animé etc...) à partir des images (formation et déplacement des nuages, mouvement des végétaux, pousse d'une fleur, déplacement de l'ombre du soleil etc...)

1 Vues d'ensemble

2 -

Voici le déclencheur monté sur un DMC FX3 (6Mp) Panasonic.

3 Vue en détail:

Le ressort en série dans la tige de transmission entre le servo et le palonnier presseur est nécessaire afin de limiter l'effort sur le déclencheur de l'APN.
La pièce horizontale en plastique permet de fixer l'ensemble sur l'oculaire d'un télescope ou d'une lunette astronomique.

4 La partie électronique

5 -

Le matériel électronique est limité au strict minimum:
  • ATmega8
  • quartz bas profil + condensateurs
  • 1 switch
  • 3 pontets pour choisir la fréquence de déclenchement auto
  • un connecteur de programmation in-circuit

6 Le firmware en langage assembleur AVR pour l'ATmega8

CODE SOURCE en langage assembleur AVR
  1.  
  2. ;=======================================================================
  3. ; Fichier : pilote_servo.asm
  4. ; Titre: BASE DE PROGRAMMATION
  5. ; Version: 1.0
  6. ; Auteur: Silicium628
  7. ; Date: 26/06/2007
  8. ;=======================================================================
  9.  
  10. ;DECLENCHEUR manuel et automatique pour appareil photo numerique
  11. ;en mode manuel, permet de declencher sans toucher l'appareil afin d'eviter toutes vibrations (appareil utilise sur un petit telescope)
  12. ;en mode automatique, permet de realiser des films tres fortement acceleres en recreant un .avi (ou gif anime etc...) a partir des images
  13. ;(formation et deplacement des nuages, mouvement des vegetaux, pousse d'une fleur, deplacement de l'ombre du soleil etc...)
  14. ;
  15. ;=======================================================================
  16. ;PRINCIPE
  17. ;actionne un servo-moteur (tels que ceux utilises en aeromodelisme ou en robotique) pour appuyer DOUCEMENT sur le declencheur de l'APN
  18. ;soit;
  19. ;-au coup par coup commande par un bouton poussoir
  20. ;-soit automatiquement avec une periode (10s, 30s, 1mn , 5mn, 10mn) selectionnable par 3 pontets
  21.  
  22. ;=======================================================================
  23.  
  24.  
  25. ;LISTE DES PARTIES:
  26.  
  27. ;Declaration des Variables
  28. ;MACROS
  29. ;Declaration des Vecteurs d'interruptions
  30. ;Routines de traitement des interruptions
  31. ;Programme de RESET
  32. ;initialisation des ports
  33. ;PROGRAMME PRINCIPAL
  34. ;ROUTINES
  35.  
  36.  
  37. ;=======================================================================
  38.  
  39.  
  40. .include "m8def.inc" ; nom du fichiers de references des registres (ATMEGA 8)
  41.  
  42.  
  43. ;------------------------------------------------------------------------
  44. ;Declaration des Variables
  45. ;------------------------------------------------------------------------
  46.  
  47. .def T0 = r4
  48. .def T1 = r5
  49. .def compte1 = r6
  50. .def postdiv = r7
  51. .def periode1 = r8
  52.  
  53. .def SAUVREG = r15 ; registre de sauvegarde de SREG
  54.  
  55. .def F1 = r16 ;"mesflags1"
  56. ;F1[0]= declenchement auto INTERDIT
  57. ;F1[1]= decrementation compte1
  58. ;F1[2]=
  59. ;F1[3]=
  60. ;F1[4]=
  61.  
  62.  
  63. .def a = r17
  64. .def AA = r18
  65. .def BB = r19
  66.  
  67. .def AL = r18
  68. .def AH = r19
  69. .def BL = r20
  70. .def BH = r21
  71.  
  72.  
  73.  
  74. ;r26,27 reserve comme registre d'adresse d'indexation (X)
  75.  
  76.  
  77. ;r30,31 reserve comme registre d'adresse d'indexation (Z) permet la lecture en memoire de programme
  78.  
  79. .DSEG
  80.  
  81. nombre1: .BYTE 3 ;nombre code sur 3 octets (binaire) 0...16 777 216
  82. nombre2: .BYTE 3 ;""
  83.  
  84. dividende: .BYTE 3
  85. numerateur: .BYTE 1
  86. denominateur: .BYTE 1
  87.  
  88.  
  89. ;------------------------------------------------------------------------
  90. ;MACROS
  91. ;------------------------------------------------------------------------
  92.  
  93. ;cette macro fait @0(variable en RAM, 24bits) := @1 valeur(24bits) pasee en parametre
  94. .MACRO Mset24
  95. ldi a,BYTE1(@1)
  96. sts @0+0,a
  97. ldi a,BYTE2(@1)
  98. sts @0+1,a
  99. ldi a,BYTE3(@1)
  100. sts @0+2,a
  101.  
  102. .ENDMACRO
  103.  
  104. ;------------------------------------------------------------------------
  105. ;cette macro fait @0(variable en RAM, 24bits) := r20,21,22
  106. .MACRO Mstore24
  107. sts @0+0,r20
  108. sts @0+1,r21
  109. sts @0+2,r22
  110.  
  111. .ENDMACRO
  112.  
  113. ;------------------------------------------------------------------------
  114. ;cette macro fait 3 registres successifs := @0 (variable en RAM, 24bits, pasee en parametre)
  115. .MACRO Mload24
  116. lds r20,@0+0
  117. lds r21,@0+1
  118. lds r22,@0+2
  119.  
  120.  
  121. .ENDMACRO
  122.  
  123.  
  124. ;------------------------------------------------------------------------
  125. ;Declaration des Vecteurs d'interruptions
  126. ;------------------------------------------------------------------------
  127.  
  128. .CSEG
  129. .ORG 0x0000 ;debut zone memoire programme
  130. rjmp RESET ;RESET
  131. rjmp EXT_INT0 ;Interruption externe INT0
  132. rjmp EXT_INT1 ;Interruption externe INT1
  133. rjmp TIM2_COMP ;Interrution comparaison reussie TIMER2
  134. rjmp TIM2_OVF ;Interrution debordement compteur TIMER2
  135. rjmp TIM1_CAPT ;Interrution entree capture TIMER1
  136. rjmp TIM1_COMPA ;Interrution comparateurA TIMER1
  137. rjmp TIM1_COMPB ;Interrution comparateurB TIMER1
  138. rjmp TIM1_OVF ;Interrution debordement compteur TIMER1
  139. rjmp TIM0_OVF ;Interrution debordement compteur TIMER0
  140. rjmp SPI_STC ;Interrution transmissions SPI terminee
  141. rjmp UART_RXC ;Interrution reception UART termine RX
  142. rjmp UART_DRE ;Interrution UART vide
  143. rjmp UART_TXC ;Interrution emission UART termine TX
  144. rjmp ADC_ok ;Interrution Conversion A/D terminee
  145. rjmp EE_RDY ;Interrution EEPROM prete
  146. rjmp ANA_COMP ;Interrution comparaison analogique effectuee
  147.  
  148. ;------------------------------------------------------------------------
  149. ;Routines de traitement des interruptions
  150. ;------------------------------------------------------------------------
  151.  
  152. EXT_INT0: reti
  153. ;------------------------------------------------------------------------
  154. EXT_INT1: reti
  155. ;------------------------------------------------------------------------
  156. TIM2_COMP: reti
  157. ;------------------------------------------------------------------------
  158. TIM2_OVF: reti
  159. ;------------------------------------------------------------------------
  160. TIM1_CAPT: reti
  161. ;------------------------------------------------------------------------
  162. ;genere duree implulsion de voie PPM (1ms)
  163. ; OBSOLETE :declencheur automatique a intervales reguliers
  164. TIM1_COMPA: in sauvreg,sreg
  165. push sauvreg
  166. push a
  167.  
  168. cbi portb,0 ;fin d'impulsion PPM
  169.  
  170.  
  171. pop a
  172. pop sauvreg
  173. out sreg,sauvreg
  174.  
  175. reti
  176. ;------------------------------------------------------------------------
  177. TIM1_COMPB: reti
  178. ;------------------------------------------------------------------------
  179.  
  180. ;------------------------------------------------------------------------
  181. TIM1_OVF: reti
  182. ;------------------------------------------------------------------------
  183. ;Genere la periode de recurence du signal PPM (16ms), la periode de declenchement auto, et bride la nervosite du servo
  184. TIM0_OVF: in sauvreg,sreg
  185. push sauvreg
  186. push a
  187.  
  188. bst F1,1
  189. brtc suite3
  190. dec compte1 ;a chaque decrementation de compte1 le servo tounera d'un angle dx
  191. ;la frequence a laquelle on passe ici determine donc la nervosite du servo (et la bride volontairement)
  192.  
  193. suite3: sbrc F1,0 ;declenchement auto interdit?
  194. rjmp suite4 ;oui
  195.  
  196. dec T0
  197. brne suite4
  198. ldi a,203 ;periode de declenchement auto, etage1
  199. mov T0,a
  200. dec T1
  201. brne suite4
  202. mov T1,periode1 ;periode de declenchement auto, etage2 (16e6 Hz/1024/256/203/3=0.10022Hz)
  203. ldi a,80 ;recharge de la duree de declenchement (provoque 1 declenchement auto)
  204. mov compte1,a
  205.  
  206.  
  207. suite4: ldi a,0
  208. out TCNT1H,a ;RAZ Timer1 qui sert a generer la duree d'impulsion
  209. out TCNT1L,a
  210. sbi portb,0
  211.  
  212.  
  213. fin_t0: pop a
  214. pop sauvreg
  215. out sreg,sauvreg
  216. reti
  217. ;------------------------------------------------------------------------
  218. SPI_STC: reti
  219. ;------------------------------------------------------------------------
  220. UART_RXC: reti
  221. ;------------------------------------------------------------------------
  222. UART_DRE: reti
  223. ;------------------------------------------------------------------------
  224. EE_RDY: reti
  225. ;------------------------------------------------------------------------
  226. ANA_COMP: reti
  227. ;------------------------------------------------------------------------
  228. ADC_ok: reti
  229. ;------------------------------------------------------------------------
  230. UART_TXC: reti
  231. ;------------------------------------------------------------------------
  232. UART_RXC1: reti
  233. ;------------------------------------------------------------------------
  234.  
  235.  
  236. ;------------------------------------------------------------------------
  237. ;Programme de RESET
  238. ;------------------------------------------------------------------------
  239.  
  240. nop
  241. texte: .DB 'P','I','L','O','T','E' ;Pour reperer facilement le bon .ASM dans PonyProg!
  242. ;(evite de grosses meprises lorsque je travaille sur plusieurs softs en meme temps...)
  243.  
  244. RESET: ldi a,low(RAMEND)
  245. out SPL,a ; Initialisation de la pile a
  246. ldi a,high(RAMEND) ; l'adresse haute de la SRAM
  247. out SPH,a
  248. ;------------------------------------------------------------------------
  249. ;initialisation des ports
  250. ldi a,0b11111111 ;toutes en sorties ; PB0 = sortie signal PPM
  251. out ddrb,a
  252.  
  253. ldi a,0b11110000 ;PD0,1,2,3 en entree
  254. out ddrd,a
  255. ldi a,0b11111111 ;R de tirage
  256. out portd,a
  257.  
  258.  
  259. ldi a,0b11111111 ;toutes en sorties
  260. out ddrc,a
  261. clr a
  262. out portc,a ;sorties = 0
  263.  
  264. cbi portb,1 ;RAZ signal de depassement de vitesse
  265. ;------------------------------------------------------------------------
  266. ;wachtdog
  267. ; wdr
  268. ; ldi a,0b00001111 ; wachtdog enable; delai = 2s (voir p:82)
  269. ; out wdtcr,a
  270.  
  271. wdr
  272. ldi a,0b00011111
  273. out wdtcr,a
  274. ldi a,0b00010111
  275. out wdtcr,a ; disable le wachtdog. (voir p:83)
  276.  
  277.  
  278. ;------------------------------------------------------------------------
  279. ;TIMSK
  280. ;Timer Interrupt Mask; voir pdf p:70
  281. ;bit7 (OCIE2)
  282. ;bit6 (TOIE2)
  283. ;bit5 (TICIE1) Timer/Counter1, Input Capture Interrupt Enable
  284. ;bit4 (OCIE1A) Timer/Counter1, Output Compare A Match Interrupt Enable
  285. ;bit3 (OCIE1B) Timer/Counter1, Output Compare B Match Interrupt Enable
  286. ;bit2 (TOIE1) Timer/Counter1, Overflow Interrupt Enable
  287. ;bit1 inutilise
  288. ;bit0 (TOIE0) Timer/Counter0 Overflow Interrupt Enable - voir Tavernier p:96
  289.  
  290. ; 76543210
  291. ldi a,0b00010001 ;Timer0 Overflow Interrupt Enable
  292. out TIMSK,a
  293. ;------------------------------------------------------------------------
  294. ;TCCR0 voir Tavernier p:87 et pdf p:70
  295. ;definit le mode de fonctionnement du Timer0
  296. ;bits7a3 = non utilise
  297. ;bits2,1,0 = taux de predivision de l'horloge
  298. ;16MHz/1024 = 15625 Hz
  299.  
  300. ; 76543210
  301. ldi a,0b00000101 ;1/1024
  302. out TCCR0,a
  303. ;------------------------------------------------------------------------
  304. ;TCCR1A
  305. ;definit le mode de fonctionnement du Timer1
  306. ;voir Tavernier p:93
  307.  
  308. ;bit7 (COM1A1) ;definit le comportement de la sortie OC1A
  309. ;bit6 (COM1A0)
  310. ;bit5 (COM1B0)
  311. ;bit4 (COM1B1)
  312. ;bit3,2 NC
  313. ;bit1 (PWM11)
  314. ;bit0 (PWM10)
  315.  
  316. ; 76543210
  317. ldi a,0b00000000 ;voir tableau Tavernier p:93
  318. out TCCR1A,a
  319. ;------------------------------------------------------------------------
  320. ;TCCR1B
  321. ;definit le mode de fonctionnement du Timer1
  322. ;voir Tavernier p:94-95 ;et p:81-82 du datasheet.pdf
  323.  
  324. ;bit7 (ICNC1): enable/disable reducteur de bruit
  325. ;bit6 (ICES1)=1: transfert du registre de comptage TCNT1 dans le registre de capture ICR1 sur front montant du pin ICP
  326. ;bit5 : inutilise
  327. ;bit4 : inutilise
  328. ;bit3 (WGM12 ou CTC1): raz registre de comptage (TCNT1) apres comparaison
  329. ;bits2,1,0: taux de predivision applique a l'horloge systeme. voir Tavernier p:95 et pdf p:98
  330.  
  331. ; 76543210
  332. ldi a,0b00000010 ;clk/8 pour le Timer1;
  333. out TCCR1B,a
  334. ;------------------------------------------------------------------------
  335. ;MCUCR
  336. ;voir datasheet p:31
  337. ;bits[3,2] -> ISC11 ISC10 Description
  338. ;0 0 The low level of INT1 generates an interrupt request.
  339. ;0 1 Any logical change on INT1 generates an interrupt request.
  340. ;1 0 The falling edge of INT1 generates an interrupt request.
  341. ;1 1 The rising edge of INT1 generates an interrupt request.
  342.  
  343. ;bits[1,0] -> ISC01 ISC00 Description
  344. ;0 0 The low level of INT0 generates an interrupt request.
  345. ;0 1 Any logical change on INT0 generates an interrupt request.
  346. ;1 0 The falling edge of INT0 generates an interrupt request.
  347. ;1 1 The rising edge of INT0 generates an interrupt request.
  348.  
  349. ; 76543210
  350. ldi a,0b00000000
  351. out MCUCR,a ;voir p:64 du datasheet.pdf et Tavernier p:30
  352.  
  353. ;------------------------------------------------------------------------
  354. ;GICR (GENERAL INTERRUPT CONTROL REGISTER)
  355. ;page 47 et 65 du datasheet
  356. ;bit 7 = INT1 enable
  357. ;bit 6 = INT0 enable
  358.  
  359. ; 76543210
  360. ldi a,0b00000000
  361. out GICR,a
  362.  
  363. ;------------------------------------------------------------------------
  364. ;chargement du registre de comparaison (A) du Timer1
  365. ; cli
  366.  
  367. ldi AL,LOW(2000)
  368. ldi AH,HIGH(2000)
  369. out OCR1AH,AH
  370. out OCR1AL,AL
  371.  
  372. ;chargement du registre de comparaison (B) du Timer1
  373. ; ldi r20,LOW(10)
  374. ; ldi r21,HIGH(10)
  375. ; out OCR1BH,r21
  376. ; out OCR1BL,r20
  377. ;
  378.  
  379.  
  380. ;------------------------------------------------------------------------
  381. ;zone de tests de procedures
  382.  
  383.  
  384.  
  385. ;------------------------------------------------------------------------
  386. ;PROGRAMME PRINCIPAL
  387. ;------------------------------------------------------------------------
  388.  
  389.  
  390. initvar: ldi F1,0b00000001 ;declenchement auto interdit
  391.  
  392.  
  393. ldi a,160
  394. mov r0,a
  395. ldi a,12
  396. mov r1,a
  397.  
  398. ldi a,0
  399. mov compte1,a
  400.  
  401. ldi a,255
  402. mov T0,a
  403. ldi a,1
  404. mov periode1,a
  405. mov T1,a
  406.  
  407. sei ;Sets the Global Interrupt flag (I) in SREG (status register)
  408.  
  409. ;------------------------------------------------------------------------
  410. ;BOUCLE PRINCIPALE
  411.  
  412. bcl_0: in a,pind ;lecture de la configuration des trois pontets determinant la periode de declenchement auto.
  413. andi a,0b00000111 ;masque
  414. cpi a,0
  415. breq suite00 ;pas de declenchement auto
  416.  
  417. cpi a,1
  418. breq t10s
  419. cpi a,2
  420. breq t30s
  421. cpi a,3
  422. breq t1mn
  423. cpi a,4
  424. breq t5mn
  425. cpi a,5
  426. breq t10mn
  427.  
  428. ;declenchement auto, periode 10s
  429. t10s: ldi a,3
  430. mov periode1,a
  431. rjmp finchar
  432.  
  433. ;declenchement auto, periode 30s
  434. t30s: ldi a,9
  435. mov periode1,a
  436. rjmp finchar
  437.  
  438. ;declenchement auto, periode 1mn
  439. t1mn: ldi a,18
  440. mov periode1,a
  441. rjmp finchar
  442.  
  443. ;declenchement auto, periode 5mn
  444. t5mn: ldi a,90
  445. mov periode1,a
  446. rjmp finchar
  447.  
  448. ;declenchement auto, periode 10mn
  449. t10mn: ldi a,180
  450. mov periode1,a
  451. rjmp finchar
  452.  
  453. finchar: andi F1,0b11111110 ;declenchement auto autorise
  454. rjmp suite01
  455.  
  456. ;----------------------------------------
  457.  
  458. suite00: ori F1,0b00000001 ;interdit declenchement auto
  459.  
  460.  
  461. suite01: mov a,compte1 ;si compte1<>0 -> on declenche (lentement pour eviter les vibrations)
  462. cpi a,0
  463. breq suite02
  464.  
  465. ori F1,0b00000010 ;demande de decrementation de compte1
  466. rjmp dur1
  467.  
  468.  
  469. suite02: andi F1,0b11111101 ;decrementation de compte1 interdite
  470. sbic pind,3 ;declenchement manuel - test bouton poussoir sur pind,0
  471. rjmp dur0 ;bouton relache
  472.  
  473. ldi a,80 ;bouton appuye, on recharge la duree de declenchement (la valeur 80 determine cette duree)
  474. mov compte1,a
  475. rjmp dur1
  476.  
  477. ;les valeurs de BH,L suivantes determinent les positions extremes de la course du servo ; (a adapter au cas par cas suivant le servo utilise)
  478. dur0: ldi BL,LOW(1600) ;valeur de la duree mini de l'impulsion PPM
  479. ldi BH,HIGH(1600)
  480. rjmp go ;on va faire tendre lentement 'duree' vers 'but'
  481.  
  482. dur1: ldi BL,LOW(2200) ;valeur de la duree maxi de l'impulsion PPM
  483. ldi BH,HIGH(2200)
  484. rjmp go
  485.  
  486. go: rcall cp16 ;(compare AH,L a BH,L)
  487. breq fin_bcl0
  488. brsh plus
  489. brlo moins
  490.  
  491. plus: rcall dec16 ;rotation LENTE du servo sens +
  492. rjmp outVal
  493.  
  494. moins: rcall inc16
  495. rjmp outVal
  496.  
  497. outVal: out OCR1AH,AH
  498. out OCR1AL,AL
  499. rcall tp1ms
  500.  
  501.  
  502. fin_bcl0: rjmp bcl_0
  503.  
  504. ;------------------------------------------------------------------------
  505. ;ROUTINES
  506. ;------------------------------------------------------------------------
  507.  
  508.  
  509.  
  510.  
  511. ;------------------------------------------------------------------------
  512. ;.include "EEPROM.inc"
  513. ;------------------------------------------------------------------------
  514. ;.include "affi_LCD.inc"
  515. ;------------------------------------------------------------------------
  516. .include "tempos1_16MHz.inc"
  517. ;------------------------------------------------------------------------
  518. .include "math1.inc"
  519. ;------------------------------------------------------------------------
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
CODE SOURCE en langage assembleur AVR
  1.  
  2. ;----------------------------------------------------------------------
  3. ;ADDITION de registres sur 3 octets
  4. ;r20,21,22:= r20,21,22 + r0,r1,r2
  5.  
  6. add24r: add r20,r0
  7. adc r21,r1
  8. adc r22,r2
  9. ret
  10.  
  11.  
  12. ;----------------------------------------------------------------------
  13. ;ADDITION sur 3 octets (1)
  14. ;r20,21,22:= r20,21,22 + nombre1
  15.  
  16. add24a: lds a,nombre1+0
  17. add r20,a
  18. lds a,nombre1+1
  19. adc r21,a
  20. lds a,nombre1+2
  21. adc r22,a
  22. ret
  23.  
  24. ;----------------------------------------------------------------------
  25. ;ADDITION sur 3 octets (2)
  26. ;nombre1:= nombre1 +nombre2
  27.  
  28. add24b: push AA
  29. push BB
  30. lds AA,nombre1+0
  31. lds BB,nombre2+0
  32. add AA,BB
  33. sts nombre1+0,AA
  34.  
  35. lds AA,nombre1+1
  36. lds BB,nombre2+1
  37. adc AA,BB
  38. sts nombre1+1,AA
  39.  
  40. lds AA,nombre1+2
  41. lds BB,nombre2+2
  42. adc AA,BB
  43. sts nombre1+1,AA
  44. pop BB
  45. pop AA
  46. ret
  47.  
  48. ;----------------------------------------------------------------------
  49. ;MULTIPLICATION 8 bits x 16 bits resultat sur 24 bits
  50. ;multiplie r20(poids faible),r21 , r22(poids fort) par 'a'
  51. ;produit dans r20,r21,r22
  52.  
  53. .def produit0=r20 ;produit poids faible
  54. .def produit1=r21 ;produit
  55. .def produit2=r22 ;produit poids fort
  56. .def n1=r23
  57.  
  58. mul16_8: ldi n1,17 ;compteur de boucle
  59.  
  60. mul16_81: ror produit2
  61. ror produit1
  62. ror produit0
  63.  
  64. brcc mul16_82 ;lecture d'un bit de r20 ; test de ce bit
  65. add produit2,a ;si c' est un '1' on ajoute 'a' à A2
  66.  
  67. mul16_82: dec n1
  68. brne mul16_81
  69.  
  70. ret
  71.  
  72. ;----------------------------------------------------------------------
  73. ;DIVISION 24 bits par 8 bits, resultat sur 24 bits
  74. ;note; le quotient est stocke dans le dividende; permet de decaller les deux a la fois
  75.  
  76. ;r20,21,22 doivent contenir le dividende (r20=LSB)
  77. ;r23 doit contenir le diviseur
  78. ;resultat (Quotient) dans r20 (LSB) et r21 et r22
  79. ;reste dans r24
  80. ;le bit T=1 indique un debordement
  81.  
  82. .def Dividend0=r20 ;pour la routine Div24_8
  83. .def Dividend1=r21 ;pour la routine Div24_8
  84. .def Dividend2=r22 ;pour la routine Div24_8
  85. .def Diviseur =r23 ;pour la routine Div24_8.
  86. .def Aux0=r24 ;pour la routine Div24_8
  87. .def Aux1=r25
  88. .def n1=r16 ;attention: ecrase r16 (=a)
  89.  
  90. div24_8: ldi n1,24
  91. clr Aux0 ;clrf Aux+0
  92.  
  93. div24_80: lsl Dividend0
  94. rol Dividend1
  95. rol Dividend2
  96.  
  97. div24_81: rol Aux0 ;decalle le dividende dans 'Aux' (passage d'un bit par "c")
  98. rol Aux1
  99.  
  100. cp aux0,Diviseur
  101. brlo auxPetit
  102.  
  103. auxGrand: sub Aux0,Diviseur
  104. sec
  105. rjmp saut1
  106.  
  107. auxPetit: clc
  108.  
  109. saut1: rol Dividend0 ;decalle a gauche en incorporant 'c' comme bit 0
  110. rol Dividend1 ;decalle a gauche avec passage d'un bit par "c"
  111. rol Dividend2 ;decalle a gauche et envoie un bit par 'c' dans 'Aux' (apres le saut)
  112.  
  113. dec n1 ;important: ne touche pas a 'c'
  114. brne Div24_81
  115.  
  116. ret
  117.  
  118. ;----------------------------------------------------------------------
  119. ;comparaison de deux valeurs codées sur 16 bits (AH,L à BH,L) (valeur positives seulement)
  120. ;l'instruction suivant l'appel peut etre un branchement conditionnel
  121.  
  122. cp16: cp AH,BH
  123. breq cp2
  124. ret
  125. cp2: cp AL,BL
  126. ret
  127.  
  128. ;----------------------------------------------------------------------
  129. ;incrementation 16 bits de AH,L
  130. inc16: inc AL
  131. brne fininc
  132. inc AH
  133. fininc: ret
  134.  
  135. ;----------------------------------------------------------------------
  136. ;decrementation 16 bits de AH,L
  137. dec16: subi AL,1
  138. sbci AH,0
  139. findec: ret

7 Documents techniques


8 -



12270