Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Microcontroladores, Notas de estudo de Engenharia Elétrica

- - - - - - -

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 25/02/2009

joao-catarino-1
joao-catarino-1 🇵🇹

1 documento

1 / 33

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
MICROCONTROLADORES
PIC 16F
Resumo
António M. S. Francisco
Janeiro de 2009
Versão 2
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21

Pré-visualização parcial do texto

Baixe Microcontroladores e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!

MICROCONTROLADORES

PIC 16F

Resumo

António M. S. Francisco Janeiro de 2009 Versão 2

ÍNDICE

  1. Introdução ................................................................................................... 2
  2. Pinout ......................................................................................................... 3
  3. Memória ...................................................................................................... 3 3.1. Memória de Programa ............................................................................. 4 3.2. Memória de Dados .................................................................................. 4
  4. Registos SFR mais Utilizados .......................................................................... 6 4.1. Registo W.............................................................................................. 6 4.2. Registos PORTs ...................................................................................... 6 4.3. Registos TRIS ........................................................................................ 7 4.4. Registo STATUS ..................................................................................... 7 4.5. Registo INTCON ..................................................................................... 9 4.6. Registo OPTION ................................................................................... 10 4.7. Registo ANSEL e ANSELH....................................................................... 12 4.8. Módulo TIMER0 .................................................................................... 12 4.9. Módulo TIMER1 .................................................................................... 15 4.10. Módulo TIMER2 .................................................................................. 16 4.11. Módulo CAPTURE/COMPARE/PWM ......................................................... 18 4.12. Módulo conversor A/D (ADC) ................................................................ 20 4.13. Memória de Dados EEPROM.................................................................. 21
  5. Códigos Utilizados nos Sistemas de Numeração ............................................... 24
  6. Descrições de Opcode .................................................................................. 24
  7. Set de Instruções (1) (2) ............................................................................. 25
  8. Escrita de um Programa em Assembly ........................................................... 26 8.1. Directivas ............................................................................................ 27 8.2. Instruções ........................................................................................... 28 8.3. Etiquetas............................................................................................. 28 8.4. Comentários ........................................................................................ 28
  9. Organização de um Programa em Assembly .................................................... 28
  10. MPLAB IDE ............................................................................................... 29 10.1. Editor ............................................................................................... 29 10.2. Assemblador/Compilador ..................................................................... 30 10.3. Simulador .......................................................................................... 30 10.4. Gravador ........................................................................................... 31

INTERNET :

Outras publicações do autor em:

http://amsfrancisco.planetaclix.pt (aqui programas disponíveis para download) http://automatos.planetaclix.pt http://motores.planetaclix.pt

Endereços sobre microcontroladores:

http://www.microchip.com http://perso.wanadoo.es/luis_ju http://platea.pntic.mec.es/~lmarti http://www.alos.5u.com/index.html http://www.unicrom.com/Tut_PICs4.asp http://www.webdearde.com/modules/Tutoriales/microcontroladorespic/pic.htm http://www.webdearde.com/modules/Tutoriales/picgamamedia/pic-gama-media.pdf http://www.redeya.com/electronica/microcontroladores.html http://www.geocities.com/micros_uan/index.html Livro: Sistemas Baseados em Microcontroladores PIC – Editora Publindústria

2. P INOUT

Encapsulamento DIP

Descrição do Pinout

3. M EMÓRIA

Os PIC têm dois blocos de memória separados; um para o programa e outro para os dados.

3.1. M EMÓRIA DE P ROGRAMA

A memória de programa é implementada usando tecnologia FLASH (EEPROM), o que torna possível programar o microcontrolador muitos milhares de vezes. A capacidade da memória de programa depende da referência do microcontrolador. Esta memória não perde os dados após se desligar a tensão de alimentação do microcontrolador. Nos microcontroladores da família 16F do fabricante Microchip, os endereços 00h e 04h desta memória estão geralmente reservados, respectivamente, para o vector de reset e para o vector de interrupção. Assim, o microcontrolador, logo que é alimentado ou após sofrer um reset , começa a funcionar a partir do endereço 00h. Existindo o vector das interrupções no endereço 04h é conveniente que o programa salte este endereço e continue num endereço acima de 04h.

A pilha (Stack) é um local reservado na memória, onde é guardado o endereço de retorno das subrotinas. É capaz de armazenar até 8 endereços.

3.2. M EMÓRIA DE D ADOS

