/* Electronica IV * Projecto de Elevador * Controlo de um motor DC atraves de um pic16f877 da microchip * * Helder Cabrita 27470 & Jose Pereira 28102 * * * programa de configuracao do pic com os portos a funcionarem da forma projectada * filename: CONFIG.C * version 4.0 @ 21.04.2006 20.42 * */ #include #include "config.h" #include "pwm.h" #include "motor.h" #include "const.h" #include "serial.h" #include "lcd.h" extern bank1 int posact; extern bank1 int posant; extern bank2 char pc; void configPorts(void) { PCFG3=0; //colocar todas as entradas/saidas do PORT A como entradas digitais PCFG2=1; PCFG1=1; PCFG0=1; TRISA0=0; //RA0 saida digital (ligacao a input1 do L293 para controlar uma direccao do motor) TRISA1=0; //RA1 saida digital (ligacao a input2 do L293 para controlar uma direccao do motor) TRISA2=0; //RA2 saida para controlo do hctl2016 (RST\) TRISA3=0; //RA3 saida para controlo do hctl2016 (OE\) TRISA4=1; //RA4 entrada o interruptor de sinalização de ANDAR0 (active low) TRISA5=0; //RA5 saida para controlo do hctl2016 (SEL) TRISB=0xFF; //Todo o porto B é utilizado como entrada para leitura do hctl TRISC2=0; //RC2 saida do PWM TRISC3=0; //saida para Enable do LCD TRISC4=1; //RC4 entrada para botoes do elevador (menos significativo) PSPMODE=0; //PSPMODE=0 TRISD=0x00; //Todo o porto D é utilizado como saida para escrita no LCD TRISE0=0; //RE0 saida para controlo do LCD (RS) TRISE1=0; //RE1 saida para controlo do LCD (R/W) L=Read H=Write TRISE2=1; //RE2 entrada para botoes do elevador (mais significativo) } void configHctl(void) { HCTL_OE=1; /* Desactiva o OE\ */ HCTL_RST=0; // faz o reset o hctl HCTL_RST=1; // reset concluido } void configInterrupts(void) { //maior peso GIE=0; //activacao das interrupcoes //medio peso T0IE=0; //desactiva interrupcoes Timer 0 INTE=0; //activa o INT INTERRUPT (interrupcao externa RB0/INT) RBIE=0; //desactiva interrupcoes PORTB INTCON CHANGE PEIE=0; //activa as interrupcoes perifericas //baixo peso EEIE=0; //desactiva interrupcoes EE PSPIE=0; //desactiva interrupcoes Paralell Slave Port ADIE=0; //desactiva interrupcoes A/D RCIE=0; //desactiva interrupcoes RX TXIE=0; //desactiva interrupcoes TX SSPIE=0; //desactiva interrupcoes SSP CCP1IE=0; //desactiva interrupcoes CCP1 TMR2IE=0; //desactiva interrupcoes TMR2 TMR1IE=0; //activa interrupcoes TMR1 CCP2IE=0; //desactiva interrupcoes CCP2 BCLIE=0; //desactiva interrupcoes BCL } void configTimer1(void) { T1CKPS1=1; //prescale 1:8 T1CKPS0=1; //prescale 1:8 T1OSCEN=1; //oscilator enabled TMR1CS=0; //clock source select bit -> internal clock (f=fosc/4) TMR1L=0x00; //holding register for the least significant byte of 16bit tmr1 register TMR1H=0x00; //holding register for the most significant byte of 16bit tmr1 register } void configSerial(void) { //TRISC: DATA DIRECTION REGISTER FOR PORT C TRISC6=1; //RC6 funciona como RX TRISC7=1; //RC7 funciona como TX //TXSTA: TRANSMIT STATUS AND CONTROL REGISTER (ADDRESS 98h) TX9=0; //9-bit Transmit Enable bit-> 1=selects 9-bit transmition; 0=selects 8-bit transmition TXEN=1; //Transmit Enable bit-> 1=Transmit enabled; 0=Transmit disabled SYNC=0; //USART Mode Select bit-> 1=Synchronous mode; 0=Asynchronous mode BRGH=1; //High Baud Rate Select bit->in assynchronous mode: 1=High speed; 0=Low speed | in synchronous mode: Unused in this mode //RCSTA: RECEIVE STATUS AND CONTROL REGISTER (ADDRESS 18h) SPEN=1; //Serial Port Enable bit->1=serial port enabled (configures RC7/TX/DT and RC6/RX/CK pins as serial port pins); 0=Serial port disabled RX9=0; //9-bit Receive Enable bit-> 1=selects 9-bit reception; 0=selects 8-bit reception CREN=1; //Continuous Receive Enable bit-> in asynchronous mode: 1=Enables continuous receive; 0=Disables continuous receive | in synchronous mode: 1=Enables continuous receive until enable bit CREN is cleared (CREN overrides SREN); 0=Disables continuous receive //SPBRG: Baud Rate Generator Register // for SYNC=0 and BRGH=1(high speed) Baud Rate = Fosc/(16(X+1)) // X = value in SPBRG (0 to 255) SPBRG=_BAUDRATE; //pela formula baudrate=113640 o mais proximo possivel de 115200, considerando Fosc=20MHz } void init(void) { // disable(); //desactiva as interrupcoes while(SWITCH) { movedown(); //vai ate ao andar zero pwm(PWM_MAX); } stop(); pwm(0); posact=ANDAR0; //calibra a posicao HCTL_RST=0; //reset do hctl HCTL_RST=1; INTF=0; //limpa a flag de INT (INTF) // enable(); //reactivacao das interrupcoes } void initLCD(void) { unsigned int i; writeLCD(0x04,0x38); for(i=0;i<30000;i++) asm("nop"); writeLCD(0x04,0x38); for(i=0;i<600;i++) asm("nop"); writeLCD(0x04,0x38); for(i=0;i<100;i++) asm("nop"); writeLCD(0x04,0x38); //(1) writeLCD(0x04,0x06); //(2) writeLCD(0x04,0x0C); //(3) writeLCD(0x04,0x01); //(4) writeLCD(0x04,0x80); //(4) for(i=0;i<65000;i++) asm("nop"); }