summaryrefslogtreecommitdiff
path: root/2004/n/mic799
diff options
context:
space:
mode:
Diffstat (limited to '2004/n/mic799')
-rw-r--r--2004/n/mic799/mic799.asm370
1 files changed, 189 insertions, 181 deletions
diff --git a/2004/n/mic799/mic799.asm b/2004/n/mic799/mic799.asm
index d8ecce5..b4d7324 100644
--- a/2004/n/mic799/mic799.asm
+++ b/2004/n/mic799/mic799.asm
@@ -17,7 +17,7 @@
include "p16f876.inc"
include "m_84.asm"
- __CONFIG _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
+ __CONFIG _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
servo0 equ 0
@@ -25,28 +25,6 @@ servo0 equ 0
Same equ 1
MSB equ 7
-;***************** Communication Parameters **************************
-;
-X_MODE equ 1 ; If ( X_MODE==1) Then transmit LSB first
-; if ( X_MODE==0) Then transmit MSB first ( CODEC like )
-R_MODE equ 1 ; If ( R_MODE==1) Then receive LSB first
-; if ( X_MODE==0) Then receive MSB first ( CODEC like )
-X_Nbit equ 1 ; if (X_Nbit==1) # of data bits ( Transmission ) is 8 else 7
-R_Nbit equ 1 ; if (R_Nbit==1) # of data bits ( Reception ) is 8 else 7
-;
-Sbit2 equ 0 ; if Sbit2 = 0 then 1 Stop Bit else 2 Stop Bits
-;
-;*************************************************************************
-;X_flag equ PA0 ; Bit 5 of F3 ( PA0 )
-;R_flag equ PA1 ; Bit 6 of F3 ( PA1 )
-;
-BAUD_1 equ .68 ; 3+3X = CLKOUT/Baud
-BAUD_2 equ .67 ; 6+3X = CLKOUT/Baud
-BAUD_3 equ .34 ; 3+3X = 0.5*CLKOUT/Baud
-BAUD_4 equ .86 ; 3+3X = 1.25*CLKOUT/Baud
-BAUD_X equ .66 ; 11+3X = CLKOUT/Baud
-BAUD_Y equ .66 ; 9 +3X = CLKOUT/Baud
-
; -- Scratchpad du pic utilisé ( 1er adresse mémoire utilisable )
sp equ h'20' ;(PIC 16f876)
@@ -70,10 +48,18 @@ RcvReg :1 ; Data received
XmtReg :1 ; Data to be transmitted
Count :1 ; Counter for #of Bits Transmitted
DlyCnt :1
+counter :1
+subcounter :1
ENDC
rtcc equ tmr0
+DR equ 0
+DX equ 1
+servo0 equ 0
+servo1 equ 1
+
+
; bits de porta
chID0 equ 0
chID1 equ 1
@@ -102,6 +88,30 @@ optionval equ b'01000010'
edg_msk equ b'01000000'
+
+
+;*** Macros pour lire les AD ***
+wait_ad MACRO
+ local loop
+loop:
+ btfsc adcon0,go
+ goto loop
+ ENDM
+
+admesure MACRO
+ bsf status,rp0
+ movf adresl,w
+ bcf status,rp0
+ ENDM
+
+BANK1 macro
+ bsf status,rp0
+ endm
+
+BANK0 macro
+ bcf status,rp0
+ endm
+
; ***** Mise à jour de l'EEPROM
; ***********************************************
@@ -115,7 +125,7 @@ edg_msk equ b'01000000'
goto reset
ORG 4
serviceint:
- btfsc intcon,intf
+ btfss intcon,t0if
goto busint
; ***** Interuption de timer *****
@@ -123,8 +133,8 @@ serviceint:
goto suite2ms
clr: ;on efface toutes les lignes
- clrf portb
- bcf porta,servo0
+ bcf portc,servo0
+ bcf portc,servo1
bsf flags,portvide ; ça y est le port est bien vide
bcf intcon,t0if ;flag timer
retfie
@@ -148,125 +158,19 @@ busint:
movwf wsave
movf status,w
movwf statussave
+ bcf intcon,gie ;interruption non protégée
-;***************************************************************
-; Receiver
-;
-Rcvr
- IF R_Nbit
- movlw 8 ; 8 Data bits
- ELSE
- movlw 7 ; 7 data bits
- ENDIF
-;
- movwf Count
-R_next bcf STATUS,C
- IF R_MODE
- rrf RcvReg,Same ; to set if MSB first or LSB first
- ELSE
- rlf RcvReg,Same
- ENDIF
- btfsc PORTA,DR
-;
- IF R_MODE
- IF R_Nbit
- bsf RcvReg,MSB ; Conditional Assembly
- ELSE
- bsf RcvReg,MSB-1
- ENDIF
- ELSE
- bsf RcvReg,LSB
- ENDIF
-;
- call DelayY
- decfsz Count,Same
- goto R_next
-;****************************************************
-;R_over movf RcvReg,0 ; Send back What is Just Received
-; movwf XmtReg
-
- call work
-
-;****************************************************
-; Transmitter
-;
-Xmtr
- IF X_Nbit
- movlw 8
- ELSE
- movlw 7
- ENDIF
- movwf Count
-;
- IF X_MODE
- ELSE
- IF X_Nbit
- ELSE
- rlf XmtReg,Same
- ENDIF
- ENDIF
-;
- bcf PORTA,DX ; Send Start Bit
- call Delay1
-X_next bcf STATUS,C
-;
- IF X_MODE
- rrf XmtReg,Same ; Conditional Assembly
- ELSE ; to set if MSB first or LSB first
- rlf XmtReg,Same
- ENDIF
-;
- btfsc STATUS,C
- bsf PORTA,DX
- btfss STATUS,C
- bcf PORTA,DX
- call DelayX
- decfsz Count,Same
- goto X_next
- bsf PORTA,DX ; Send Stop Bit
- call Delay1
-;
- IF Sbit2
- bsf PORTA,DX
- call Delay1
- ENDIF
-;
- goto finbusint
-;
-; End of Transmission
-;
+ movf rcreg,w
-DelayY movlw BAUD_Y
- goto save
-DelayX movlw BAUD_X
- goto save
-Delay4 movlw BAUD_4
- goto save
-Delay1 movlw BAUD_1 ; 104 uS for 9600 baud
- goto save
-Delay2 movlw BAUD_2
-save movwf DlyCnt
-redo_1 decfsz DlyCnt,Same
- goto redo_1
- retlw 0
-;
+ movwf XmtReg
+ incf XmtReg,f
+ call txhard
+ movf rcreg,w
+ call analyse
-;----------------------------
-;-- old bus_int
-;----------------------------
- movf portc,w
-
- btfsc flags,f_sec_octet
- goto sec_octet
- movwf command
- bsf flags,f_sec_octet
- goto finbusint
+ goto finbusint
-sec_octet
- movwf value
- call work
- bcf flags,f_sec_octet
;----- dans tous les cas --------
finbusint:
@@ -279,26 +183,50 @@ finbusint:
; ***** La sous-routine de reset *****
reset:
+ clrf intcon
+; entrées analogiques
+ bsf status,RP0
+ movlw b'00000010'
+ movwf adcon1
+ bcf status,RP0
+
+ movlw b'01000001'
+ movwf adcon0
+
; pour les tris, seuls les lignes à 0 peuvent être basculées en entrée. Les broches à 1 doivent rester en entrée ( sauf la broche RW dans le cas d'une liaison non-duplex )
- movlw b'11111111'
+ movlw b'11111111' ; A0-A5 = AN1-6
tris porta
movlw b'11111101' ; B7-B2 = input / B1 = TX / B0 = RX
tris portb
- movlw b'00000000' ; C7-C2 = output / C1 = servo1 / C0 servo0
+ movlw b'10000000' ; C7 = RX C6 = TXmit C5-C2 = output / C1 = servo1 / C0 servo0
tris portc
clrf portc
movlw optionval
option
+ BANK1
+ movlw b'00100100'
+ movwf txsta
+ movlw .25
+ movwf spbrg
+
+ bsf pie1,rcie ;interruption du port série
+
+ BANK0
+ movlw b'10010000'
+ movwf rcsta
+
clrf buffer_in
bsf flags,portvide
bcf flags,f_sec_octet
- movlw b'10110000' ; (G|EE|T|I|Rb|T|I|Rb)
+; movlw b'11110000' ; (G|PEIE|T|I|Rb|T|I|Rb)
+ movlw b'11100000' ; (G|PEIE|T|I|Rb|T|I|Rb)
movwf intcon
-
+
+
call restore_defaults
goto main
@@ -311,7 +239,7 @@ I=0
WHILE I<=7
; EEread ; lit l'eeprom à l'adresse eeadr et place le résultat dans eedata
; movf eedata,w
- movlw .128
+ movlw .0
movwf indf
incf fsr,f
@@ -324,7 +252,7 @@ ENDW
;------------------------------
; interprétation de la commande
-; 1er octet de controle: D5-D0 ! type ! voie
+; 1er octet de controle: type ! voie ! D5-D0
; type=1 => IO
; voie=1 => in
; voie=0 => out
@@ -332,59 +260,60 @@ ENDW
; voie=1 => servo1
; voie=0 => servo0
-work:
- movf RcvReg,w
- movwf XmtReg,f ; on prépare l'écho de la commande
+analyse:
+ movwf RcvReg
+ movwf command
+ movwf XmtReg ; on prépare l'écho de la commande
; type de trame
- btfss RcvReg,1
+ btfss RcvReg,7
goto setServo
;-- Gestion des IO
setIO
- btfss RcvReg,1
- goto IOout
-;-
-IOin
- movf portb,w
- movwf XmtReg,f
-
-;mise en forme de la trame :
- bsf XmtReg,0 ; IO
- bsf XmtReg,1 ; in
-
- return
+; btfss RcvReg,6
+; goto IOout
+; return
;-
IOout
movf RcvReg,w
- andlw '11111100'
movwf command
+ rlf command,f
+ rlf command,w
+ movlw b'11111100'
+ andwf command,f
+
+; ---- MODE PROTEGE ON ----
+ bcf intcon,gie
movf portc,w
- ; il faut bouger toutes les pattes du portb sans toucher aux servos
- andlw '00000011' ; on efface les IO
- iorwf command ; on les met à jour avec la nouvelle valeur
+ ; il faut bouger toutes les pattes du portc sans toucher aux servos
+ andlw b'00000011' ; on efface les IO
+ iorwf command,w ; on les met à jour avec la nouvelle valeur
movwf portc
+
+ bsf intcon,gie
+; ---- MODE PROTEGE OFF ----
+
return
;-- Gestion des servos
setServo
; n° de servo
- movf command,w
- andlw b'11111100'
- movwf value,f
-
- andlw b'00000001'
- movwf eeadr ; on prépare l'écriture en eeprom
- addlw tabval
+; movwf eeadr ; on prépare l'écriture en eeprom
+ movlw tabval
movwf fsr ; on met à jour le pointeur de tableau
- movf value,w ; on copie la valeur dans le tableau
- movwf indf
+ btfsc command,6 ; on incrémente si c'est le servo 1
+ incf fsr,f
+ rlf command,f
+ rlf command,w
+; movf value,w ; on copie la valeur dans le tableau
+ movwf indf
; écriture en eeprom ?
; btfsc command,eeprom_b
@@ -411,7 +340,7 @@ again: btfss flags,portvide ; si le portb est vide, alors il faut lancer le sign
;---------------
main:
I=0
-WHILE I<=7
+WHILE I<=1
waitnext ;exécute la macro
bcf flags,ms2
@@ -422,11 +351,10 @@ WHILE I<=7
; ---- MODE PROTEGE ON ----
bcf intcon,gie
-IF I==7 ;on allume la bonne ligne de sortie
- bsf porta,servo0
-ELSE
- bsf portb,I+1
-ENDIF
+ movf indf,w
+ btfss status,z
+ bsf portc,I ; on lance le servo si sa position n'est pas nulle
+
bcf flags,portvide ; le port n'est plus vide
; on charge la rtcc pour attendre la première ms
@@ -439,9 +367,89 @@ ENDIF
bsf intcon,gie
; ---- MODE PROTEGE OFF ----
+I++
+ENDW
+
+; Envoi d'un octet de synchro
+ movlw '?'
+ movwf XmtReg
+ call txhard
+ call waittx
+
+; ENVOI DES DONNEES LOGIQUES
+; envoi des entrées comparées
+envoi
+ nop
+ swapf portb,w
+; DEBUG
+; movlw '0'
+ andlw b'11110000' ; les entrées numériques sont sur B0-B3
+ iorlw b'00000111' ; les entrées comparées sont la voie 7
+ movwf XmtReg
+ call txhard ; tx version hard
+ call waittx
+ movf portb,w
+; DEBUG
+; movlw '0'
+ andlw b'11110000' ; les entrées comparées sont sur B4-B7
+; xorlw b'11000000' ; petite inversion de cablage des comparateurs
+ iorlw b'00000000' ; les entrées comparées sont la voie 0
+ movwf XmtReg
+ call txhard ; tx version hard
+ call waittx
+
+; ENVOI DES DONNEES ANALOGIQUES
+I=0
+WHILE I<=3
+ movlw b'11000111'
+ andwf adcon0,f
+ movlw (I*8)
+ iorwf adcon0,f ; on choisit la voie I
+ nop
+
+ bsf adcon0,go
+ wait_ad
+ admesure
+; DEBUG
+; movlw '0'
+ andlw b'11111000' ; les entrées numériques sont sur B0-B3
+ iorlw I ; les entrées comparées sont la voie I
+ movwf XmtReg
+ call txhard ; tx version hard
+ call waittx
I++
ENDW
+ call wait20ms
goto main
+; *** envoi série
+txhard
+ movf XmtReg,w
+ movwf txreg
+ return
+
+waittx
+ call wait1ms
+ return
+
+
+
+;*** routine d'attente
+wait20ms
+ load .20,counter
+loop20
+ call wait1ms
+ decfsz counter,f
+ goto loop20
+ return
+
+wait1ms
+ clrf subcounter
+loop1 nop
+ decfsz subcounter,f
+ goto loop1
+ return
+
+
END