Constituída por memória RAM e memória EEPROM. A memória RAM está organizada por bancos (blocos). Estes contêm os registos de funções especiais (SFR- Special Function Registers) e os registos de uso geral (GPR-General Purpose Registers). Estes registos são formados por palavras de 8 bits e distribuem-se pelos diferentes bancos. O número de bancos e a sua distribuição depende do tipo de PIC. (Um registo é um local na memória do PIC, que pode ser lido e escrito). A memória de dados EEPROM, cujo conteúdo não se perde durante uma falha da alimentação, é acedida indirectamente através dos registos EEADR e EEDATA. Como a memória EEPROM serve usualmente para guardar parâmetros importantes (por exemplo, uma temperatura), existe um procedimento próprio para escrever na EEPROM que tem que ser seguido de modo a evitar-se uma escrita acidental.

4. REGISTOS SFR MAIS UTILIZADOS

Os registos mais utilizados em programação básica dos microcontroladores PIC são:

Registo Endereço PORT A 05h e 105h PORT B 06h e 106h PORT C 07h e 107h TRIS A 85h e 185h TRIS B 86h e 186h TRIS C 87h e 187h STATUS 03h, 83h, 103h e 183h OPTION 81h e 181h INCON 0Bh, 8Bh, 10Bh e 18Bh TIMER 0 01h e 101h

Alguns registos mais importantes estão em todos os bancos, permitem o acesso sem sair do banco onde se está. Tanto faz alterar num como noutro banco, pois são sempre cópias.

4.1. R EGISTO W – WORKING REGISTER ( WREG ) (A CUMULADOR )

O Acumulador é o registo mais solicitado do microcontrolador. Neste registo são colocados os resultados das operações efectuadas pelo programa, sendo portanto um registo cujo conteúdo está permanentemente a ser alterado. Caso se pretenda utilizar o conteúdo do acumulador no programa, este deve ser imediatamente copiado para um registo específico. O acumulador pode ser acedido a partir de qualquer banco de memória.

4.2. R EGISTOS PORTS (portos)

PORTA, PORTB e PORTC são grupo de pinos do microcontrolador que podem ser acedidos individualmente ou simultaneamente e no qual podemos colocar valores lógicos ou ler deles o estado existente.

PORTA (05h e 105h)

- - RA5 RA4 RA3 RA2 RA1 RA Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

PORTB (06h e 106h)

RB7 RB6 RB5 RB4 - - - - Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

PORTC (07h e 107h)

RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

Fisicamente, porto é um registo dentro do microcontrolador que está ligado por condutores aos terminais do integrado, podendo-se assim aceder ao seu conteúdo ou nele colocar valores lógicos.

Os portos são a conexão física do microcontrolador com o mundo exterior. O micro utiliza-os para observar ou comandar outros componentes ou dispositivos.

Os pinos do PORTA e do PORTB, quando configurados como entradas, podem ser ligados internamente ao positivo da alimentação através de resistência de pull-up. Estas resistências são activadas pondo a 0 o bit RABPU (bit 7 do registo OPTION). Estas resistências são automaticamente desligadas quando os pinos do porto são configurados como saídas.

Para aumentar a sua funcionalidade, os mesmos pinos de um porto podem ter aplicações distintas, por exemplo, o pino 16 do PIC16F690 pode ser configurado como: RCO/AN4/C2IN+. Pode ser o bit 0 do porto C, a entrada analógica n.º 4 ou a entrada “+” do comparador C2. A escolha da função é feita nos registos de configuração.

4.3. R EGISTOS TRIS

Os pinos dos portos A, B e C podem ser definidos como entrada ou como saídas (excepto RA3 que pode ser apenas entrada), de acordo com as necessidades do projecto (por defeito estão programados como entrada).

Para definir um pino como entrada ou como saída, é preciso, em primeiro lugar, escrever no registo TRIS respectivo o valor lógico 0 ou 1. Se num bit do registo TRIS for escrito o valor lógico 1 , então o correspondente pino do porto é definido como entrada (1≡Input), se for escrito o valor 0 , então o pino é definido como saída (0≡Output).

TRISA (85h e 185h)

- - TRIS5 TRIS4 TRIS3 TRIS2 TRIS1 TRIS Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

Por exemplo, se no registo TRISA for colocada a seguinte palavra: 00001111, os pinos RA0 a RA3 funcionam entradas e os pinos RA4 e RA5 como saídas.

TRISB (86h e 186h)

TRIS7 TRIS6 TRIS5 TRIS4 - - - - Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

TRISC (87h e 187h)

TRIS7 TRIS6 TRIS5 TRIS4 TRIS3 TRIS2 TRIS1 TRIS Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit

4.4. R EGISTO STATUS (03h, 83h, 103h e 183h)

