--- C:\Documents and Settings\phnor\Mes documents\pic18F.c ------------------------------------- 1: #include "p18f4420.h" 2: //#include 3: 4: typedef enum 5: { 6: STOP, 7: AVANCE, 8: RECULE, 9: DROITE, 10: GAUCHE 11: } type_mouvement; 12: 13: void traiteIT(void); 14: void start_ADC(unsigned char x); 15: void sleep(unsigned char dS); 16: void levage(); 17: void tourner(unsigned int degre, type_mouvement droite_gauche); 18: void avancer(unsigned int distance, type_mouvement avancer_reculer);//1000=49cm 19: 20: 21: //pas de watchdog 22: #pragma config WDT = OFF 23: //osciliateur interne sans clk out 24: #pragma config OSC = INTIO67 25: //pas de programmation bas tension 26: #pragma config LVP = OFF 27: //pas de port reset 28: #pragma config MCLRE = OFF 29: //jeux d'instruction avancé 30: #pragma config XINST = ON 31: 32: #define DIGIT_OFF 0x00 33: 34: #define MOTEUR_OFF 0x2A 35: //101010 36: #define VAL_MAX_PWM 10 37: 38: ///PORT 39: #define DIGIT_1_2 PORTDbits.RD7 40: #define ELECTRO_AIMENT PORTDbits.RD6 41: #define TREUILLE PORTAbits.RA6 42: #define PORTE PORTAbits.RA7 43: #define AFFICHEUR PORTB 44: #define MULTI_CAPTEUR_1 PORTAbits.RA4 45: #define MULTI_CAPTEUR_2 PORTAbits.RA5 46: #define INTERRUPTEUR_1 PORTEbits.RE2 47: #define INTERRUPTEUR_2 PORTEbits.RE3 48: 49: ///CAPTEUR 50: #define CAPTEUR_HAUT_GRUE 0 51: #define CAPTEUR_POID_GRUE 1 52: 53: //valeur à partir de la quelle un capteur est estimé comme désactivé 54: #define VAL_CAPTEUR_OFF 100 55: 56: //nombre de pas sur les moteurs pour faire 1cm 57: #define NB_PAS_CM 20 58: 59: ///servo 60: //vitesse treuille 61: #define VITESSE_MONTER 17 62: #define VITESSE_STOP 21 63: #define VITESSE_DECENTE 25 64: //position porte 65: #define POSITION_OUVERT 27 66: #define POSITION_FERME 13 67: 68: 69: unsigned char digit[0x10]={0xD7,0x11,0xE5,0x75,0x33,0x76,0xF6,0x15,0xF7,0x77,0xB7,0xF2,0xC6,0xF1,0xE6,0xA6}; 70: unsigned char tab_pas[12]={0x32,0x23,0x0B,0x0E,0X2C,0x38}; 71: /* 110010 72: 100011 73: 001011 74: 001110 75: 101100 76: 111000*/ 77: 78: unsigned char position_porte=POSITION_FERME; 79: unsigned char vitesse_treuille=VITESSE_STOP; 80: unsigned char temps_pas=250; 81: unsigned char val_pwm=3; 82: unsigned int compte_pas=0; 83: unsigned char afficheur_1=0,afficheur_2=0; 84: 85: type_mouvement mouvement=STOP; 86: 87: 88: void main(void) 89: { 90: static unsigned char l,l3,l4; 91: static unsigned char l2; 92: 93: ELECTRO_AIMENT=0; 0038 9C83 BCF 0xf83, 0x6, ACCESS 94: 95: OSCCON|=0x7<<4; //oscillalteur a 8 MHz 003A 0E70 MOVLW 0x70 003C 12D3 IORWF 0xfd3, F, ACCESS 96: OSCTUNEbits.PLLEN=1; //active le multiplicateur de frequance 32MHz 003E 8C9B BSF 0xf9b, 0x6, ACCESS 97: TRISA=0x0F; //port 0 a 3 en entrés (capteur= 4-5 control du multiplexeur) 6-7 comandes servos 0040 0E0F MOVLW 0xf 0042 6E92 MOVWF 0xf92, ACCESS 98: TRISB=0x00; //active le portB en sortie 0044 6A93 CLRF 0xf93, ACCESS 99: TRISD=0x00; //active le portD en sortie //moteur 2 + electro aiment + multiplexsage aficheur 0046 6A95 CLRF 0xf95, ACCESS 100: TRISC=0x80; //active le portD en sortie saufe rx //moteur 1 + uart 0048 0E80 MOVLW 0x80 004A 6E94 MOVWF 0xf94, ACCESS 101: 102: ADCON0=0x01; //configure le convertiseur annalogique digital avec l'entré 0. alumer convertiseur 004C 0E01 MOVLW 0x1 004E 6EC2 MOVWF 0xfc2, ACCESS 103: ADCON1=0x0B; //entre 0,1,2,3 en entré analogique 0050 0E0B MOVLW 0xb 0052 6EC1 MOVWF 0xfc1, ACCESS 104: ADCON2=0x02; //fréquance du convertiseur = f/32 0054 0E02 MOVLW 0x2 0056 6EC0 MOVWF 0xfc0, ACCESS 105: 106: //timer 0 en 8 bit clock interne/2 107: //f interruption 7812.5 Hz 108: T0CONbits.TMR0ON=0;//désactive le timer 0 0058 9ED5 BCF 0xfd5, 0x7, ACCESS 109: INTCONbits.GIE=1; INTCONbits.PEIE=1; //autorise les interruption 005A 8EF2 BSF 0xff2, 0x7, ACCESS 005C 8CF2 BSF 0xff2, 0x6, ACCESS 110: TMR0L=0; //le timer 0 commence a 0 005E 6AD6 CLRF 0xfd6, ACCESS 111: T0CONbits.T0CS=0; //clock interne 0060 9AD5 BCF 0xfd5, 0x5, ACCESS 112: T0CONbits.PSA=0; //prescaler actif 0062 96D5 BCF 0xfd5, 0x3, ACCESS 113: T0CONbits.T0PS0=0; //prescaler /2 0064 90D5 BCF 0xfd5, 0, ACCESS 114: T0CONbits.T0PS1=0; 0066 92D5 BCF 0xfd5, 0x1, ACCESS 115: T0CONbits.T0PS2=0; 0068 94D5 BCF 0xfd5, 0x2, ACCESS 116: INTCONbits.TMR0IE=1; //active l'interuption du timer 0 006A 8AF2 BSF 0xff2, 0x5, ACCESS 117: T0CONbits.TMR0ON=1;//réactive le timer0 006C 8ED5 BSF 0xfd5, 0x7, ACCESS 118: 119: l2=0; 006E 0100 MOVLB 0 0070 6BB9 CLRF 0xb9, BANKED 120: while(1) 0090 D7F0 BRA 0x72 121: { 122: sleep(10); 0072 0E0A MOVLW 0xa 0074 6EE6 MOVWF 0xfe6, ACCESS 0076 D8F9 RCALL 0x26a 0078 52E5 MOVF 0xfe5, F, ACCESS 123: tourner((unsigned int)5,DROITE); 007A 0E03 MOVLW 0x3 007C 6EE6 MOVWF 0xfe6, ACCESS 007E 0E05 MOVLW 0x5 0080 6EE6 MOVWF 0xfe6, ACCESS 0082 6AE6 CLRF 0xfe6, ACCESS 0084 D85E RCALL 0x142 0086 52E5 MOVF 0xfe5, F, ACCESS 0088 52E5 MOVF 0xfe5, F, ACCESS 008A 52E5 MOVF 0xfe5, F, ACCESS 124: //levage(); 125: 126: while(INTERRUPTEUR_1); 008C B484 BTFSC 0xf84, 0x2, ACCESS 008E D7FE BRA 0x8c 127: 128: } 129: } 0092 0012 RETURN 0 130: 131: void levage() 132: { 133: vitesse_treuille=VITESSE_DECENTE; 0094 0100 MOVLB 0 0096 0E19 MOVLW 0x19 0098 6F9D MOVWF 0x9d, BANKED 134: 135: sleep(2); //0.2 seconde 009A 0E02 MOVLW 0x2 009C 6EE6 MOVWF 0xfe6, ACCESS 009E D8E5 RCALL 0x26a 00A0 52E5 MOVF 0xfe5, F, ACCESS 136: do 137: { 138: start_ADC(CAPTEUR_POID_GRUE); //mesure du capteur de poids 00A2 0E01 MOVLW 0x1 00A4 6EE6 MOVWF 0xfe6, ACCESS 00A6 D8BC RCALL 0x220 00A8 52E5 MOVF 0xfe5, F, ACCESS 139: while(ADCON0bits.GO_DONE); 00AA B2C2 BTFSC 0xfc2, 0x1, ACCESS 00AC D7FE BRA 0xaa 140: afficheur_1=digit[ADRESH>>4]; 00AE 38C4 SWAPF 0xfc4, W, ACCESS 00B0 0B0F ANDLW 0xf 00B2 6AEA CLRF 0xfea, ACCESS 00B4 0F80 ADDLW 0x80 00B6 6EE9 MOVWF 0xfe9, ACCESS 00B8 0E00 MOVLW 0 00BA 22EA ADDWFC 0xfea, F, ACCESS 00BC CFEF MOVFF 0xfef, 0xa2 00BE F0A2 NOP 141: afficheur_2=digit[ADRESH&0x0F]; 00C0 0E0F MOVLW 0xf 00C2 14C4 ANDWF 0xfc4, W, ACCESS 00C4 6AEA CLRF 0xfea, ACCESS 00C6 0F80 ADDLW 0x80 00C8 6EE9 MOVWF 0xfe9, ACCESS 00CA 0E00 MOVLW 0 00CC 22EA ADDWFC 0xfea, F, ACCESS 00CE CFEF MOVFF 0xfef, 0xa3 00D0 F0A3 NOP 142: 143: }while(ADRESH>VAL_CAPTEUR_OFF); //si le capteur est enclanché 00D2 50C4 MOVF 0xfc4, W, ACCESS 00D4 0864 SUBLW 0x64 00D6 E3E5 BNC 0xa2 144: 145: ///ouvre les porte et monte le bloque 146: position_porte=POSITION_OUVERT; 00D8 0100 MOVLB 0 00DA 0E1B MOVLW 0x1b 00DC 6F9C MOVWF 0x9c, BANKED 147: vitesse_treuille=VITESSE_MONTER; 00DE 0E11 MOVLW 0x11 00E0 6F9D MOVWF 0x9d, BANKED 148: do 149: { 150: start_ADC(CAPTEUR_HAUT_GRUE); 00E2 6AE6 CLRF 0xfe6, ACCESS 00E4 D89D RCALL 0x220 00E6 52E5 MOVF 0xfe5, F, ACCESS 151: while(ADCON0bits.GO_DONE); 00E8 B2C2 BTFSC 0xfc2, 0x1, ACCESS 00EA D7FE BRA 0xe8 152: afficheur_1=digit[ADRESH>>4]; 00EC 38C4 SWAPF 0xfc4, W, ACCESS 00EE 0B0F ANDLW 0xf 00F0 6AEA CLRF 0xfea, ACCESS 00F2 0F80 ADDLW 0x80 00F4 6EE9 MOVWF 0xfe9, ACCESS 00F6 0E00 MOVLW 0 00F8 22EA ADDWFC 0xfea, F, ACCESS 00FA CFEF MOVFF 0xfef, 0xa2 00FC F0A2 NOP 153: afficheur_2=digit[ADRESH&0x0F]; 00FE 0E0F MOVLW 0xf 0100 14C4 ANDWF 0xfc4, W, ACCESS 0102 6AEA CLRF 0xfea, ACCESS 0104 0F80 ADDLW 0x80 0106 6EE9 MOVWF 0xfe9, ACCESS 0108 0E00 MOVLW 0 010A 22EA ADDWFC 0xfea, F, ACCESS 010C CFEF MOVFF 0xfef, 0xa3 010E F0A3 NOP 154: 155: }while(ADRESH>VAL_CAPTEUR_OFF); 0110 50C4 MOVF 0xfc4, W, ACCESS 0112 0864 SUBLW 0x64 0114 E3E6 BNC 0xe2 156: 157: vitesse_treuille=VITESSE_STOP; 0116 0100 MOVLB 0 0118 0E15 MOVLW 0x15 011A 6F9D MOVWF 0x9d, BANKED 158: afficheur_1=digit[vitesse_treuille>>4]; 011C 399D SWAPF 0x9d, W, BANKED 011E 0B0F ANDLW 0xf 0120 6AEA CLRF 0xfea, ACCESS 0122 0F80 ADDLW 0x80 0124 6EE9 MOVWF 0xfe9, ACCESS 0126 0E00 MOVLW 0 0128 22EA ADDWFC 0xfea, F, ACCESS 012A CFEF MOVFF 0xfef, 0xa2 012C F0A2 NOP 159: afficheur_2=digit[vitesse_treuille&0x0F]; 012E 0E0F MOVLW 0xf 0130 159D ANDWF 0x9d, W, BANKED 0132 6AEA CLRF 0xfea, ACCESS 0134 0F80 ADDLW 0x80 0136 6EE9 MOVWF 0xfe9, ACCESS 0138 0E00 MOVLW 0 013A 22EA ADDWFC 0xfea, F, ACCESS 013C CFEF MOVFF 0xfef, 0xa3 013E F0A3 NOP 160: } 0140 0012 RETURN 0 161: 162: void tourner(unsigned int degre,type_mouvement droite_gauche) 0142 CFD9 MOVFF 0xfd9, 0xfe6 0144 FFE6 NOP 0146 CFE1 MOVFF 0xfe1, 0xfd9 0148 FFD9 NOP 163: { 164: degre*=23; 014A 50D9 MOVF 0xfd9, W, ACCESS 014C 0FFD ADDLW 0xfd 014E 6EE9 MOVWF 0xfe9, ACCESS 0150 0EFF MOVLW 0xff 0152 20DA ADDWFC 0xfda, W, ACCESS 0154 6EEA MOVWF 0xfea, ACCESS 0156 0E17 MOVLW 0x17 0158 02EC MULWF 0xfec, ACCESS 015A CFF3 MOVFF 0xff3, 0xfed 015C FFED NOP 015E 02EF MULWF 0xfef, ACCESS 0160 CFF3 MOVFF 0xff3, 0xfee 0162 FFEE NOP 0164 50F4 MOVF 0xff4, W, ACCESS 0166 26ED ADDWF 0xfed, F, ACCESS 165: degre=degre>>4; 0168 0EFD MOVLW 0xfd 016A CFDB MOVFF 0xfdb, 0x2 016C F002 NOP 016E 0EFE MOVLW 0xfe 0170 CFDB MOVFF 0xfdb, 0x3 0172 F003 NOP 0174 0E04 MOVLW 0x4 0176 90D8 BCF 0xfd8, 0, ACCESS 0178 3203 RRCF [0x3], F 017A 3202 RRCF [0x2], F 017C 04E8 DECF 0xfe8, W, ACCESS 017E E1FB BNZ 0x176 0180 0EFD MOVLW 0xfd 0182 C002 MOVFF 0x2, 0xfdb 0184 FFDB NOP 0186 0EFE MOVLW 0xfe 0188 C003 MOVFF 0x3, 0xfdb 018A FFDB NOP 166: afficheur_1=dig