******************************************************************************** ** ===== PROJET : CONTROLEUR SECURITE ET EFFETS POUR LASER RGB ======== ** ********************************************************************************* INCLUDE "REGSF1.ASM" ; Listes des registres du 68HC11 F1 * ********************************************************************************* ** variables RAM pour pour le controleur LASER RGB ** ********************************************************************************* ORG DEBRAM ; Début de la RAM DATA1 RMB 1 ; DATA2 RMB 1 ; CPLCD RMB 1 ; Compteur LCD DTLCD RMB 1 ; Data LCD ADRSCR RMB 2 ; Adresse de l'affichage en cours SCREEN RMB 80T ; Ecran stock‚ en RAM BCDC RMB 1 ; Compteur convertion BCD BCDC2 RMB 1 ; Valeur de stockage BCD BCDC3 RMB 1 ; Valeur des unit‚es BCD ALERTE RMB 1 CLAVIER RMB 1 LEDCF RMB 1 MENUC RMB 1 ENDSTAC EQU $C3 ; => fin de la pile ********************************************************************************* ORG DEBEEP ; => zone eeprom externe 28C256 * LDS #ENDSTAC ; Init de la pile * LDX #REGS ; REGISTRE * ********************************************************************************* ********************************************************************************* ** =========== INITIALISATIONS PRINCIPALES ================ ** ********************************************************************************* LDAA #%11111000 ; initialisation STAA DDRA,X ; Port A7->A3 en sortie / A0->02 en entr‚e CLRA ; SystŠme chip-select STAA CSCTL,X ; d‚sactiv‚ LDAA #$FF ; PG1 = Shutter STAA DDRG,X ; PORT G EN SORTIE STAA PORTG,X ; HC11:NO LASER PG1=1 / LCD OFF PG2&3=1 LDAA #%00111010 ; programmation DDRD STAA DDRD,X ; Initialisations port D série LDAA #%01010001 ; programmation du SPCR STAA SPCR,X LDAA SPSR,X ; LECTURE LDAA SPDR,X ; FICTIVE BCLR PORTD,X,PD5 ; CS/ = 0 BSET OPTION,X,ADPU ; Mise en marche convertisseur CAN CLR ALERTE ; Tout va bien! Pas de cloche LDAA #%10011001 ; STAA LEDCF ; ******************************************************************************** * ============ PROGRAMME PRINCIPAL ================ * ******************************************************************************** DEBUT LDY #TXTTMP ; Affichage ecran temperature JSR LCDRAM ; Copie dans l'espace ram SCREEN JSR KEYSW ; Sous programme du shutter JSR WAITI ; Sous programme : Attente * STAB PORTA,X ; Changement de l'etat des actuators LDAA DATA1 ; Data 1 contient la valeur moteur DC en % JSR DCMOT ; Changement DC MOT JSR TMPCPT ; sous programme temperature JSR TSTSHB ; Affichage BEAM et BUZZER JSR CLOCHE ; SSProg : Affichage CLOCHE et ALERTE BUZZER JSR KEYBDR LDAA CLAVIER ; #### LDY #SCREEN ; #### STAA 18T,Y LDY #SCREEN ; Affichage de l'ecran en RAM STY ADRSCR ; Adresse de celui ci JSR LCDSD ; dans ADRSCR JMP DEBUT ******************************************************************************** * ============ SOUS PROGRAMMES ================ * ******************************************************************************** * SOUS PROGRAMME LECTURE CLAVIER * ******************************************************************************** KEYBDR LDAA PORTE,X ASRA ASRA ASRA ASRA ADDA #$40 STAA CLAVIER RTS ******************************************************************************** * SOUS PROGRAMME GESTION DE LA CLOCHE ET BUZZER * ******************************************************************************** CLOCHE TST ALERTE ; Test si RAM ALERTE = 0 BEQ CLCOK ; Si oui alors pas d'alerte LDY #SCREEN ; Si non affichage LDAA #$04 ; de la cloche STAA 19T,Y ; en son emplacement BSET PORTA,X,PA6 ; buzzer on RTS CLCOK BCLR PORTA,X,PA6 ; Buzzer off 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 ; ###### BAISSER VALEUR FINALE LDY #$8FFF ; WAITI1: JMP WAITI2 ; WAITI2: DEY ; BNE WAITI1 ; PULY ; RTS ; ******************************************************************************** * AFFICHAGE BEAM SI PG1=0 / TEST SI SECU(PA0)=0 ALORS AFFICHAGE BUZZER ******************************************************************************** TSTSHB BRSET PORTA,X,PA0,BOF ; SI PA0=1 Alors Scan safe = OK LDY #SCREEN ; Chargement adresse ecran RAM LDAA #' ' ; Comme PA0=0 Alors STAA 18T,Y ; Alerte venant de LDAA #10T ; La carte SCAN SAFE STAA ALERTE ; RAM ALERTE NON NUL BSET PORTG,X,PG1 ; PAR SECURITE DEMANDE SHUT ON / LASER OFF BOF BRSET PORTG,X,PG1,BOFF ; Test si Shutter ON ? LASER OFF ? LDAA #'-' ; Non alors Affichage LDY #SCREEN ; Du symbole laser STAA 15T,Y ; B LDAA #$06 ; E STAA 16T,Y ; A LDAA #$07 ; M STAA 17T,Y ; = LDAA #' ' ; O STAA $18T,Y ; N LDAA #' ' ; donc STAA $19T,Y ; Pas d'affichage alerte RTS ; Fin BOFF LDAA #'O' ; Laser OFF LDY #SCREEN ; BEAM STAA 15T,Y ; = LDAA #'F' ; O STAA 16T,Y ; F STAA 17T,Y ; F RTS ; fin ******************************************************************************** * ---- COPIE D'UN ECRAN EN EEPROM DANS LA RAM (ADRESSE SCREEN) ---- * * ACCUMULATEUR Y : ADRESSE DE L'ECRAN EN EEPROM * ******************************************************************************** LCDRAM PSHX ; sauvegarde de X LDAB #$51 ; Chargement compteur d'‚cran LDX #SCREEN ; X contient l'adresse de SCREEN en RAM DEX ; shift DEY ; shift PUTSCR LDAA 0,Y ; Chargement octet en EEPROM STAA 0,X ; Ecriture en RAM INX ; shift INY ; shift DECB ; preparation du compteur BNE PUTSCR ; boucle si pas fini PULX ; recup de X RTS ; fin du sous programme ******************************************************************************** * PROGRAMME D'ENVOIE SPI POUR L'AFFICHEUR LCD * * Espace RAM ADRSCR contient l'adresse de l'ecran a afficher * ******************************************************************************** LCDSD BCLR PORTG,X,PG2 ; Debut de la synchronisation PG2=0 LDAA #86T ; compteur d'‚cran STAA CPLCD ; Chargement du compteur LDY ADRSCR ; Chargement de l'adresse … afficher XGDY ; Echange D et Y SUBD #$5 ; shift XGDY ; Echange D et Y LCDS LDAA CPLCD ; Lecture compteur CMPA #82T ; test si <82? BLO LCDSO ; alors affichage LCD LDAA LEDCF ; Sinon affichage LED BRA LCDSP ; Saut Send LCDSO LDAA 0,Y ; Chargement octet … envoyer LCDSP LDAB SPSR,X ; LECTURE FICTIVE LDAB SPDR,X ; Flag SPIF : OK BCLR PORTG,X,PG3 ; Preparation chip select STAA SPDR,X ; chargement octet … envoyer BRCLR SPSR,X,SPIF,* ; Attente Send fini BSET PORTG,X,PG3 ; Fin de l'octet INY ; preparation prochain octet LDAA CPLCD ; charge compteur DECA ; STAA CPLCD ; CMPA #61T ; fin premiere ligne? BNE LCDS2 ; LDAB #20T ; ABY ; shift LCDS2 LDAA CPLCD ; CMPA #41T ; BNE LCDS3 ; XGDY ; SUBD #40T ; a soustraire XGDY LCDS3 LDAA CPLCD CMPA #21T ; fin 3 eme ligne? BNE LCDS4 ; LDAB #20T ; ABY ; shift LCDS4 LDAA CPLCD ; CMPA #$00 ; BNE LCDS ; si pas egal 0 on boucle JSR WAITI ; BSET PORTG,X,PG2 ; RTS ******************************************************************************** * PROGRAMME D'ENVOIE SPI POUR LE MOTEUR DC * * Accu A contient la dizaine de % de la vitesse maximum (1 à 10) * ******************************************************************************** DCMOT BSET PORTD,X,PD5 ; selection du DS1802 LDY #$E000 ; début DATABASE DCBCL CMPA #$01 ; compare A avec 1 BNE DCUP ; Saut si pas égal LDAA 0,Y ; résultat indéxé par rapport à Y STAA SPDR,X ; debut du send data BRCLR SPSR,X,SPIF,* ; terminé LDAB SPDR,X ; LECTURE FICTIVE STAA SPDR,X ; envoi de la seconde partie BRCLR SPSR,X,SPIF,* ; terminé? LDAB SPDR,X ; LECTURE FICTIVE BCLR PORTD,X,PD5 ; verrouillage du DS1802 RTS ; fin du sous programme DCUP INY ; octet suivant DECA ; préparation pour le test BRA DCBCL ; on reboucle ********************************************************************************* * PROGRAMME DE TEST DE L'INTERRUPTEUR A CLEF * ********************************************************************************* KEYSW BRSET PORTA,X,PA1,KYNK1 ; Si PA1=1 Alors LASER OFF BCLR PORTG,X,PG1 ; LASER ON PG1=0 RTS ; on continu le programme KYNK1 BSET PORTG,X,PG1 ; LASER OFF PG1=1 RTS ; on continu... ******************************************************************************** * SOUS PROGRAMME CONVERTION A/N CAPTEURS TEMPERATURES * ******************************************************************************** TMPCPT CLR ALERTE ; Ok temp?##### LDAA #%00010000 ; PE0 … PE3 => Entr‚e capteur temp STAA ADCTL,X ; Mult = 1 / Scan = 0 BRCLR ADCTL,X,$80,* ; Attente fin des conversions? CLR BCDC ; shift = 0 LDAA ADR1,X ; LEcture PA0 = RED STAA BCDC2 LDAB #100T CMPB BCDC2 BHI BCL LDY #SCREEN LDAA #'O' STAA 45T,Y LDAA #'V' STAA 46T,Y LDAA #'E' STAA 47T,Y LDAA #'R' STAA 48T,Y LDAA #10T ; ALERTE NON NUL CAR TEMPERATURE STAA ALERTE ; SUPERIEUR BRA TMPGRN BCL LDAA BCDC2 BCL1 STAA BCDC2 ; Sauvegarde valeur CAN LDAB #10T ; soustraction SBA ; de 10 CMPA #9T ; Inf‚rieur ou ‚gal … 9? BLS SUIT1 ; Alors comptage fini, => affichage LDAA BCDC INCA STAA BCDC LDAA BCDC2 LDAB #10T SBA STAA BCDC2 BRA BCL1 SUIT1 STAA BCDC3 LDY #$E011 SUITE LDAA BCDC BEQ UNITEE DECA STAA BCDC INY BRA SUITE UNITEE LDAA 0,Y LDY #SCREEN STAA 46T,Y LDAA BCDC3 ; Lecture des unit‚s restantes STAA BCDC LDY #$E010 ; debut tableau BCL2 LDAA BCDC ; Chargement compteur BEQ SUIT2 ; 0? alors fini INY ; Augmente de un.. DECA ; d‚cremente compteur STAA BCDC ; Nouvelle valeur compteur BRA BCL2 ; on reboucle SUIT2 LDAA 0,Y ; lecture unit‚es LDY #SCREEN ; adresse ecran STAA 47T,Y ; Sauvegarde position unit‚ TMPGRN CLR BCDC LDAA ADR2,X ; Lecture PA1 = GREEN STAA BCDC2 LDAB #100T CMPB BCDC2 BHI BCLG LDY #SCREEN LDAA #'O' STAA 56T,Y LDAA #'V' STAA 57T,Y LDAA #'E' STAA 58T,Y LDAA #'R' STAA 59T,Y LDAA #10T ; ALERTE NON NUL CAR TEMPERATURE STAA ALERTE ; SUPERIEUR BRA TMPBLU BCLG LDAA BCDC2 BCLG1 STAA BCDC2 ; Sauvegarde valeur CAN LDAB #10T ; soustraction SBA ; de 10 CMPA #9T ; Inf‚rieur ou ‚gal … 9? BLS SUITG1 ; Alors comptage fini, => affichage LDAA BCDC INCA STAA BCDC LDAA BCDC2 LDAB #10T SBA STAA BCDC2 BRA BCLG1 SUITG1 STAA BCDC3 LDY #$E011 SUITEG LDAA BCDC BEQ UNITEG DECA STAA BCDC INY BRA SUITEG UNITEG LDAA 0,Y LDY #SCREEN STAA 57T,Y LDAA BCDC3 ; Lecture des unit‚s restantes STAA BCDC LDY #$E010 ; debut tableau BCLG2 LDAA BCDC ; Chargement compteur BEQ SUITG2 ; 0? alors fini INY ; Augmente de un.. DECA ; d‚cremente compteur STAA BCDC ; Nouvelle valeur compteur BRA BCLG2 ; on reboucle SUITG2 LDAA 0,Y ; lecture unit‚es LDY #SCREEN ; adresse ecran STAA 58T,Y ; Sauvegarde position unit‚ TMPBLU CLR BCDC LDAA ADR3,X ; Lecture PA3 = BLUE LASER STAA BCDC2 LDAB #100T CMPB BCDC2 BHI BCLB LDY #SCREEN LDAA #'O' STAA 65T,Y LDAA #'V' STAA 66T,Y LDAA #'E' STAA 67T,Y LDAA #'R' STAA 68T,Y LDAA #10T ; ALERTE NON NUL CAR TEMPERATURE STAA ALERTE ; SUPERIEUR BRA TMPPOW BCLB LDAA BCDC2 BCLB1 STAA BCDC2 ; Sauvegarde valeur CAN LDAB #10T ; soustraction SBA ; de 10 CMPA #9T ; Inf‚rieur ou ‚gal … 9? BLS SUITB1 ; Alors comptage fini, => affichage LDAA BCDC INCA STAA BCDC LDAA BCDC2 LDAB #10T SBA STAA BCDC2 BRA BCLB1 SUITB1 STAA BCDC3 LDY #$E011 SUITEB LDAA BCDC BEQ UNITEB DECA STAA BCDC INY BRA SUITEB UNITEB LDAA 0,Y LDY #SCREEN STAA 66T,Y LDAA BCDC3 ; Lecture des unit‚s restantes STAA BCDC LDY #$E010 ; debut tableau BCLB2 LDAA BCDC ; Chargement compteur BEQ SUITB2 ; 0? alors fini INY ; Augmente de un.. DECA ; d‚cremente compteur STAA BCDC ; Nouvelle valeur compteur BRA BCLB2 ; on reboucle SUITB2 LDAA 0,Y ; lecture unit‚es LDY #SCREEN ; adresse ecran STAA 67T,Y ; Sauvegarde position unit‚ TMPPOW CLR BCDC LDAA ADR4,X ; Lecture PA4 = POWER SUPPLY STAA BCDC2 LDAB #100T CMPB BCDC2 BHI BCLP LDY #SCREEN LDAA #'O' STAA 76T,Y LDAA #'V' STAA 77T,Y LDAA #'E' STAA 78T,Y LDAA #'R' STAA 79T,Y LDAA #10T ; ALERTE NON NUL CAR TEMPERATURE STAA ALERTE ; SUPERIEUR RTS BCLP LDAA BCDC2 BCLP1 STAA BCDC2 ; Sauvegarde valeur CAN LDAB #10T ; soustraction SBA ; de 10 CMPA #9T ; Inf‚rieur ou ‚gal … 9? BLS SUITP1 ; Alors comptage fini, => affichage LDAA BCDC INCA STAA BCDC LDAA BCDC2 LDAB #10T SBA STAA BCDC2 BRA BCLP1 SUITP1 STAA BCDC3 LDY #$E011 SUITEP LDAA BCDC BEQ UNITEP DECA STAA BCDC INY BRA SUITEP UNITEP LDAA 0,Y LDY #SCREEN STAA 77T,Y LDAA BCDC3 ; Lecture des unit‚s restantes STAA BCDC LDY #$E010 ; debut tableau BCLP2 LDAA BCDC ; Chargement compteur BEQ SUITP2 ; 0? alors fini INY ; Augmente de un.. DECA ; d‚cremente compteur STAA BCDC ; Nouvelle valeur compteur BRA BCLP2 ; on reboucle SUITP2 LDAA 0,Y ; lecture unit‚es LDY #SCREEN ; adresse ecran STAA 78T,Y ; Sauvegarde position unit‚ RTS ********************************************************************************* * ============ DONNEES POUR LE PROGRAMME ================ * ********************************************************************************* ORG $E000 ; 8ko jusque la fin pour data FCB %11111100 ; $E000 = Moteur DC 10% FCB %11101100 ; $E001 = Moteur DC 20% FCB %10001100 ; $E002 = Moteur DC 30% FCB %11010100 ; $E003 = Moteur DC 40% FCB %10100100 ; $E004 = Moteur DC 50% FCB %11111000 ; $E005 = Moteur DC 60% FCB %10011000 ; $E006 = Moteur DC 70% FCB %11001000 ; $E007 = Moteur DC 80% FCB %10110000 ; $E008 = Moteur DC 90% FCB %01100000 ; $E009 = Moteur DC 100% ORG $E010 ; Table de comptage 1 … 10 TABLE FCB '0' FCB '1' FCB '2' FCB '3' FCB '4' FCB '5' FCB '6' FCB '7' FCB '8' FCB '9' ******************************************************************************** * ============ DONNEES POUR LE PROGRAMME ================ * *****************12345678901234567890******************************************* ORG $E100 ; Debut data texte TEXT1 FCB ' RGB Laser System ' ; Ligne 1 FCB 'Version 2.1 May 2007' ; Ligne 2 FCB '~ Copyright Tek-Man ' ; Ligne 3 FCB ' www.laser-maker.fr ' ; Ligne 4 TEXT2 FCB '! Go to the followed' FCB 'Web site for infos: ' FCB ' www.laser-maker.com' FCB ' ' TXTTMP FCB 'RGB LASER|beam: ' FCB '---------' FCB $03 FCB 'Temp. Menu' FCB 'Red : ' FCB $05 FCB ' Green: ' FCB $05 FCB 'Blue: ' FCB $05 FCB ' Power: ' FCB $05 ******************************************************************************** * ============ VECTEURS D'INTERUPTIONS ================ * ******************************************************************************** ORG $FFFE FDB DEBEEP ; reset END