Documente Academic
Documente Profesional
Documente Cultură
Contagem 2013
Trabalho apresentado ao professor da disciplina Projeto de Sistemas Embarcados em Assembly, do curso de Ps Graduao em Sistemas Embarcados da Pontifcia Universidade Catlica de Minas Gerais, como parte integrante do processo de avaliao.
Professor: Elton
Contagem 2012
3 SUMRIO
1. 2.
Introduo................................................................................................................................. 4 Projeto / Especificaes ........................................................................................................... 5 2.1. Follow Line........................................................................................................................ 5 2.2. Medidor de Velocidade ..................................................................................................... 6 3. Esquema eltrico ...................................................................................................................... 7 3.1. Follow Line........................................................................................................................ 7 3.1.1. Identificao da superfcie ............................................................................................. 7 3.1.2. Movimentao do conjunto............................................................................................ 8 3.2. Medidor de Velocidade ..................................................................................................... 8 3.2.1. Sensores de posio ....................................................................................................... 8 4. Descrio das decises de projeto .......................................................................................... 10 4.1. Mudana de controlador .................................................................................................. 10 4.2. Correes de hardware .................................................................................................... 10 4.3. Modo debug ..................................................................................................................... 11 5. Software C .............................................................................................................................. 12 5.1. Follow Line...................................................................................................................... 12 6. Software AssEmbly ................................................................................................................ 14 6.1. Follow Line...................................................................................................................... 14 7. Software do medidor de velocidade ....................................................................................... 21 8. Sistema Supervisrio .............................................................................................................. 25 9. Consideraes Finais .............................................................................................................. 26 10. Referncias .......................................................................................................................... 27
1. INTRODUO
Os microcontroladores foram desenvolvidos na dcada de 70 baseados nos microprocessadores e seus perifricos. Devido ao seu baixo custo e facilidade de desenho, so amplamente utilizados para automao e controle. Praticamente todos os dispositivos eletrnicos digitais que nos cercam teclado, monitor, disco rgido, relgio, rdio, eletrodomsticos, telefone, etc - esto equipados com algum tipo de microcontrolador. Alm dos j citados, brinquedos, sistemas de superviso e at mesmo veculos so bons exemplos do uso dos microcontroladores como alternativa para controlar processos e aplicaes. Os microcontroladores se diferenciam dos processadores, pois alm dos componentes lgicos e aritmticos usuais de um microprocessador de uso geral, o microcontrolador integra elementos adicionais em sua estrutura interna, como memria de leitura e escrita para armazenamento de dados, memria somente de leitura para armazenamento de programas, EEPROM para armazenamento permanente de dados, dispositivos perifricos como conversores
analgico/digitais (ADC), conversores digitais/analgicos (DAC) em alguns casos; e, interfaces de entrada e sada de dados. De forma oposta aos microprocessadores, onde se superdimensiona ao mximo tendo como limite o preo que o usurio deseja investir, a escolha do microcontrolador feita pelo projetista do equipamento. erro de projeto superdimensionar. Cada desperdcio ser multiplicado pelo nmero de equipamentos fabricados (s vezes milhes). Por isso existem duas linhas de pesquisa paralelas, mas opostas: uma criando microcontroladores mais capazes, para atender produtos de mais tecnologia, e outra para criar microcontroladores mais simples e baratos, para aplicaes elementares. Eles podem ser programados usando linguagens de programao tais como: Assembly e C.
2. PROJETO / ESPECIFICAES
2.1. Follow Line
Como demonstrao dos conhecimentos adquiridos na disciplina de Projeto de Sistemas Embarcados em Assembly, foi proposto o projeto de um rob segue-linha. Este projeto se caracteriza por uma estrutura capaz de movimentar-se de forma independente por um caminho pr-determinado em uma superfcie. Por facilidade de projeto, optou-se por dimensionar o rob para pistas em anel, ou seja, com curvas para apenas um lado. Esta deciso acarreta num menor numero de componentes eletrnicos e ligaes, mantem-se, no entanto, o nvel de dificuldade de programao. O corpo do rob ser desenvolvido com a carcaa de um mouse de computador. Deste mouse sero retirados todos os componentes eletrnicos tais como botes, leds e circuitos integrados sendo aproveitadas apenas as caractersticas fsicas do componente e o projeto eltrico do rob ser completamente desenvolvido pelo grupo. Visando a movimentao, sero acoplados dois motores DC nas laterais do mouse que sero responsveis por impulsionar o conjunto. Desta forma, velocidades de rotao diferentes resultaro em movimentos para esquerda ou direita. Ao passo que, quando estiverem com velocidades iguais, o conjunto movimentar em linha reta. O sistema dever ser capaz de detectar duas cores diferentes na superfcie e, de acordo com a necessidade, tomar decises para manter-se no caminho desejado.
3. ESQUEMA ELTRICO
3.1. Follow Line 3.1.1. Identificao da superfcie
Baseado no princpio da reflexo da luz, acoplou-se um LDR (Resistor Depende de Luz) na parte inferior do rob apontado para baixo. O LDR possui a caracterstica de ser um componente eletrnico cuja resistncia eltrica diminui quando sobre ele incide energia luminosa. Desta forma, atravs da variao da resistncia do LDR ser possvel determinar se o caminho est sendo corretamente seguido. Como o microcontrolador nos fornece uma entrada capaz de detectar diferentes nveis de tenso, usamos um divisor de tenso como na figura.
5V
680
Como forma de potencializar a leitura do LDR, um LED iluminar o caminho do rob. Este LED servir para minimizar a interferncia da luz externa no circuito e aumentar o range de trabalho do LDR.
12V
1k
12V
M2 12V
M
M1
Quando o nvel de tenso na sada digital que liga o controlador base do transistor for maior que zero, a corrente fluir do coletor para o emissor do BC337, desta forma, o motor M2 impulsionar a roda do lado direito e o rob movimentar em linha reta.
10
Para o projeto do medidor de velocidade, foi escolhido o microcontrolador PIC16F877A e uma placa de desenvolvimento j existentes.
11 O transistor utilizado para acionamento do motor 2 tem uma pequena queda de tenso entre o coletor e o emissor. Esta queda faz com que a velocidade de rotao mxima deste motor seja menor que a do motor M1. Este comportamento j era esperado, portanto, por facilidade de montagem, optou-se por alterar o raio das rodas e manter a distncia das rodas para o centro similar.
12
5. SOFTWARE C
5.1. Follow Line
A seguir, segue comentado o software em C desenvolvido para o rob.
/****************************************************************************** * * * ****************************************************************************** * Nome do Arquivo: * Dependencias: * Microcontrolador: * Opo de Clock: * Compilador: * Empresa: * Plataforma: * Autor: * Verso: * Prtica: * Descrio: Follow Line Veja a seo INCLUDES PI12F675 CLOCK INTERNO - 4MHz MikroProgSwich MiKroE MikroC Pro Fbio R. /Fabrco C. / Henrique R. Rev_0 Trabalho de fim de disciplina - Projeto de Sistemas Embarcados em Assembly Como o Robot utiliza apenas um sendor o firmware supersiona se a tenso enviada pelo LDR ultrapassa a proporo lida atravs do conversor AD e verifica qual o motor que esta acionado para deslg-lo e ligar o motor do lado oposto, fazendo com que o Robot retorna a linha. * Fusveis: WATCHDOG TIMER Disable INTOSC Oscilator: I/O funcion GP4/OSC2/CLKOUT/ GP5/OSC1/CLKIN DATA CODE PROTECTION Disable CODE PROTECTION Disable GP3 MCLR Disable POWER UP TIMER Disable BROWNOUT Detect Disable ******************************************************************************** V A R I A V E I S unsigned int a=0; unsigned char start=0; /******************************************************************************* P R O G R A M A void main() { CMCON = 7; ANSEL = 0b00110001; ADCON0 = 0b00000001; TRISIO.B0 = 1; P R I N I P A L *******************************************************************************/ G L O B A I S *******************************************************************************/ ARQUIVO PARA MICROCONTROLADORES PIC
13
GPIO.B0 = 1;
TRISIO.B1 = 0; GPIO.B1 = 0; TRISIO.B2 = 0; GPIO.B2 = 0; TRISIO.B3 = 0; GPIO.B3 = 0; TRISIO.B4 = 0; GPIO.B4 = 0; TRISIO.B5 = 0; GPIO.B5 = 0; while(1) { GPIO.B2=1; GPIO.B4=1; delay_ms(300); GPIO.B2=0; } ADCON0.GO_DONE=1; //liga leitura do AD0 while (ADCON0.GO_DONE==1); GPIO.B1=0; a= ADC_read(0); // "a" recebe ADC0 //espera termino da leitura de AD0 //liga motor da esquerda
if (start==0){
if (a<=594 && GPIO.B4==1){ // Se sair do branco e o motor esq tiver ligado GPIO.B4=0; //desliga motor da esquerda GPIO.B2=1; delay_ms(200); GPIO.B4=1; delay_ms(100); GPIO.B4=0; start=1; while (ADCON0.GO_DONE==1); delay_ms(200); while(a<594){ GPIO.B2=1; while (ADCON0.GO_DONE==1); //espera termino da leitura de AD0 a= ADC_read(0); } } if (a<= 594 && GPIO.B2==1){// Se sair do branco e o motor esq tiver ligado GPIO.B2=0; //desliga motor da direita GPIO.B4=1; delay_ms(200); GPIO.B2=1; delay_ms(100); GPIO.B2=0; //espera termino da leitura de AD0
14
start=1; delay_ms(200); while(a<594) { GPIO.B4=1; while (ADCON0.GO_DONE==1); //espera termino da leitura de AD0 a= ADC_read(0); } } } } //espera termino da leitura de AD0
6. SOFTWARE ASSEMBLY
6.1. Follow Line
A seguir, segue o cdigo equivalente em Assembly.
_main: ;Robo.c,26 :: ;Robo.c,28 :: MOVLW MOVWF ;Robo.c,29 :: MOVLW MOVWF ;Robo.c,30 :: MOVLW MOVWF ;Robo.c,31 :: BSF ;Robo.c,32 :: BSF ;Robo.c,33 :: BCF ;Robo.c,34 :: BCF ;Robo.c,35 :: BCF ;Robo.c,36 :: BCF ;Robo.c,37 :: BCF ;Robo.c,38 :: BCF ;Robo.c,39 :: BCF ;Robo.c,40 :: GPIO+0, 3 TRISIO.B4 = 0; TRISIO+0, 4 GPIO.B4 = 0; GPIO+0, 2 TRISIO.B3 = 0; TRISIO+0, 3 GPIO.B3 = 0; GPIO+0, 1 TRISIO.B2 = 0; TRISIO+0, 2 GPIO.B2 = 0; GPIO+0, 0 TRISIO.B1 = 0; TRISIO+0, 1 GPIO.B1 = 0; 1 ADCON0+0 TRISIO.B0 = 1; TRISIO+0, 0 GPIO.B0 = 1; 49 ANSEL+0 ADCON0 = 0b00000001; 7 CMCON+0 ANSEL = 0b00110001; void main() { CMCON = 7;
15
BCF ;Robo.c,41 :: BCF ;Robo.c,42 :: BCF ;Robo.c,46 :: L_main0: ;Robo.c,48 :: MOVF XORLW BTFSS GOTO ;Robo.c,49 :: BSF ;Robo.c,50 :: BSF ;Robo.c,51 :: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF L_main3: DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO ;Robo.c,52 :: BCF ;Robo.c,54 :: L_main2: ;Robo.c,55 :: BSF ;Robo.c,56 :: L_main4: BTFSS GOTO GOTO L_main5: ;Robo.c,57 :: BCF ;Robo.c,58 :: CLRF CALL MOVF GPIO+0, 1 a= ADC_read(0); FARG_ADC_Read_channel+0 _ADC_Read+0 R0+0, 0 GPIO.B1=0; ADCON0+0, 1 L_main5 L_main4 ADCON0.GO_DONE=1; //liga leitura do AD0 ADCON0+0, 1 while (ADCON0.GO_DONE==1); //espera termino da leitura de AD0 GPIO+0, 2 } R13+0, 1 L_main3 R12+0, 1 L_main3 R11+0, 1 L_main3 GPIO.B2=0; 2 R11+0 134 R12+0 153 R13+0 GPIO+0, 4 delay_ms(300); GPIO+0, 2 GPIO.B4=1; 0 STATUS+0, 2 L_main2 GPIO.B2=1; //liga motor da esquerda if (start==0){ _start+0, 0 GPIO+0, 5 while(1) GPIO+0, 4 TRISIO.B5 = 0; TRISIO+0, 5 GPIO.B5 = 0;
16
MOVWF MOVF MOVWF ;Robo.c,60 :: MOVF SUBLW BTFSS GOTO MOVF SUBLW L__main31: BTFSS GOTO BTFSS GOTO L__main29: ;Robo.c,61 :: BCF ;Robo.c,62 :: BSF ;Robo.c,63 :: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF L_main9: DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO NOP ;Robo.c,64 :: BSF ;Robo.c,65 :: MOVLW MOVWF MOVLW MOVWF L_main10: DECFSZ GOTO DECFSZ GOTO NOP R13+0, 1 L_main10 R12+0, 1 L_main10 130 R12+0 221 R13+0 GPIO+0, 4 delay_ms(100); GPIO.B4=1; R13+0, 1 L_main9 R12+0, 1 L_main9 R11+0, 1 L_main9 2 R11+0 4 R12+0 186 R13+0 GPIO+0, 2 delay_ms(200); GPIO+0, 4 GPIO.B2=1; GPIO.B4=0; //desliga motor da esquerda STATUS+0, 0 L_main8 GPIO+0, 4 L_main8 R0+1, 0 2 STATUS+0, 2 L__main31 R0+0, 0 82 _a+0 R0+1, 0 _a+1 if (a<=594 && GPIO.B4==1){
17
NOP ;Robo.c,66 :: BCF ;Robo.c,67 :: MOVLW MOVWF ;Robo.c,69 :: L_main11: BTFSS GOTO GOTO L_main12: ;Robo.c,70 :: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF L_main13: DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO NOP ;Robo.c,71 :: L_main14: MOVLW SUBWF BTFSS GOTO MOVLW SUBWF L__main32: BTFSC GOTO ;Robo.c,72 :: BSF ;Robo.c,73 :: L_main16: BTFSS GOTO GOTO L_main17: ;Robo.c,74 :: CLRF a= ADC_read(0); FARG_ADC_Read_channel+0 ADCON0+0, 1 L_main17 L_main16 GPIO+0, 2 while (ADCON0.GO_DONE==1); STATUS+0, 0 L_main15 GPIO.B2=1; 2 _a+1, 0 STATUS+0, 2 L__main32 82 _a+0, 0 while(a<594){ R13+0, 1 L_main13 R12+0, 1 L_main13 R11+0, 1 L_main13 2 R11+0 4 R12+0 186 R13+0 delay_ms(200); ADCON0+0, 1 L_main12 L_main11 1 _start+0 while (ADCON0.GO_DONE==1); GPIO+0, 4 start=1; GPIO.B4=0;
18
CALL MOVF MOVWF MOVF MOVWF ;Robo.c,75 :: GOTO L_main15: ;Robo.c,76 :: L_main8: ;Robo.c,77 :: MOVF SUBLW BTFSS GOTO MOVF SUBLW L__main33: BTFSS GOTO BTFSS GOTO L__main28: ;Robo.c,78 :: BCF ;Robo.c,79 :: BSF ;Robo.c,80 :: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF L_main21: DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO NOP ;Robo.c,81 :: BSF ;Robo.c,82 :: MOVLW MOVWF MOVLW 130 R12+0 221 GPIO+0, 2 delay_ms(100); GPIO.B2=1; R13+0, 1 L_main21 R12+0, 1 L_main21 R11+0, 1 L_main21 2 R11+0 4 R12+0 186 R13+0 GPIO+0, 4 delay_ms(200); GPIO+0, 2 GPIO.B4=1; GPIO.B2=0; //desliga motor da direita STATUS+0, 0 L_main20 GPIO+0, 2 L_main20 _a+1, 0 2 STATUS+0, 2 L__main33 _a+0, 0 82 if (a<= 594 && GPIO.B2==1){ } L_main14 _ADC_Read+0 R0+0, 0 _a+0 R0+1, 0 _a+1 }
19
MOVWF L_main22: DECFSZ GOTO DECFSZ GOTO NOP NOP ;Robo.c,83 :: BCF ;Robo.c,84 :: MOVLW MOVWF ;Robo.c,85 :: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF L_main23: DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO NOP ;Robo.c,86 :: L_main24: MOVLW SUBWF BTFSS GOTO MOVLW SUBWF L__main34: BTFSC GOTO ;Robo.c,87 :: BSF ;Robo.c,88 :: L_main26: BTFSS GOTO GOTO L_main27: ;Robo.c,89 :: a= ADC_read(0); ADCON0+0, 1 L_main27 L_main26 GPIO+0, 4 while (ADCON0.GO_DONE==1); STATUS+0, 0 L_main25 GPIO.B4=1; 2 _a+1, 0 STATUS+0, 2 L__main34 82 _a+0, 0 while(a<594) { R13+0, 1 L_main23 R12+0, 1 L_main23 R11+0, 1 L_main23 2 R11+0 4 R12+0 186 R13+0 1 _start+0 delay_ms(200); GPIO+0, 2 start=1; GPIO.B2=0; R13+0, 1 L_main22 R12+0, 1 L_main22 R13+0
20
CLRF CALL MOVF MOVWF MOVF MOVWF ;Robo.c,90 :: GOTO L_main25: ;Robo.c,92 :: L_main20: ;Robo.c,94 :: GOTO ;Robo.c,97 :: L_end_main: GOTO ; end of _main $+0 L_main0 } } } L_main24 FARG_ADC_Read_channel+0 _ADC_Read+0 R0+0, 0 _a+0 R0+1, 0 _a+1 }
21
Com o uso do bootloader, o software pode ser descarregado no PIC atravs da porta serial, como demonstrado abaixo.
22
Abaixo, segue como exemplo de linguagem C, o software desenvolvido para o medidor de velocidade. Como pode ser observado, o CCS facilita a programao tornando mais simples as configuraes os acessos ao hardware.
#include <16F877A.h> #device adc=8 #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES NOWDT HS NOPUT NOPROTECT NODEBUG NOBROWNOUT NOCPD NOWRT //No Watch Dog Timer //High speed Osc (> 4mhz) //No Power Up Timer //Code not protected from reading //No Debug mode for ICD //No brownout reset //No EE protection //Program memory not write protected
#use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define inicio PIN_B4 #define fim PIN_B5 #define botao PIN_B6 int contador=0,ms=0,cs=0,ds=0; // incrementado a cada estouro do timer0. int movimento_valido=0; // varivel semforo que confirma a passagem pelo primeiro sensor. int unidade=1; // seletor de unidade float velocidade; // velocidade medida em m/s. #int_EXT EXT_isr(){ if(velocidade>0){ unidade++; if(unidade>3){ unidade=1; } mostra_velocidade(); delay_ms(200); } } #int_RB RB_isr() { if(input(inicio)){ output_toggle(PIN_D7); putc('A'); movimento_valido=1; contador=0; ms=0; cs=0; ds=0; velocidade=0; } if(input(fim)){ output_toggle(PIN_D6); putc('B'); if(movimento_valido){ velocidade=0.34/(0.1*ds+0.01*cs+0.001*ms); movimento_valido=0; mostra_velocidade(); } else{ mostra_erro(); velocidade=0; } delay_ms(1000); } pula:
23
clear_interrupt(INT_RB); } #int_TIMER0 TIMER0_isr() { contador++; if(contador>=10){ ms++; contador=0; } if(ms>=10){ ms=0; cs++; } if(cs>=10){ cs=0; ds++; } clear_interrupt(INT_TIMER1); } void mostra_velocidade(){ float speed; pos_linha(1);// posiciona display na linha 1; printf(lcd_escreve,"Veloc.:");// Escreve "Velocidade:"; switch(unidade){ case 1: speed=velocidade; printf(lcd_escreve," [m/s] "); break; case 2: speed=velocidade*3.6; //* 3.6 km/h printf(lcd_escreve," [km/h] "); break; case 3: speed=velocidade*2.2369; // * 2.2369 mph printf(lcd_escreve," [mph] "); break; case 4: speed=velocidade*11810.9771; // yd/h printf(lcd_escreve," [yd/h] "); break; } pos_linha(2);// posiciona display na linha 2; printf(lcd_escreve,"%0.3f ",speed); } void mostra_erro(){ pos_linha(1); // posiciona display na linha 1; printf(lcd_escreve," ERRO "); // Escreve "ERRO" centralizado. pos_linha(2); // posiciona display na linha 2; printf(lcd_escreve," Mov. Invalido "); // Escreve "movimento invalido" } void mostra_erro2(){ pos_linha(1); // posiciona display na linha 1; printf(lcd_escreve," ERRO "); // Escreve "ERRO" centralizado. pos_linha(2); // posiciona display na linha 2; printf(lcd_escreve," Tempo expirado "); // Escreve "tempo expirado". } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DISABLED,0,1);
24
setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_RB); enable_interrupts(INT_TIMER0); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); lcd_ini(); delay_ms(10); liga_display(); limpa_display(); // inicializa display
output_high(PIN_D7); output_high(PIN_D6); output_high(PIN_D5); output_high(PIN_D4); delay_ms(500); output_low(PIN_D7); output_low(PIN_D6); output_low(PIN_D5); output_low(PIN_D4); while(1){ if(movimento_valido && ds>=10){ mostra_erro2(); movimento_valido=0; } } } // verifica tempo expirado
25
8. SISTEMA SUPERVISRIO
O PIC 16F877A envia de acordo com o protocolo RS232, informaes para um sistema supervisrio que valida a informao de velocidade fornecida. Abaixo, segue um demonstrativo desta tela em comparao com a velocidade mostrada no PIC.
26
9. CONSIDERAES FINAIS
A simples observao dos cdigos em assembly e C nos permite tirar algumas concluses em relao s duas linguagens. Ao passo que a linguagem assembly fornece maior controle sobre o processador e os perifricos do microcontrolador, a linguagem C mais amigvel ao programador e parte das configuraes no precisam ser dominadas pelo programador. As imagens abaixo, do conta das vantagens lgicas da linguagem Assembly quanto ao cdigo de mquina:
Firmware em C:
Firmware em ASM:
27
10.
REFERNCIAS
Notas de Aula, Sistemas Embarcados PUC Minas, 2012 Prof. Elton. PIC12F675 - Data Sheet Disponvel em: http://ww1.microchip.com/downloads/en/devicedoc/41190g.pdf Acessado em: 18/08/2013 BC337 NPN Transistor - Data Sheet Disponvel em: http://www.datasheetcatalog.org/datasheet/philips/BC337_3.pdf Acessado em: 18/08/2013 LM7805 3-Terminal 1A Positive Voltage Regulator - Datasheet Disponvel em: http://www.fairchildsemi.com/ds/LM/LM7805.pdf Acessado em: 18/08/2013 74LS04 Inversor - Datasheet Disponvel em: http://ecee.colorado.edu/~mcclurel/sn74ls04rev5.pdf Acessado em: 03/09/2013