O registo de estado (STATUS) contém o estado da ALU (bits: C, DC, Z), estado de RESET (bits: TO e PD) e os bits para selecção do banco de memória (IRP, RP1, RP0). Sendo a selecção do banco de memória controlada por este registo, ele está presente em todos os bancos. Se o registo STATUS for o registo de destino para instruções que afectem os bits Z, DC ou C, não é possível escrever nestes três bits.

bits 5 e 6 - RP1 e RP0 (bits de selecção de banco de registos) Estes dois bits são a parte mais significativa do endereço utilizado para endereçamento directo. Como as instruções que endereçam directamente a memória, dispõem somente de sete bits para este efeito, é preciso mais um bit para poder endereçar todos os 256 registos do PIC.

00 = banco de registos 0 10 = banco de registos 2 01 = banco de registos 1 11 = banco de registos 3

bit 7 - IRP (Bit de selecção de banco de registos) Este bit é utilizado no endereçamento indirecto da RAM interna, como oitavo bit.

1 = bancos 2 e 3 (endereços de 100h a 1FFh) 0 = bancos 0 e 1 (endereços de 00h a FFh)

No exemplo seguinte está escrito o programa para configurar os pinos 0, 1, 2 e 3 do porto C como entradas e os pinos 4, 5, 6 e 7 como saídas.

  • Quando o PIC arranca vai para o Banco 0, como TRISA, TRISB e TRISC estão no banco 1 ou no banco 3, para se aceder a estes registos tem que se configurar o registo STATUS para seleccionar o banco 1 ou o banco 3.

4.5. R EGISTO OPTION - OPTION_REG (81h e 181h)

Registo que contém bits que se destinam a configurar o funcionamento do micro.

bit 0, bit 1 e bit 2: PS0, PS1 e PS2: Bits de selecção do divisor prescaler O prescaler e como estes bits afectam o funcionamento do microcontrolador, são abordados na secção que trata do registo TMR0.

