Programação básica de microcontroladores

40,097 views
39,937 views

Published on

Apresentação dos microntroladores, especialmente da linha pic16f, onde o alvo foi o PIC16f628a, que é bem simples de encontrar para comprar e de programar. Apesar de trabalhar com apenas 8 bits, é o robusto o suficiente para realizar automação que requeira PWM, comparação, USART; 16 I/O; e uma série de outras vantagens.

Published in: Education
3 Comments
10 Likes
Statistics
Notes
No Downloads
Views
Total views
40,097
On SlideShare
0
From Embeds
0
Number of Embeds
3,531
Actions
Shares
0
Downloads
1,160
Comments
3
Likes
10
Embeds 0
No embeds

No notes for slide

Programação básica de microcontroladores

  1. 1. Danilo Morais Pagano Mestrando em Mecânica Computacional - UNICAMP
  2. 2. <ul><li>Microprocessadores: 4 bits, 8 bits, 16... </li></ul><ul><li>É um chip: </li></ul><ul><ul><li>com alta integração de componentes </li></ul></ul><ul><ul><li>RAM externa </li></ul></ul><ul><ul><li>memória EEPROM externa </li></ul></ul><ul><ul><li>HD para armazenamento de programas </li></ul></ul><ul><ul><li>outros diversos periféricos. </li></ul></ul><ul><li>Ou seja, você usa um microprocessador dentro de um microcomputador e ele, em conjunto com um monte de outros CIs, trabalham direitinho. </li></ul>
  3. 3. <ul><li>Microcontrolador é um componente completo por si só. </li></ul><ul><li>Basta um programa e ele executa uma função específica. </li></ul><ul><li>Dentro do microcontrolador temos memória RAM, FLASH, EEPROM ou E2PROM. </li></ul>
  4. 4. <ul><li>Vamos simplificar resumindo a lógica em dois números ou como falamos muito, em dois dígitos: O 0 (zero) e o 1 (um). </li></ul><ul><li>Quando falamos em 0 (zero), estamos nos referindo a zero Volt DC e quando falamos em 1 (um) estamos falando em + Vcc. </li></ul><ul><li>No caso dos microcontroladores PIC, geralmente, estaremos falando que: </li></ul><ul><li>0 = GND e 1 = 5Vcc </li></ul>
  5. 5. <ul><li>Memória ROM </li></ul><ul><li>Memória RAM </li></ul><ul><li>Memória EPROM </li></ul><ul><li>Memória EEPROM ou E2PROM </li></ul><ul><li>Memória FLASH </li></ul>
  6. 6. <ul><li>É um endereço na memória </li></ul><ul><li>Formados por 8 números, ou melhor, 8 bits. </li></ul><ul><li>Estes bits podem ser 0 (zero) ou 1 (um). </li></ul><ul><li>Muitas vezes chamamos estes bits de Flags. </li></ul><ul><li>Flag então é um bit dentro de um registrador. </li></ul>
  7. 7. <ul><li>Imaginemos 8 posições: </li></ul><ul><li>Cada posição pode ter um valor de 0 (zero) ou 1 (um). Esta posição com um valor é um bit, ou melhor, bit é o valor que há dentro da posição. </li></ul><ul><li>Quando juntamos 8 bits, como no exemplo a seguir: </li></ul><ul><li>“ 00110011” ⇒ Chamamos isto de byte. Um byte então é um conjunto de 8 bits. </li></ul>
  8. 8. <ul><li>Às vezes os bits podem ser agrupados em números de 4, veja: </li></ul><ul><li>“ 0101” ⇒ Damos a isto o nome de “nibble”. </li></ul><ul><li>Outras vezes os bits podem se agrupar com números maiores que 8, veja: </li></ul><ul><li>“ 001100110011” ⇒ Chamamos isto de “Word”: 16 bits ou 2 bytes </li></ul>
  9. 9. <ul><li>Nos PICS existem registradores especiais </li></ul><ul><li>Podemos através dos bits ou flags destes registradores </li></ul>“ ajustar” o funcionamento do PIC ou saber como ele está operando, para isto basta escrever ou ler os flags destes registradores.
  10. 10. <ul><li>Os primeiros microcontroladores usavam uma estrutura interna que tinha apenas um caminho para trafegar os dados e endereços. </li></ul><ul><li>Lembre-se, dados são informações e endereços são os locais onde serão armazenados os dados. </li></ul><ul><li>O nome mais correto para este “caminho” é Bus. Com apenas um bus tínhamos que trafegar hora endereços, hora dados. </li></ul><ul><li>Esta arquitetura de construção recebe o nome de “Von Neumann”. </li></ul>
  11. 11. <ul><li>Hoje em dia, os PICs particularmente, trabalham com dois bus. Um para dados e outro para endereços. </li></ul><ul><li>Este tipo de arquitetura recebe o nome de “Harvard”. </li></ul><ul><li>Os PICs possuem ainda um outro recurso, chamado de “Pipeline”. </li></ul>
  12. 12. <ul><li>“ CISC” : possuía mais de 100 instruções, o que dificultava a memorização do programador. </li></ul><ul><li>“ RISC”: Este set tem entre 33 a 35 instruções dependendo do PIC. Isto ajuda na memorização, mas, exige mais do programador. É como falar fluentemente um outro idioma, conhecendo poucas palavras, all right? </li></ul><ul><li>C omplex </li></ul><ul><li>I nstruction </li></ul><ul><li>S et </li></ul><ul><li>C omputer </li></ul><ul><li>R educed I nstruction </li></ul><ul><li>S et </li></ul><ul><li>C omputer </li></ul>
  13. 13. <ul><li>Introdução à arquitetura interna e suas configurações </li></ul>
  14. 14. <ul><li>Fabricado pela Microchip ( www.microchip.com ) </li></ul><ul><li>Possui 18 pinos </li></ul><ul><li>Possui 35 instruções </li></ul><ul><li>Clock até 20MHz </li></ul><ul><li>Memoria de programa tipo Flash de 2k words </li></ul><ul><li>224 bytes de memoria RAM de dados </li></ul>
  15. 15. <ul><li>128 bytes de memoria EEPROM para dados </li></ul><ul><li>Instruções de 14 bits com 200ns de execução </li></ul><ul><li>Dados de 8 bits </li></ul><ul><li>15 registradores especiais </li></ul><ul><li>16 pinos de entrada/saida (I/O) </li></ul><ul><li>ICPS, timer interno, watchdog, CPP, USART, etc... </li></ul>
  16. 22. 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1
  17. 23. <ul><li>Com 8 níveis (imagine que você quer guardar 8 caixas iguais uma sobre a outra, cada caixa contém algumas coisas. Pois bem, cada caixa é um nível). Há de se ter cuidado para não “derrubar” esta pilha ou como se diz em programação, estourar a pilha (vai que dentro de uma pilha você colocou dinamite.). </li></ul>
  18. 24. <ul><li>O Watch dog é um contador independente de tudo dentro do PIC, que reseta o mesmo, após um certo período. </li></ul><ul><li>Para que serve isto? </li></ul><ul><li>Digamos que você fez um projeto com um PIC para controlar um elevador, de repente um pico de tensão o PIC trava-o fazendo com que o elevador pare. Depois de um curto período o Watch dog reseta o PIC, o programa volta a funcionar e o elevador volta a funcionar também. </li></ul><ul><li>Há de saber como se travar bem este cão, mas isto é, literalmente, outro capítulo... </li></ul>
  19. 25. <ul><li>Uma USART serial, mas o que é isto? </li></ul><ul><li>É um recurso que permitirá que você converse com outros equipamentos, como uma porta serial de um microcomputador. </li></ul><ul><li>USART significa “Universal Synchronous Asynchrous Receiver transmiter” ou Transmissor Universal Síncrono ou Assíncrono. </li></ul>
  20. 26. <ul><li>Só para lembrar PWM quer dizer modulação por largura de pulso, com este recurso você conseguirá variar o brilho de uma lâmpada, a velocidade de um motor DC ou até fazer uma fonte chaveada. </li></ul>
  21. 27. <ul><li>2 comparadores analógicos com referência interna, programável, de tensão. Quem gosta de amplificadores operacionais prepare-se para se divertir, e quem não os conhece vamos ler um livro sobre AOPs. </li></ul>
  22. 28. <ul><li>É um sinal de onda quadrada que serve para fazer um circuito lógico funcionar ou para sincronizar diversos dispositivos ou circuitos. </li></ul><ul><li>O nível alto do clock =+Vcc </li></ul><ul><li>O nível baixo = zero volt. </li></ul><ul><li>O período alto (+Vcc) é chamado de “Ton” e o período baixo de “Toff”. </li></ul><ul><li>Ton = Toff. É melhor que sejam iguais </li></ul><ul><li>T = Ton + ToFF ( a soma resulta no periodo) </li></ul><ul><li>T = 1 </li></ul><ul><li>F </li></ul>
  23. 29. <ul><li>Ao usarmos um cristal de 4MHz teremos uma freqüência de 4MHz e o período de: </li></ul><ul><li>T = 1 = 1 = 250ns ou 250 nano segundos </li></ul><ul><li>F 4.000,000 </li></ul><ul><li>Ou 0,000. 000.25 segundos. </li></ul>
  24. 30. <ul><li>Divide-se clock por quatro, formando as fases Q1, Q2, Q3 e Q4 </li></ul><ul><li>PIPELINE: Busca a informação em um ciclo e a executa no próximo </li></ul><ul><li>Para um clock de 4MHz, cada instrução é executada 1  s, desde que não afete o Program Counter </li></ul>
  25. 31. <ul><li>RC_CLKOUT = oscilador RC externo que deve estar ligado no pino 16. No pino 15 teremos este sinal dividido por 4. </li></ul><ul><li>RC_I/O = Oscilador externo mais que usa o pino 15 como I/O. </li></ul>
  26. 32. <ul><li>XT = cristal de 200kHz até 4MHz </li></ul><ul><li>HS = cristal acima de 4MHz </li></ul><ul><li>LS = cristal abaixo de 200kHz </li></ul><ul><li>INTOSC_I/O = oscilador interno com o pino 15 operando como I/O. </li></ul><ul><li>INTOSC_CLKOUT = o pino 15 teremos este sinal dividido por 4 </li></ul>
  27. 35. <ul><li>O nome registrador W vem de “Registrador Work”, que traduzindo, quer dizer trabalho. </li></ul><ul><li>É através dele que carregamos os outros registradores com valores diversos e corretos para um perfeito funcionamento de nosso projeto. </li></ul><ul><li>Caso desejamos colocar um determinado valor em um registrador de uso geral (GPR), primeiro temos que “carregar” o registrador W e depois passar para o outro registrador. </li></ul>
  28. 36. <ul><li>O início de tudo... </li></ul>
  29. 37. <ul><li>Fique atento! </li></ul>
  30. 39. <ul><li>LIST p=16f628a </li></ul><ul><li>#INCLUDE &quot;P16F628.INC&quot; </li></ul>
  31. 40. <ul><li>Abrir arquivo do word. </li></ul><ul><li>Exemplo: </li></ul><ul><li>__CONFIG _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _LVP_OFF & _MCLRE_OFF </li></ul>
  32. 41. <ul><li>#DEFINE BANK0 BCF STATUS, RP0 </li></ul><ul><li>#DEFINE BANK1 BSF STATUS, RP0 </li></ul><ul><li>#DEFINE BOTAO PORTB, 4 </li></ul><ul><li>#DEFINE LED PORTB, 0 </li></ul>
  33. 42. <ul><li>ORG 0X00 ; inicio do programa </li></ul><ul><li>GOTO INICIO ; pula para o label INICIO </li></ul><ul><li>ORG 0X04 ; inicio da interrupção </li></ul><ul><li>RETFIE ; retorna da interrupção </li></ul>
  34. 43. <ul><li>INICIO </li></ul><ul><li>CLRF PORTA </li></ul><ul><li>CLRF PORTB </li></ul><ul><li>BANK1 </li></ul><ul><li>MOVLW B‘00000000' </li></ul><ul><li>MOVWF TRISA </li></ul><ul><li>MOVLW B'00110000' </li></ul><ul><li>MOVWF TRISB </li></ul>
  35. 44. <ul><li>MOVLW B'10000011' </li></ul><ul><li>MOVWF OPTION_REG </li></ul><ul><li>MOVLW B'00000000' </li></ul><ul><li>MOVWF INTCON </li></ul><ul><li>BANK0 </li></ul><ul><li>MOVLW B'00000111' </li></ul><ul><li>MOVWF CMCON </li></ul><ul><li>CLRF PORTA </li></ul><ul><li>CLRF PORTB </li></ul>
  36. 45. <ul><li>MAIN </li></ul><ul><li>BTFSS BOTAO </li></ul><ul><li>GOTO BOTAO_LIB </li></ul><ul><li>GOTO BOTAO_PRES </li></ul><ul><li>BOTAO_LIB </li></ul><ul><li>BCF LED </li></ul><ul><li>GOTO MAIN </li></ul><ul><li>BOTAO_PRES </li></ul><ul><li>BSF LED </li></ul><ul><li>GOTO MAIN </li></ul><ul><li>END </li></ul>
  37. 46. <ul><li>1º passo: Abra o proteus Isis </li></ul><ul><li>2º passo: Monte o circuito (fique atento!) </li></ul><ul><li>3º passo: Adicione um source. </li></ul><ul><li>4º passo: Edite o source.asm que você criou com o código apresentado </li></ul><ul><li>5º passo: Compile o programa pelo comando BUILD </li></ul><ul><li>6º passo: Carregue o programa para a memória do microcontrolador </li></ul><ul><li>7º passo: Execute o programa. </li></ul>
  38. 47. <ul><li>Agora sim é pra valer... Cuidado ao errar, pois pode ser que você erre somente uma vez, pois o PIC é frágil... </li></ul>
  39. 48. <ul><li>1º passo: Abra o IC-PROG </li></ul><ul><li>2º passo: Mude o idioma para portugues. </li></ul><ul><li>3º passo: Ative o driver para windows XP </li></ul><ul><li>4º passo: Utilize a API do Windows </li></ul><ul><li>5º passo: Selecione o PIC </li></ul><ul><li>6º passo: Carregue o programa em HEX para a memória do IC-PROG </li></ul><ul><li>7º passo: Configure os Fuses, caso necessário </li></ul><ul><li>8º passo: Apague a memoria do PIC e faça a gravação do novo programa. </li></ul>
  40. 49. <ul><li>Agora chega de baixaria... Somos de alto nível... </li></ul>Serão apresentados 3 programas: Liga simples Pisca Pisca Sequencial de 4 LEDs Temos tempo ainda? SIM NÃO
  41. 50. <ul><li>#include &quot;16f628a.h“ </li></ul><ul><li>#fuses INTRC_IO, NOMCLR, NOWDT </li></ul>
  42. 51. <ul><li>Void main (){ </li></ul><ul><li>SET_TRIS_A(255); </li></ul><ul><li>SET_TRIS_B(0); </li></ul><ul><li>while(true) </li></ul><ul><li>{ </li></ul><ul><li>output_bit( PIN_B0, input(PIN_A0)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  43. 52. <ul><li>#include &quot;16f628a.h&quot; </li></ul><ul><li>#use delay(clock=4000000) </li></ul><ul><li>#fuses INTRC_IO, NOMCLR, NOWDT </li></ul>
  44. 53. <ul><li>void main() { </li></ul><ul><li>byte i=1; </li></ul><ul><li>SET_TRIS_A(255); </li></ul><ul><li>SET_TRIS_B(0); </li></ul><ul><li>while(true){ </li></ul><ul><li>OUTPUT_LOW(PIN_B0); </li></ul><ul><li>delay_ms(1000); </li></ul><ul><li>OUTPUT_HIGH(PIN_B0); </li></ul><ul><li>delay_ms(1000); } </li></ul><ul><li>} </li></ul>
  45. 54. <ul><li>#include &quot;16f628a.h&quot; </li></ul><ul><li>#fuses INTRC_IO, NOMCLR, NOWDT </li></ul><ul><li>void main() </li></ul><ul><li>{ </li></ul><ul><li>static boolean led=0; </li></ul><ul><li>SET_TRIS_A(255); </li></ul><ul><li>SET_TRIS_B(0); </li></ul><ul><li>OUTPUT_B(0); </li></ul><ul><li>while(true) </li></ul><ul><li>{ </li></ul><ul><li>if(input(PIN_A0)) </li></ul><ul><li>{ </li></ul><ul><li>output_bit(PIN_B0, led); //Quando pressiona A0, manda o bit da variável led para o B0 </li></ul><ul><li>led=!led; //inverte o bit da variável led </li></ul><ul><li>while(input(PIN_A0)) //Este laço deixa o microcontrolador sem fazer nada enquanto </li></ul><ul><li>{// o botão A0 ainda estiver pressionado, só voltando a rodar o programa quando soltar </li></ul><ul><li>}// o botão A0. Isto evita totalmente que o programa pense que o botão foi </li></ul><ul><li>}// pressionado sem querer... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  46. 55. <ul><li>Com o código compilado, você pode carregá-lo para a memória do microcontrolodor tanto do Proteus quanto o real. </li></ul>
  47. 56. <ul><li>Aumentando o nível ainda mais... </li></ul>Temos tempo ainda? SIM NÃO
  48. 57. <ul><li>Abra o programa Ldmicro </li></ul><ul><li>Escolha no menu configurações o modelo do microcontrolador </li></ul>
  49. 58. <ul><li>Insira um contato em série com uma saída. </li></ul><ul><li>Xbotao YLamp </li></ul><ul><li>|----] [---------------------------( )----| </li></ul><ul><li>Dê um nome ao contato e um nome à saída. </li></ul><ul><li>Determine um pino (bit de um port) para corresponder àquela instrução </li></ul><ul><li>Compile e carregue para a memória do uC (Proteus ou real). </li></ul>
  50. 59. <ul><li>Onde pesquisar... </li></ul><ul><li>Site da Microchip – www.microchip.com </li></ul><ul><li>Livros: </li></ul><ul><ul><li>Desbravando o PIC – (Davi José) </li></ul></ul><ul><ul><li>Microcontroladores PIC: Técnicas avançadas ( Fábio Pereira) </li></ul></ul><ul><ul><li>PIC: Programação em C (Fábio Pereira) </li></ul></ul><ul><li>Buscar no google... </li></ul>
  51. 60. <ul><li>Esta foi a ponta do Iceberg... </li></ul><ul><li>Agora cabe a cada um buscar/aprofundar mais no assunto... </li></ul><ul><li>Danilo Pagano </li></ul><ul><li>Departamento de Mecanica Computacional </li></ul><ul><li>Faculdade de Engenharia Mecanica </li></ul><ul><li>Universidade Estadual de Campinas - UNICAMP </li></ul>

×