* Utilise un Module LCD 1 X 16 * Utilisé en mode 4 bits * avec initialisation "HARDWARE RESET" * * LCD Module 68HC11F1 PORT G * ---------- --------------- * 1 - Gnd Gnd * 2 - +5 +5 * 3 - Vo (PG0 avec OC2 un jour :-) * LCD Module 68HC11F1 PORT G * ---------- --------------- * 4 - RS - 0=instruction Bit 1 * - 1=data * 5 - R/W! - 0=write, 1=read Bit 2 * 6 - Enable (220 ns mini) Bit 3 * 7 - D0 * 8 - D1 * 9 - D2 * 10 - D3 * 11 - D4 (4 bit path) Bit 4 * 12 - D5 (4 bit path) Bit 5 * 13 - D6 (4 bit path) Bit 6 * 14 - D7 (4 bit path) Bit 7 * Equivalences utilis'es avec un offset $1000 * PORTA EQU $00 DDRA EQU $01 Port A data direction register PORTG EQU $02 DDRG EQU $03 Port G data direction register PORTD EQU $08 DDRD EQU $09 Port D data direction register PORTE EQU $0A PORT E CFORC EQU $0B OC1M EQU $0C OC1D EQU $0D TCNT EQU $0E Timer Counter TIC1 EQU $10 IC1 Timer compare register TIC2 EQU $12 IC2 Timer compare register TIC3 EQU $14 IC3 Timer compare register TOC1 EQU $16 OC1 Timer compare register TOC2 EQU $18 OC2 Timer compare register TOC3 EQU $1A OC3 Timer compare register TOC4 EQU $1C OC4 Timer compare register TI4_O5 EQU $1E IC4/OC5 Timer compare register TCTL1 EQU $20 Timer control register 1 TCTL2 EQU $21 Timer control register 2 TMSK1 EQU $22 Timer Mask register 1 TFLG1 EQU $23 Timer Flag register 1 TMSK2 EQU $24 Timer Mask register 2 TFLG2 EQU $25 Timer Flag register 2 PACTL EQU $26 Pulse Accu. control register PACNT EQU $27 Pulse Accu. counter register SPCR EQU $28 SPI control register SPSR EQU $29 SPI status register SPDR EQU $2A SPI data register BAUD EQU $2B Baudrate selector SCCR1 EQU $2C SCI control register 1 SCCR2 EQU $2D SCI control register 2 SCSR EQU $2E SCI status register SCDR EQU $2F SCI Rx/Tx data register ADCTL EQU $30 A/D control register ADR1 EQU $31 A/D result register 1 ADR2 EQU $32 A/D result register 2 ADR3 EQU $33 A/D result register 3 ADR4 EQU $34 A/D result register 4 BPROT EQU $35 Block Protect OPT2 EQU $38 system configuration options 2 register OPTION EQU $39 system configuration options register PPROG EQU $3B EEPROG Prog register HPRIO EQU $3C High Priority CONFIG EQU $3F CONFIG register CSCTL EQU $5D Chip Select control * Memory configuration equates * RAMSTR EQU $0000 RAMEND EQU $03FF IEESTR EQU $0E00 EEPROM EQU $8000 REGBASE EQU $1000 REGEND EQU $105F BIOS EQU EEPROM *** Constants *** TDRE EQU $80 RDRF EQU $20 CR EQU 13 LF EQU 10 * Variables du programme * ORG RAMSTR lineN RMB 1 DDRAM_add RMB 1 STATMSB RMB 1 LCDSTATUS RMB 1 * Octet d'état pour l'interuption de RTI * RTI_STAT: RMB 1 bit 0: compteur pour mesure sur AN0/AN3 * ou AN4/AN7 * bit 8: flag pour première acquisition, si 0 * alors c'est la première fois, sinon 1 * valeur de mesure des convertisseurs AD * AN_0: RMB 1 AN_1: RMB 1 AN_2: RMB 1 AN_3: RMB 1 AN_4: RMB 1 AN_5: RMB 1 AN_6: RMB 1 AN_7: RMB 1 * * variable pour la routine d'interpolation linéaire * P: RMB 1 valeur fournie par l'ADC P1: RMB 1 borne mini SCAN_TBL Val1: RMB 1 valeur mini P2: RMB 1 borne maxi SCAN_TBL Val2: RMB 1 valeur maxi K: RMB 1 coeficient (rapport entre borne et mesure) Iquot: RMB 2 quotient de la division entière (à droite de la virgule) Fquot: RMB 2 quotient de la fraction de la division (à gauche de la virgule) Res1: RMB 2 résultat de la routine d'évaluation * * variables diverses * Signe: RMB 1 indicateur de signe 0= positif, * si <>0 alors negatif Buffer RMB 10 buffer de sorite utilisé par plusieurs routines Counter RMB 1 utilisé par la routine: 'decimal' bcdbuf: RMB 6 Rpm_max: RMB 2 Régime maxi mesuré Spd_max: RMB 1 Vitesse maxi mesurée Spd_delay: RMB 1 temps avant passage de la vitesse à 0 * quand le régime < Rpm_mini *** Program code *** ORG EEPROM START: LDS #RAMEND la pile est en $03FF LDX #REGBASE "X" contien l'add de base des registres. CLR CSCTL,X disable all chip select * pas utile si pas exécuté sur HC11F1 CLR OPT2,X port G normal, port C normal, 4xE disable BSET OPTION,X $80 Set AD converter ON LDAA #%00000011 RTI prescaler set to E/2^16 STAA PACTL,X soit 16.384ms @ 16MHz LDAA #%01000011 Prescaler set to E/16, soit 4us, TOF à 262.14ms STAA TMSK2,X bit 8 à 1 autorise INT sur Timer Overflow * bit 7 à 1 autorise INT sur Real Time Int. CLR PORTG,X E=0, R/W=0, RS=0 LDAA #$FF port G en sortie STAA DDRG,X JSR INIT_LCD initialise le LCD LDY #mess JSR TEXTE *** MAIN LOOP *** LOOP: BRA LOOP ************************ Subroutines ******************************* INIT_LCD: JSR WAITI attend la fin du HARDWARE reset LDAA #%00100000 STAA PORTG,X E=0, R/W=0, RS=0 BSET PORTG,X $08 E=1, R/W=0, RS=0 BCLR PORTG,X $08 E=0, R/W=0, RS=0 BSR CHKSTAT8 LDAA #%00101000 mode 4 bits, 2 lignes, caractère 5x8 BSR LCD_CMD LDAA #%00001110 Display ON, Cursor ON, Blink OFF BSR LCD_CMD LDAA #%00000110 Auto Inc, Cur. shift R, no Disp shift BSR LCD_CMD JSR LCD_CLEAR JSR LCD_HOME RTS *** ENVOIE D'UNE COMMANDE *** LCD_CMD: PSHA ANDA #$F0 STAA PORTG,X E=0, R/W=0, RS=0 BSET PORTG,X $08 E=1, R/W=0, RS=0 BCLR PORTG,X $08 E=0, R/W=0, RS=0 PULA LSLA LSLA LSLA LSLA STAA PORTG,X E=0, R/W=0, RS=0 BSET PORTG,X $08 E=1, R/W=0, RS=0 BCLR PORTG,X $08 E=0, R/W=0, RS=0 BSR CHKSTAT4 attend fin de l'état BUSY RTS *** ENVOIE DE DATA *** WR_DATA: PSHA ANDA #$F0 ORAA #%00000010 STAA PORTG,X E=0, R/W=0, RS=1 BSET PORTG,X $08 E=1, R/W=0, RS=1 BCLR PORTG,X $08 E=0, R/W=0, RS=1 PULA LSLA LSLA LSLA LSLA ORAA #%00000010 STAA PORTG,X E=0, R/W=0, RS=1 BSET PORTG,X $08 E=1, R/W=0, RS=1 BCLR PORTG,X $08 E=0, R/W=0, RS=1 BSR CHKSTAT4 LDAA DDRAM_add utile pour ne pas se préoccuper INCA de la gestion du passage du STAA DDRAM_add 8ème au 9ème caractère CMPA #$58 BLO WR_DATA1 CLRA BRA WR_DATA2 WR_DATA1: CMPA #8 BLO WR_DATA3 LDAA #$50 WR_DATA2: STAA DDRAM_add JSR LCD_CMD WR_DATA3: RTS fin de la partie utile :-) * Routine de test du BUSY en mode 8 bits CHKSTAT8: LDAA #%00000100 STAA PORTG,X E=0, R/W=1, RS=0 LDAA #$0F port G, 4 bits MSB en entrée STAA DDRG,X CHKSTAT9: BSET PORTG,X $08 E=1, R/W=1, RS=0 LDAA PORTG,X BCLR PORTG,X $08 E=0, R/W=1, RS=0 ANDA #$80 encore BUSY? BNE CHKSTAT9 boucle si oui LDAA #$FF port G en sortie STAA DDRG,X RTS *** ENVOIE UN MESSAGE *** * Y = pointe sur l'adresse ou est stock‚ le message TEXTE: LDAA 0,Y BEQ TEXTE1 BSR WR_DATA INY BRA TEXTE TEXTE1: RTS * Routine de test du BUSY en mode 4 bits CHKSTAT4: LDAA #%00000100 STAA PORTG,X E=0, R/W=1, RS=0 LDAA #$0F port G, 4 bits MSB en entrée STAA DDRG,X CHKSTAT5: BSET PORTG,X $08 E=1, R/W=1, RS=0 LDAA PORTG,X ANDA #$F0 STAA STATMSB BCLR PORTG,X $08 E=0, R/W=1, RS=0 BSET PORTG,X $08 E=1, R/W=1, RS=0 LDAA PORTG,X BCLR PORTG,X $08 E=0, R/W=1, RS=0 LSRA LSRA LSRA LSRA ORAA STATMSB ajoute le MSB au LSB STAA LCDSTATUS sauve le tout en LCDSTATUS ANDA #$80 encore BUSY? BNE CHKSTAT5 boucle si oui LDAA #$FF port G en sortie STAA DDRG,X RTS *** CLEAR LCD *** LCD_CLEAR: CLRA envoie une commande CLEAR vers le LCD STAA DDRAM_add met … jour DDRAM_add LDAA #$01 code le commande CLEAR JSR LCD_CMD RTS *** HOME LCD *** LCD_HOME: CLRA envoie une commande HOME vers le LCD STAA DDRAM_add met a jour DDRAM_add LDAA #$02 code de la commande HOME JSR LCD_CMD RTS *** tempo environ 100 ms *** * j'ai mis #50000 dans Y car j'utilise un quartz de 16MHz * si vous utilisez un 8MHz vous pouvez mettre #25000 WAITI: PSHY 5 LDY #50000 4 WAITI1: JMP WAITI2 3 WAITI2: DEY 4 BNE WAITI1 3 PULY 6 RTS 5 ************************* ZONE DE MESSAGE ******************************* mess: fcc "TEST" fcb 0 ************************* VECTEURS D'INTERUPTIONS ************************ v_sci: v_spi: v_paie: v_pao: v_to: v_toc5: v_toc4: v_toc3: v_toc2: v_toc1: v_tic3: v_tic2: v_tic1: v_rti: v_irq: v_xirq: v_swi: v_iot: v_copf: v_copcmf: JMP START ORG $FFC0 ZMB 22 FDB v_sci SCI vector FDB v_spi SPI vector FDB v_paie pulse accumulator input edge FDB v_pao pulse accumulator overflow FDB v_to timer overflow FDB v_toc5 timer output compare 5 FDB v_toc4 timer output compare 4 FDB v_toc3 timer output compare 3 FDB v_toc2 timer output compare 2 FDB v_toc1 timer output compare 1 FDB v_tic3 timer input capture 3 FDB v_tic2 timer input capture 2 FDB v_tic1 timer input capture 1 FDB v_rti real time interupt FDB v_irq masquable interupt FDB v_xirq non masquable interupt FDB v_swi software interupt FDB v_iot illegal opcode trap FDB v_copf cop failure FDB v_copcmf cop clock monitor fail FDB START reset END