; "Générateur de signaux (continu, sinus, triangle, rectangle, rampe)" ; (C) Fabrice Sincère, mars 2007 ; IUT Nancy-Brabois ; version 1.03 ; microcontrôleur PIC 16F628A ; développé avec Microchip MPLAB IDE List p=16F628A ; processeur utilisé #include __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _DATA_CP_OFF & _BOREN_OFF & _MCLRE_ON ;bits de configuration : ;code protect OFF ;watchdog timer OFF ;power up timer ON ;oscillateur HS (quartz 20 MHz) ;low voltage program OFF ;data EE read protect OFF ;brown out detect OFF ;master clear enable ON ;xxxxxx ; macro ;xxxxxx bank1 macro ; passage en banque 1 bsf STATUS,RP0 bcf STATUS,RP1 endm bank0 macro ; passage en banque 0 bcf STATUS,RP0 bcf STATUS,RP1 endm ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Initialisation de la mémoire EEPROM (facultatif) ; Cela met dans l'EEPROM le message : ; (C) Fabrice Sincere 17/03/2007 (en code ASCII) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x2100 ; début de zone EEPROM du PIC DE '(' ; ou DE 0x28 (code ASCII correspondant) DE 'C' DE ')' DE 'F' ,'a' ,'b','r','i','c','e',' ' DE 'S','i','n','c','e','r','e',' ' DE '1','7','/','0','3','/','2','0','0','7' ;xxxxxxxxxxxxxxxxxxxxxxxxx ; déclaration de variables ;xxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK H'020' ; début de la zone des registres d'usage général du 16F628A formeSIGNAL : 1 ; bit0 = 1 <=> créneau ; bit1 = 1 <=> triangle ; bit2 = 1 <=> sinus ; bit3 = 1 <=> rampe ; (formeSIGNAL) = 0 <=> continu (par défaut) ENDC ;xxxxxxxxxxxxxxxxxxxx ; démarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org 0x0000 goto initialisation ;xxxxxxxxxxxxxxx ; initialisation ;xxxxxxxxxxxxxxx initialisation bank0 clrf PORTA ; mise à 0 des sorties du port A clrf PORTB ; mise à 0 des sorties du port B movlw B'00000111' movwf CMCON ; inactivation des comparateurs analogiques bank1 movlw B'10101000' movwf OPTION_REG ; bit 7 (/RBPU) = 1 : désactivation des résistances de pull-up du port B ; bit 6 (INTEDG)= 0 : (non utilisé) ; bit 5 (T0CS) = 1 : horloge du module TMR0 -> RA4/T0CKI (mode compteur) ; bit 4 (T0SE) = 0 : horloge RA4/T0CKI active sur front montant ; bit 3 (PSA) = 1 : prescaler 1:1 ; bit 2 (PS2)= 0 ; bit 1 (PS1) = 0 ; bit 0 (PS0) = 0 movlw B'00011111' movwf TRISA ; bit 0 du port A (RA0) = 1 : configuration en entrée (bouton poussoir CRENEAU) ; bit 1 du port A (RA1) = 1 : configuration en entrée (bouton poussoir TRIANGLE) ; bit 2 du port A (RA2) = 1 : configuration en entrée (bouton poussoir SINUS) ; bit 3 du port A (RA3) = 1 : configuration en entrée (bouton poussoir RAMPE) ; bit 4 du port A (RA4) = 1 : configuration en entrée (oscillateur externe) clrf TRISB ; bit 0 du port B (RB0) = 0 : configuration en sortie (bit 0 (LSB) du DAC 8 bits) ; bit 1 du port B (RB1) = 0 : configuration en sortie (bit 1 du DAC 8 bits) ; bit 2 du port B (RB2) = 0 : configuration en sortie (bit 2 du DAC 8 bits) ; bit 3 du port B (RB3) = 0 : configuration en sortie (bit 3 du DAC 8 bits) ; bit 4 du port B (RB4) = 0 : configuration en sortie (bit 4 du DAC 8 bits) ; bit 5 du port B (RB5) = 0 : configuration en sortie (bit 5 du DAC 8 bits) ; bit 6 du port B (RB6) = 0 : configuration en sortie (bit 6 du DAC 8 bits) ; bit 7 du port B (RB7) = 0 : configuration en sortie (bit 7 (MSB) du DAC 8 bits) bank0 clrf formeSIGNAL movlw B'10000000' movwf PORTB ; uS(U4) = 0 V (sortie du DAC) goto debut_programme ;xxxxxxxxxxxxxxxxxxxxx ; programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme ; xxxxxxxxxx test des 4 boutons poussoirs call test_changement addlw B'00000000' btfsc STATUS , Z goto debut_programme ; boutons poussoirs au repos (W)=0 ; on arrive ici si un des boutons poussoirs est appuyé clrf TMR0 btfsc formeSIGNAL , 0 goto formeCRENEAU btfsc formeSIGNAL , 1 goto formeTRIANGLE btfsc formeSIGNAL , 2 goto formeSINUS btfsc formeSIGNAL , 3 goto formeRAMPE goto formeDC ; par précaution ; xxxxxxxxxxxxxxxxxxxxxx ; forme continue formeDC goto formeDC ; xxxxxxxxxxxxxxxxxxxxxx ; forme en créneau formeCRENEAU movlw D'255' btfss TMR0 , 6 clrw ; 0 =< TMR0 <= 63 ou 128 =< TMR0 <= 255 movwf PORTB goto formeCRENEAU ; xxxxxxxxxxxxxxxxxxxxxx ; forme en triangle formeTRIANGLE movlw 0x03 movwf PCLATH formeTRIANGLE0 movlw B'01111111' ; masque andwf TMR0 , W ; on met à 0 le bit 7 (car la table a 128 éléments) call table_triangle movwf PORTB ; écriture en entrée du DAC goto formeTRIANGLE0 ; xxxxxxxxxxxxxxxxxxxxxx ; forme en sinus formeSINUS movlw 0x02 movwf PCLATH formeSINUS0 movlw B'01111111' andwf TMR0 , W ; on met à 0 le bit 7 call table_sinus movwf PORTB goto formeSINUS0 ; xxxxxxxxxxxxxxxxxxxxxx ; forme en rampe formeRAMPE movlw 0x01 movwf PCLATH formeRAMPE0 movlw B'01111111' andwf TMR0 , W ; on met à 0 le bit 7 call table_rampe movwf PORTB goto formeRAMPE0 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine de test des boutons poussoirs ; Retourne 0 si tous les boutons poussoirs sont au repos ; Retourne 1 si au moins un bouton poussoir est appuyé ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx test_changement btfsc PORTA,0 goto test_bp_triangle bsf formeSIGNAL , 0 retlw D'1' test_bp_triangle btfsc PORTA,1 goto test_bp_sinus bsf formeSIGNAL , 1 retlw D'1' test_bp_sinus btfsc PORTA,2 goto test_bp_rampe bsf formeSIGNAL , 2 retlw D'1' test_bp_rampe btfsc PORTA,3 retlw D'0' ; tous les boutons poussoirs sont au repos bsf formeSIGNAL , 3 retlw D'1' ; xxxxxxxx table rampe xxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x0100 ; adresse de début de la table table_rampe addwf PCL , f retlw D'255' retlw D'253' retlw D'251' retlw D'249' retlw D'247' retlw D'245' retlw D'243' retlw D'241' retlw D'239' retlw D'237' retlw D'235' retlw D'233' retlw D'231' retlw D'229' retlw D'227' retlw D'225' retlw D'223' retlw D'221' retlw D'219' retlw D'217' retlw D'215' retlw D'213' retlw D'211' retlw D'209' retlw D'207' retlw D'205' retlw D'203' retlw D'201' retlw D'199' retlw D'197' retlw D'195' retlw D'193' retlw D'191' retlw D'189' retlw D'187' retlw D'185' retlw D'183' retlw D'181' retlw D'179' retlw D'177' retlw D'175' retlw D'173' retlw D'171' retlw D'169' retlw D'167' retlw D'165' retlw D'163' retlw D'161' retlw D'159' retlw D'157' retlw D'155' retlw D'153' retlw D'151' retlw D'149' retlw D'147' retlw D'145' retlw D'143' retlw D'141' retlw D'139' retlw D'137' retlw D'135' retlw D'133' retlw D'131' retlw D'129' retlw D'126' retlw D'124' retlw D'122' retlw D'120' retlw D'118' retlw D'116' retlw D'114' retlw D'112' retlw D'110' retlw D'108' retlw D'106' retlw D'104' retlw D'102' retlw D'100' retlw D'98' retlw D'96' retlw D'94' retlw D'92' retlw D'90' retlw D'88' retlw D'86' retlw D'84' retlw D'82' retlw D'80' retlw D'78' retlw D'76' retlw D'74' retlw D'72' retlw D'70' retlw D'68' retlw D'66' retlw D'64' retlw D'62' retlw D'60' retlw D'58' retlw D'56' retlw D'54' retlw D'52' retlw D'50' retlw D'48' retlw D'46' retlw D'44' retlw D'42' retlw D'40' retlw D'38' retlw D'36' retlw D'34' retlw D'32' retlw D'30' retlw D'28' retlw D'26' retlw D'24' retlw D'22' retlw D'20' retlw D'18' retlw D'16' retlw D'14' retlw D'12' retlw D'10' retlw D'8' retlw D'6' retlw D'4' retlw D'2' retlw D'0' ; xxxxxxxx table sinus xxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x0200 ; adresse de début de la table table_sinus addwf PCL , f retlw D'128' retlw D'134' retlw D'140' retlw D'146' retlw D'152' retlw D'158' retlw D'165' retlw D'170' retlw D'176' retlw D'182' retlw D'188' retlw D'193' retlw D'198' retlw D'203' retlw D'208' retlw D'213' retlw D'218' retlw D'222' retlw D'226' retlw D'230' retlw D'234' retlw D'237' retlw D'240' retlw D'243' retlw D'245' retlw D'248' retlw D'250' retlw D'251' retlw D'253' retlw D'254' retlw D'254' retlw D'255' retlw D'255' retlw D'255' retlw D'254' retlw D'254' retlw D'253' retlw D'251' retlw D'250' retlw D'248' retlw D'245' retlw D'243' retlw D'240' retlw D'237' retlw D'234' retlw D'230' retlw D'226' retlw D'222' retlw D'218' retlw D'213' retlw D'208' retlw D'203' retlw D'198' retlw D'193' retlw D'188' retlw D'182' retlw D'176' retlw D'170' retlw D'165' retlw D'158' retlw D'152' retlw D'146' retlw D'140' retlw D'134' retlw D'128' retlw D'121' retlw D'115' retlw D'109' retlw D'103' retlw D'97' retlw D'90' retlw D'85' retlw D'79' retlw D'73' retlw D'67' retlw D'62' retlw D'57' retlw D'52' retlw D'47' retlw D'42' retlw D'37' retlw D'33' retlw D'29' retlw D'25' retlw D'21' retlw D'18' retlw D'15' retlw D'12' retlw D'10' retlw D'7' retlw D'5' retlw D'4' retlw D'2' retlw D'1' retlw D'1' retlw D'0' retlw D'0' retlw D'0' retlw D'1' retlw D'1' retlw D'2' retlw D'4' retlw D'5' retlw D'7' retlw D'10' retlw D'12' retlw D'15' retlw D'18' retlw D'21' retlw D'25' retlw D'29' retlw D'33' retlw D'37' retlw D'42' retlw D'47' retlw D'52' retlw D'57' retlw D'62' retlw D'67' retlw D'73' retlw D'79' retlw D'85' retlw D'90' retlw D'97' retlw D'103' retlw D'109' retlw D'115' retlw D'121' ; xxxxxxxx table triangle xxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x0300 ; adresse de début de la table table_triangle addwf PCL , f retlw D'255' retlw D'251' retlw D'247' retlw D'243' retlw D'239' retlw D'235' retlw D'231' retlw D'227' retlw D'223' retlw D'219' retlw D'215' retlw D'211' retlw D'207' retlw D'203' retlw D'199' retlw D'195' retlw D'191' retlw D'187' retlw D'183' retlw D'179' retlw D'175' retlw D'171' retlw D'167' retlw D'163' retlw D'159' retlw D'155' retlw D'151' retlw D'147' retlw D'143' retlw D'139' retlw D'135' retlw D'131' retlw D'128' retlw D'124' retlw D'120' retlw D'116' retlw D'112' retlw D'108' retlw D'104' retlw D'100' retlw D'96' retlw D'92' retlw D'88' retlw D'84' retlw D'80' retlw D'76' retlw D'72' retlw D'68' retlw D'64' retlw D'60' retlw D'56' retlw D'52' retlw D'48' retlw D'44' retlw D'40' retlw D'36' retlw D'32' retlw D'28' retlw D'24' retlw D'20' retlw D'16' retlw D'12' retlw D'8' retlw D'4' retlw D'0' retlw D'4' retlw D'8' retlw D'12' retlw D'16' retlw D'20' retlw D'24' retlw D'28' retlw D'32' retlw D'36' retlw D'40' retlw D'44' retlw D'48' retlw D'52' retlw D'56' retlw D'60' retlw D'64' retlw D'68' retlw D'72' retlw D'76' retlw D'80' retlw D'84' retlw D'88' retlw D'92' retlw D'96' retlw D'100' retlw D'104' retlw D'108' retlw D'112' retlw D'116' retlw D'120' retlw D'124' retlw D'128' retlw D'131' retlw D'135' retlw D'139' retlw D'143' retlw D'147' retlw D'151' retlw D'155' retlw D'159' retlw D'163' retlw D'167' retlw D'171' retlw D'175' retlw D'179' retlw D'183' retlw D'187' retlw D'191' retlw D'195' retlw D'199' retlw D'203' retlw D'207' retlw D'211' retlw D'215' retlw D'219' retlw D'223' retlw D'227' retlw D'231' retlw D'235' retlw D'239' retlw D'243' retlw D'247' retlw D'251' END