bsf STATUS,RP0 ;coloca bit RP0 do registo Status a 1 bcf STATUS,RP1 ;coloca bit RP1 do registo Status a 0 ;foi seleccionado o banco 1* para se aceder ao registo TRISC movlw b'00001111' ;Move o literal (b'00001111’) para o registo W movwf TRISC ;Move o conteúdo do registo W para o registo TRISC. ;Configura os pinos 0 a 3 do PORTC como entradas e os ;restantes como saídas bcf STATUS,RP0 ;coloca bit RP0 do registo Status a 0 bcf STATUS,RP1 ;coloca bit RP1 do registo Status a 0 ;regressa ao banco 0

bit 3 - PSA: Bit que atribui o prescaler ao temporizador TMR0 ou ao temporizador do watchdog

1 = o prescaler é atribuído ao temporizador do watchdog. 0 = o prescaler é atribuído ao temporizador TMR0.

bit 4 - T0SE: Com o timer0 configurado para contar impulsos externos, aplicados ao pino RA2/T0CKI, este bit vai determinar quando a contagem irá incidir sobre os impulsos ascendentes ou descendentes do sinal.

1 = incrementa nos impulsos de flanco descendente no pino RA2/T0CKI 0 = incrementa nos impulsos de flanco ascendente no pino RA2/T0CKI

bit 5 - T0CS: Este bit permite seleccionar a fonte de clock do TMR0.

1 = impulsos externos aplicados ao pino RA2/T0CKI 0 = impulsos do clock interno (Fosc/4)

bit 6 – INTEDG: Se a ocorrência de interrupções estiver habilitada, este bit vai determinar qual o bordo em que a interrupção no pino RA2/INT vai ocorrer.

1 = flanco ascendente 0 = flanco descendente

bit 7 – RABPU: Este bit introduz ou retira as resistências de pull-up internas, do Porto A e do Porto B, ligadas ao “+” da alimentação.

1 = resistências de “pull-up” desligadas 0 = resistências de “pull-up” ligadas

4.6. R EGISTO INTCON (0Bh, 8Bh, 10Bh e 18Bh)

É o registo que controla as interrupções. O papel do INTCON é permitir ou impedir as interrupções e, mesmo no caso de elas não serem permitidas, ele toma nota dos pedidos, alterando o nível lógico de alguns dos seus bits.

As interrupções são um mecanismo que o microcontrolador possui e que torna possível responder a acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa que o microcontrolador esteja a executar. Esta é uma parte importante do funcionamento dos micros, permite reagir aos acontecimentos na hora. Geralmente, cada interrupção muda a direcção de execução do programa, suspendendo a sua execução, enquanto o microcontrolador corre um subprograma que é a rotina de atendimento da interrupção. Depois de este subprograma ter sido executado, o microcontrolador continua no programa principal, a partir do local em que o tinha abandonado.

bit 0 - RABIF: Bit que informa que houve mudança nos níveis lógicos nos pinos do porto A ou do porto B; 0 para 1 ou 1 para 0:

1= Pelo menos um destes pinos mudou de nível lógico. 0= Não ocorreu nenhuma variação nestes pinos.

Para que estes pinos detectem as variações, eles devem ser definidos como entradas. Se

interrupções adicionais sejam inibidas, o endereço de retorno é guardado na pilha e, no contador de programa, é escrito 04h. Somente depois disso, é que a resposta a uma interrupção começa. Depois de a interrupção ser processada, o bit que por ter sido posto a “1” permitiu a interrupção, deve agora ser reposto a “0”, senão, a rotina de interrupção irá ser novamente processada, mal se efectue o regresso ao programa principal.

Guardar os conteúdos de registos importantes

A única coisa que é guardada na pilha durante uma interrupção é o valor de retorno do contador de programa (por valor de retorno do contador de programa entende-se o endereço da instrução que estava para ser executada, mas que não foi, por causa de ter ocorrido a interrupção). Guardar apenas o valor do contador de programa não é, muitas vezes, suficiente. Alguns registos que já foram usados no programa principal, podem também vir a ser usados na rotina de interrupção. Se não salvaguardamos os seus valores, quando acontece o regresso da subrotina para o programa principal os conteúdos dos registos podem ser diferentes, o que provoca um erro no programa. Um exemplo para este caso é o conteúdo do registo de trabalho W. Se, por exemplo, o programa principal estiver a usar o registo de trabalho W nalgumas das suas operações e se ele contiver algum valor que seja importante para a instrução seguinte, então a interrupção que ocorre, antes desta instrução, vai alterar o valor do registo de trabalho W, indo influenciar directamente o programa principal. O procedimento para a gravação de registos importantes antes de ir para a subrotina de interrupção, designa-se por “PUSH”, enquanto o procedimento que recupera esses valores é chamado POP. O regresso de uma rotina de interrupção é efectuado com instrução RETFI. Esta instrução coloca automaticamente o bit GIE a “1”, permitindo assim que novas interrupções possam ocorrer.

4.7. R EGISTO ANSEL E ANSELH

Registos que determinam o funcionamento de alguns pinos do microcontrolador como I/O digitais ou entradas analógicas (ADC). Nalguns tipos de PICs, por exemplo PIC16F688, esta configuração é efectuada no registo CMCON0.

ANSEL

ANSEH

4.8. M ÓDULO TIMER

O micro PIC16F690 possui vários registos TIMER. Destes, o TIMER0 com o registo TMR0, é o mais utilizado. Trata-se de um contador/temporizador de 8 bits, daí o seu conteúdo poder ser incrementado até 255, independentemente da execução do resto do programa. Funcionando o TIMER0 em modo temporizador, os impulsos são obtidos internamente a partir do sinal de relógio do micro. Em modo contador os impulsos provêm do exterior

através do pino T0CKI do micro. TIMER0 é configurado através do registo OPTION_REG e possui o seguinte diagrama de blocos:

Uma vez atingido o valor 255 o registo TMR0 volta automaticamente a zero, iniciando nova contagem. Esta inicia-se em zero e não no valor em que TMR0 tivesse sido originalmente programado. A contagem do registo é directamente proporcional à frequência do sinal aplicado à entrada, sendo, no entanto, possível efectuar a divisão da frequência de entrada através de um prescaler , conforme se pode verificar, de forma simplificada, nos diagramas de blocos seguintes:

Bit T0CS=0 e bit PSA=1, o percurso do sinal é o seguinte:

4.9. M ÓDULO TIMER

O TIMER1 possui os registos TMR1L (Low) e TMR1H (High) e, à semelhança de TIMER0, também pode funcionar em modo temporizador e contador. Em modo temporizador os impulsos têm origem no relógio do micro e em modo contador provêm do exterior através dos pinos T1CHI ou T1G. TIMER1 possui 16 bits e, por isso, pode efectuar contagens até 65.535. Tal como TIMER0, TIMER1 funciona independentemente da execução do resto do programa. Com o PIC a funcionar com um clock de 4 MHz, o prescaler =8 e o TMR1 a contar o valor máximo (65.536), o overflow de TMR1 acontece a cada 524,288ms (4/fosc x 8 x 65.536 = 524,288ms). TIMER1 é configurado através do registo T1CON.

4.9.1. REGISTO T1CON

4.10. M ÓDULO TIMER

O TIMER2 possui um funcionamento diferente de TIMER0 e TIMER1; funciona apenas no modo temporizador e a activação da sua flag (TMR2IF) não está associada ao overflow do contador, ocorre quando o conteúdo do registo de TIMER2 (TMR2) igualar o do registo PR2. TMR2 e PR2 são registos dei 8 bits e, por isso, podem efectua contagens até 255. Tal como TIMER0 e TIMER1, TIMER2 também funciona independentemente da execução do resto do programa. TIMER2 é configurado através do registo T2CON.

4.10.1. R EGISTO T2CON

A seguir mostra-se um programa que faz piscar um led, ligado no pino RC0, por interrupção devida ao overflow de TMR0.

4.11. M ÓDULO C APTURE/C OMPARE /PWM

O módulo Captura, Comparação e PWM é um periférico que permite controlar diferentes eventos. A programação deste módulo implica a configuração de vários SFR. No modo Captura, é possível contar eventos que ocorram num pino do micro. No modo Comparação é possível comparar o valor de uma contagem com o valor de registos do micro. No modo PWM - Pulse Width Modulation (Modulação por largura de impulso) e possível gerar sinais cuja frequência e duty cycle podem ser configurados. A resolução do sinal PWM é de 10 bits. A técnica PWM é bastante utilizada, nomeadamente no controlo de velocidade de motores DC. Com esta técnica controla-se o tempo que um sinal digital, num período, está a “1” e a “0” ( duty cycle ), conseguindo-se assim controlar a energia fornecida ao motor e consequentemente a sua velocidade. O valor “1” corresponde ao tempo durante o qual o motor é alimentado, e o valor “0” ao tempo em que o motor não é alimentado.

Para activar o módulo PWM é necessário configurar os seguintes registos:

CCP1CON, T2CON, CCPR1L e PR

4.11.1. R EGISTO CCP1CON

Registo de controlo de CCP1.

4.11.2. R EGISTO CCPR1L

Registo que, em conjunto com dois bits do registo CCP1CON, vão determinar o TON ( Pulse Width ).

4.11.3. R EGISTO PR

Registo de 8 bits que é carregado com valor que vai afectar o PWM Period.

O período do PWM depende do valor do registo PR2 e do valor seleccionado em TMR Prescale Value. É calculado pela seguinte fórmula:

O tempo que o impulso está no estado “1” TON, é dado pela seguinte expressão:

Obs.

  • Para habilitar o sinal PWM, colocar a 1 o bit TMR2ON do registo T2CON;
  • Configurar o pino de saída do sinal PWM (RC5), no respectivo registo TRIS, como saída.

De seguida código de um programa que permite gerar um sinal, no pino RC5, com uma frequência de 4 kHz e com um duty cycle^ variável entre 0 e 100%, por alteração do valor do registo CCPR1L.

banksel TRISC ;muda para o banco 1 bcf TRISC,5 ;RC5/CCP1 = saída digital PWM movlw d'249' ;d'249' <> T=250us <> f=4kHz movwf PR2 ;PWM Period =[(PR2)+ 1] • 4 • TOSC • (TMR2 Prescale Value) ;[(PR2)+ 1]=250, TOSC=1/4MHz, Prescale Value= banksel PORTC ;muda para o banco 0 movlw b'00001100' movwf CCP1CON ;<7:6> 00 = single output (saída em P1A) ;<5:4> 00 = 2 bits LSB de PWM duty cycle (podem ficar a 0, erro ;mínimo) ;<3:0> 1100 = saída P1A active-high movlw d'125' ;ALTERAR AQUI (valores entre 0 e 250 para controlo do duty cycle) movwf CCPR1L ;TON = (CCPR1L<7:0>:CCP1CON<5:4>) •TOSC • (TMR2 Prescale ;Value) ;d'250' (máximo)<>duty cycle 100%, 0 (mínimo)<>duty cycle 0%, ;d'125'<>duty cycle 50% ;Atenção! não se considerou os dois bits LSB do PWM duty cycle movlw b'00000100' movwf T2CON ;<2> =1, liga o timer 2 ;<1:0> = 00 <> TMR2 Prescaler Value= goto $ ;ciclo indefinido, continuando o PWM a funcionar

Pulse Width = (CCPR1L<7:0>:CCP1CON<5:4>) • TOSC • (TMR2 Prescale Value)

PWM Period = [( PR2 ) + 1 ]• 4T (^) OSC(TMR2 Prescale Value)