Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Estácio de Sá Tecnólogo em Automação Tutorial sobre o Microcontrolador PIC16F628A (versão 2.0) http://www.wagnerzanco.com.br suporte@wagnerzanco.com.br Wagner da Silva Zanco 2007 Wagner da Silva Zanco 2 Índice Analítico Arquitetura interna do PIC16F628A 3 Principais características do PIC16F628A 3 Pinagem do PIC16F628A 4 Memória de Programa 4 Mapeamento da Memória RAM 5 Memória EEPROM 5 Registradores com Finalidades Específicas (SFRs) 5 STATUS 6 OPTION 7 INTCON 7 PIE1 8 PIR1 9 PCON 10 Set de Instruções do PIC16F628A 11 Portas de I/O 12 TRISA 12 TRISB 13 Inicializando o PORTA 14 Inicializando o PORTB 14 Acessando o Hardware 14 Exercícios 15 Interrupção 17 Reset 18 Power-on Reset (POR) 18 Power-up Timer 18 Brown-out Reset (BOR) 18 Estruturando um Programa em Assembly 19 Fluxograma 19 Exemplo 1: Acionando um LED com um botão 19 Bits de Configuração 21 Incluindo os Bits de Configuração no Código Fonte 22 Bibliografia 22 Anexo 1: Slaids 23 Wagner da Silva Zanco 3 Arquitetura interna do PIC16F628A Principais características do PIC16F628A : 16 pinos de I/O; Freqüência de até 20MHz; Oscilador interno de 4MHz/37KHz; 2Kx14 bits de memória FLASH de programa; 224x8 bits de memória RAM para dados; 128x8 bits de memória EEPROM interna; Módulo TIMER 0 (timer /contador de 8 bits); Módulo TIMER 1 (timer /contador de 16 bits); Módulo TIMER 2 (timer de 8 bits); Módulo CCP (modos Capture, Compare e PWM); Módulo de referência de tensão (16 passos); Dois comparadores analógicos com referência interna programável de tensão; Um canal de comunicação serial - USART; Um watchdog timer; Capacidade de corrente de 25 mA por pino de I/O; 35 instruções; Dez fontes de interrupção independentes; Modo de funcionamento sleep; Tensão de operação entre 3v a 5v para as versões F, e 2v a 5v para versões LF. Wagner da Silva Zanco 4 Pinagem do PIC16F628A Memória de Programa O PIC16F628A possui 2.048 localidades de memória de programa. Todas as instruções que o PIC16F628A exe-cuta possuem o mesmo tamanho, 14 bits, e cada instrução ocupa uma localidade de memória de programa. O PIC16F628A possui um barramento de endereços de 13 bits para acesso à memória de programa, o que dá uma capacidade de endereçamento de 8k, porém somente 2k(2.048 localidades) foram implementados fisicamente nesse componente, utilizando a faixa de endereços 0000h - 07FFh. Por isso, os últimos 6k de localidades da memória de programa (0800h -1FFFh) estão reservados, ou seja, não têm utilidade nesse MCU, como mostra a figura 11. Observe também que os endereços 01h, 02h e 03h estão reser-vados. Figura 11 Wagner da Silva Zanco 5 Mapeamento da Memória RAM A memória RAM é dividida em quatro bancos e é compartilhada pelos registradores de propósito geral (GPRs) e pelos registradores com finalidades específicas(SFRs). A figura 12 mostra o mapeamento de memória RAM do PIC16F628A. INDF 00h INDF 80h INDF 100h INDF 180h TMR0 01h OPTION 81h TMR0 101h OPTION 181h PCL 02h PCL 82h PCL 102h PCL 182h STATUS 03h STATUS 83h STATUS 103h STATUS 183h FSR 04h FSR 84h FSR 104h FSR 184h PORTA 05h TRISA 85h 105h 185h PORTB 06h TRISB 86h PORTB 106h TRISB 186h 07h 87h 107h 187h 08h 88h 108h 188h 09h 89h 109h 189h PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh PIR1 0Ch PIE1 8Ch 10Ch 18Ch 0Dh 8Dh 10Dh 18Dh TMR1L 0Eh PCON 8Eh 10Eh 18Eh TMR1H 0Fh 8Fh 10Fh 18Fh T1CON 10h 90h TMR2 11h 91h T2CON 12h PR2 92h 13h 93h 14h 94h CCPR1L 15h 95h CCPR1H 16h 96h CCP1CON 17h 97h RCSTA 18h TXSTA 98h TXREG 19h SPBRG 99h RCREG 1Ah EEDATA 9Ah 1Bh EEADR 9Bh 1Ch EECON1 9Ch 1Dh EECON2 9Dh 1Eh 9Eh CMCON 1Fh VRCON 9Fh 11Fh 20h A0h REGs de 120h REGs de propósitos REGs de propósitos gerais propósitos gerais 48 Bytes 14Fh gerais 80 Bytes 150h 96 Bytes EFh 16Fh 1EFh 70h acessos F0h acessos 170h acessos 1F0h 70h-7Fh 70h-7Fh 70h-7Fh 7Fh FF 17Fh 1FFh Bank 0 Bank 1 Bank 2 Bank 3 Memória EEPROM O PIC16F628A possui 128 posições de memória EEPROM, com capacidade de armazenamento de 1 byte em cada posição. A faixa de endereços usada para acesso a essa memória é 00h - 7Fh. Esta é uma memória não-volátil, o que significa que os dados continuam armazenados em suas localidades mesmo sem alimentação. A memória EEPROM será estudada com detalhes no capítulo 13. O acesso a essa memória é feito por meio de alguns registradores especiais, que são: Registradores com Finalidades Específicas (SFRs) Quando vamos montar um programa, é preciso configurar alguns registradores para garantir que o MCU funcione de forma correta. Veja a seguir algumas informações encontradas na descrição de um registrador. Guarde os significados com cuidado, pois serão utilizados sempre que um registrador for descrito ao longo do livro. R - bit de leitura W - bit de escrita Wagner da Silva Zanco 6 S - só pode ser setado U - não implementado, lido como 0 -n(0 ou 1) - valor assumido no Power-on Reset (POR) -x - valor desconhecido no (POR) -q - depende da condição Veja em seguida a função de cada bit dos registradores com finalidades específicas mais utilizados em aplicações com o PIC16F628A. STATUS Registrador STATUS Endereços 03h, 83h, 103h e 183h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 0 R/W - 0 R/W - 0 R - 1 R - 1 R/W - x R/W - x R/W - x IRP RP1 RP0 /TO /PD Z DC C Bit 7: IRP: Bit de seleção de banco de memória (usado para endereçamento indireto) 1 = Bancos 2 e 3 (100h - 1FFh) 0 = Bancos 0 e 1 (000h - 0FFh) Bit 6 - 5: RP1:RP0: Bit de seleção de banco de memória (usado para endereçamento direto) 11 = Banco 3 (180h - 1FFh) 10 = Banco 2 (100h - 17Fh) 01 = Banco 1 (080h - 0FFh) 00 = Banco 0 (000h - 07Fh) Bit 4: /TO: Bit time out 1 = Depois de um power-up, instrução CLRWDT ou instrução SLEEP 0 = WDT gerou um Timeout Bit 3: /PD: Bit power-down 1 = Ocorreu um power-up ou foi executada a instrução CLRWDT 0 = A instrução SLEEP foi executada Bit 2: Z: Bit zero 1 = Indica que o resultado da última operação efetuada na ULA é zero 0 = Indica que o resultado da última operação efetuada na ULA é diferente de zero Bit 1: DC: Digit carry/borrow 1 = A última operação de soma (instruções ADD) ocasionou um estouro entre os bits 3 e 4, isto é, o resultado ultrapassou os 4 bits menos significativos 0 = A última operação efetuada de soma não ocasionou um estouro entre os bits 3 e 4 Bit 0: C: Carry/borrow 1 = A última operação de soma (instruções ADD) ocasionou um estouro de carry, isto é, o resultado ultrapassou os 8 bits mais significativos 0 = A última operação de soma não ocasionou um estouro de carry Observação: O bit C também é afetado pelas instruções SUB, RLF e RRF. Wagner da Silva Zanco 7 OPTIONRegistrador OPTION Endereços 81h e 181h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 Bit 7: /RBPU: Ativa os pull-up internos do PORTB 1 = Resistores pull-up do PORTB desativados 0 = Resistores pull-up do PORTB ativados Bit 6: /INTEDG: Configura a borda que irá gerar interrupção no pino RB0/INT 1 = Interrupção ocorrerá na borda de subida 0 = Interrupção ocorrerá na borda de descida Bit 5: T0CS: Define a origem do incremento do registrador TMR0 1 = TMR0 será incrementado externamente por uma mudança no pino RA4/T0KI 0 = TMR0 será incrementado internamente pelo ciclo de instrução Bit 4: T0SE: Define a borda em RA4/T0CKI que irá incrementar o TMR0 1 = O incremento ocorrerá na borda de descida 0 = O incremento ocorrerá na borda de subida Observação: O bit 4 só tem validade se T0CS = 1. Bit 3: PSA: Define se o prescaler será aplicado ao TMR0 ou ao WDT 1 = O prescaler será aplicado ao WDT 0 = O prescaler será aplicado ao TMR0 Bit 2-0: PS2:PS0: Configura o valor aplicado ao prescaler PS2:PS0 TMR0 WDT 000 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 INTCON Registrador INTCON Endereços 0Bh, 8Bh, 10Bh e 18Bh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 R/W - x GIE PEIE T0IE INTE RBIE T0IF INTF RBIF Wagner da Silva Zanco 8 Bit 7: GIE: Chave geral de habilitação das interrupções 1 = As interrupções habilitadas individualmente serão tratadas 0 = Nenhuma interrupção será tratada Bit 6: PEIE: Habilita interrupção dos periféricos 1 = Habilita todas as interrupções dos periféricos 0 = Desabilita todas as interrupções dos periféricos Bit 5: T0IE: Habilita interrupção de estouro de TMR0 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 4: INTE: Habilita interrupção externa no pino RB0/INT 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 3: RBIE: Habilita interrupção por mudança de estado nos pinos RB7:RB4 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 2: T0IF: Flag que informa ocorrência de estouro de TMR0 1 = TMR0 estourou (precisa ser apagado por software) 0 = TMR0 não estourou Bit 1: INTF: Flag que informa ocorrência de interrupção no pino RB0/INT 1 = Ocorreu uma interrupção externa no pino RB0/INT (precisa ser apagado por software) 0 = Não ocorreu uma interrupção externa no pino RB0/INT Bit 0: RBIF: Flag que informa ocorrência de interrupção nos pinos RB7:RB4 1 = Ocorreu uma interrupção externa por mudança de estado num dos pinos RB7:RB4 (precisa ser apagado por software) 0 = Não ocorreu uma interrupção externa por mudança de estado num dos pinos RB7:RB4 PIE1 Registrador PIE1 Endereço 8Ch Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 U R/W - 0 R/W - 0 R/W - 0 EEIE CMIE RCIE TXIE - CCP1IE TMR2IE TMR1IE Bit 7: EEIE: Bit de habilitação da interrupção de final de escrita na EEPROM 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 6: CMIE: Bit de habilitação da interrupção do comparador 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 5: RCIE: Bit de habilitação da interrupção de recepção de dados na USART Wagner da Silva Zanco 9 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 4: TXIE: Bit de habilitação da interrupção de transmissão de dados na USART 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 3: NÃO IMPLEMENTADO: LIDO COMO ' 0 ' Bit 2: CCP1IE: Bit de habilitação de interrupção do módulo CCP 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 1: TMR2IE: Habilita interrupção de estouro de TMR2 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 0: TMR1IE: Habilita interrupção de estouro de TMR1 1 = Interrupção será tratada 0 = Interrupção não será tratada PIR1 Registrador PIR1 Endereço 0Ch Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 0 R/W - 0 R - 0 R - 0 U R/W - 0 R/W - 0 R/W - 0 EEIF CMIF RCIF TXIF - CCP1IF TMR2IF TMR1IF Bit 7: EEIF: Bit de sinalização da interrupção de final de escrita na EEPROM 1 = Operação de escrita completa (limpar flag por software) 0 = Operação de escrita não terminada ou não começou Bit 6: CMIF: Bit de sinalização da interrupção do comparador 1 = Houve mudança de nível lógico na saída do comparador 0 = Não houve mudança de nível lógico na saída do comparador Bit 5: RCIF: Bit de sinalização da interrupção de recepção de dados na USART 1 = O buffer de recepção de USART está cheio 0 = O buffer de recepção de USART está vazio Bit 4: TXIF: Bit de sinalização da interrupção de transmissão de dados na USART 1 = O buffer de transmissão de USART está vazio 0 = O buffer de transmissão de USART está cheio Bit 3: NÃO IMPLEMENTADO: LIDO COMO ' 0 ' Bit 2: CCP1IF: Bit de sinalização de interrupção do módulo CCP MODO DE CAPTURA 1 = O TMR1 fez a captura (limpar flag por software) 0 = O TMR1 não fez uma captura Wagner da Silva Zanco 10 MODO COMPARADOR 1 = Ocorreu uma igualdade (TMR1=CCPR1) 0 = Não ocorreu igualdade MODO PWM Sem uso para este modo Bit 1: TMR2IF: Sinaliza interrupção de estouro de TMR2 1 = Ocorreu uma igualdade (TMR2=PR2) (limpar flag por software) 0 = Não ocorreu igualdade Bit 0: TMR1IF: Sinaliza interrupção de estouro de TMR1 1 = Houve estouro de TMR1 (limpar flag por software) 0 = Não houve estouro de TMR1 PCON Registrador PCON Endereço 8Eh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 U - 0 U - 0 U - 0 U - 0 R/W - 1 U - 0 R/W - 0 R/W - x - - - - OSCF - /POR /BOR Bit 7: 4, 2: NÃO IMPLEMENTADOS: LIDOS COMO ' 0 ' Bit 3: OSCF: Bit de modo de operação de oscilador interno 1 = Clock de 4MHz 0 = Clock de 37KHz Bit 1: /POR: Bit de sinalização de Power-on Reset (equipamento energizado) 1 = Não houve um Power-on Reset 0 = Houve um Power-on Reset (setar flag por software depois do POR) Bit 0: /BOR: Bit de sinalização de Brown-out Reset (reset por queda de tensão) 1 = Não houve um Brown-out Reset 0 = Houve um Brown-out Reset (setar flag por software depois do BOR) Wagner da Silva Zanco 11 Set de Instruções do PIC16F628A 14 bits de código Mnemônicos Operandos ou argumentos Descrição Ciclos MSB LSB Status afetado Operações com registradores ADDWF f,d d ← (W + f) 1 00 0111 d f f f f f f f C,DC,Z ANDWF f,d d ← (W and f) 1 00 0101 d f f f f f f f Z CLRF F Limpa f 1 00 0001 1 f f f f f f f Z COMF f,d d ← complemento de f 1 00 1001 d f f f f f f f Z DECF f,d d ← (f − 1) 1 00 0011 d f f f f f f f Z DECFSZ f,d d ← (f − 1) e salta próxima linha se resultado for zero 1(2) 00 1011 d f f f f f f f INCF f,d d ← (f + 1) 1 00 1010 d f f f f f f f Z INCFSZ f,d d ← (f + 1) e salta próxima linha se resultado for zero 1(2) 00 1111 d f f f f f f f IORWF f,d d ← (W ou f) 1 00 0100 d f f f f f f f Z MOVF f,d d ← cópia de f 1 00 1000 d f f f f f f f Z MOVWF F f ← cópia de W 1 00 0000 1 f f f f f f f RLF f,d Rotaciona f um bit para a esquerda 1 00 1101 d f f f f f f f C RRF f,d Rotaciona f um bit para a direita 1 00 1100 d f f f f f f f C SUBWF f,d d ← (f − W) 1 00 0010 d f f f f f f f C,DC,Z SWAPF f,d Inverte nibble alto com nibble baixo e guarda resultado em d 1 00 1110 df f f f f f f XORWF f,d d ← (W xor f) 1 00 0110 d f f f f f f f Z Operações com bits BCF f,b Clear (0) bit b do registrador f 1 01 00bb b f f f f f f f BSF f,b set (1) bit b do registrador f 1 01 01bb b f f f f f f f BTFSC f,b Testa bit b do registrador f e salta a próxima linha se ele for zero 1 01 10bb b f f f f f f f BTFSS f,b Testa bit b do registrador f e salta a próxima linha se ele for um 1 01 11bb b f f f f f f f Operações com literais (valores numéricos) ADDLW K W ← (W + K) 1 11 111x kkkk kkkk C,DC,Z ANDLW K W ← (W and K) 1 11 1001 kkkk kkkk Z IORLW K W ← (W ou K) 1 11 1000 kkkk kkkk Z MOVLW K W ← K 1 11 00xx kkkk kkkk SUBLW K W ← (K - W) 1 11 110x kkkk kkkk C,DC,Z XORLW K W ← (W xor K) 1 11 1010 kkkk kkkk Z Operações de controle CLRW - Limpa Work 1 00 0001 0000 0011 Z NOP - Não faz nada, apenas gasta tempo 1 00 0000 0xx0 0000 CALL K Chamada à sub-rotina 2 10 0kkk kkkk kkkk CLRWDT - Limpa WDT 1 00 0000 0110 0100 /TO, /PD GOTO K Desvio para endereço 2 10 1kkk kkkk kkkk RETFIE - Retorno de interrupção 2 00 0000 0000 1001 RETLW K Retorno de sub-rotina com K em W 2 11 01kk kkkk kkkk RETURN - Retorno de sub-rotina 2 00 0000 0000 1000 SLEEP - Coloca PIC em modo Sleep para economia de energia 2 00 0000 0110 0011 /TO, /PD Wagner da Silva Zanco 12 Potas de I/O Quando Os pinos do PIC16F628A estão configurados como pinos de I/O (ou pinos digitais) eles são divididos em dois grupos: PORTA(RA7:RA0) e PORTB(RB7:RB0). A figura a seguir mostra a função de cada pino neste caso. A tabela a seguir mostra os níveis de tensão correspondentes aos níveis lógicos 0 e 1 para um pino configurado como entrada e como saída. Os valores apresentados na tabela são válidos para tensões de alimentação entre 4,5V e 5,5V. 4,5V < VDD < 5,5V Entrada Mín Máx Nível Lógico VIL (tensão de entrada baixa) 0v 0,8v 0 VIH (tensão de entrada alta) 2v VDD 1 Saída VOL (tensão de saída baixa) - 0,6v 0 VOH (tensão de saída alta) VDD - 0,7v - 1 Para configurar um como de I/O como entrada ou como saída temos de configurar o repectivo bit do registrador TRISx. O registrador TRISA configura os pinos do PORTA enquanto que os pinos do PORTB configura os pinos do PORTB. Para configurar um pino como entrada temos de aplicar nível lógico 1 no respectivo bit do registrador TRISx. Para configurar um pino como saída temos de aplicar nível lógico 0 no respectivo bit do registrador TRISx. TRISA Registrador TRISA Endereço 85h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 1 R/W - 1 - R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 TRISA7 TRISA6 - TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 Bit 7: TRISA7: Configura o pino RA7 como entrada ou saída 1 = RA7 configurado como entrada 0 = RA7 configurado como saída Bit 6: TRISA6: Configura o pino RA6 como entrada ou saída 1 = RA6 configurado como entrada 0 = RA6 configurado como saída Bit 5: O pino RA5 é multiplexado com o reset (/MCLR) e com a tensão de programação (Vpp). Ele só pode ser configurado como entrada. Isso é feito desabilitando o bit de configuração Master Clear Enable. Esta configuração é efetuada na hora da programação. Bit 4: TRISA4: Configura o pino RA4 como entrada ou saída 1 = RA4 configurado como entrada 0 = RA4 configurado como saída Wagner da Silva Zanco 13 Bit 3: TRISA3: Configura o pino RA3 como entrada ou saída 1 = RA3 configurado como entrada 0 = RA3 configurado como saída Bit 2: TRISA2: Configura o pino RA2 como entrada ou saída 1 = RA2 configurado como entrada 0 = RA2 configurado como saída Bit 1: TRISA1: Configura o pino RA1 como entrada ou saída 1 = RA1 configurado como entrada 0 = RA1 configurado como saída Bit 0: TRISA0: Configura o pino RA0 como entrada ou saída 1 = RA0 configurado como entrada 0 = RA0 configurado como saída TRISB Registrador TRISB Endereço 86h e 186h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 R/W - 1 TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 Bit 7: TRISB7: Configura o pino RB7 como entrada ou saída 1 = RB7 configurado como entrada 0 = RB7 configurado como saída Bit 6: TRISB6: Configura o pino RB6 como entrada ou saída 1 = RB6 configurado como entrada 0 = RB6 configurado como saída Bit 5: TRISB5: Configura o pino RB5 como entrada ou saída 1 = RB5 configurado como entrada 0 = RB5 configurado como saída Bit 4: TRISB4: Configura o pino RB4 como entrada ou saída 1 = RB4 configurado como entrada 0 = RB4 configurado como saída Bit 3: TRISB3: Configura o pino RB3 como entrada ou saída 1 = RB3 configurado como entrada 0 = RB3 configurado como saída Bit 2: TRISB2: Configura o pino RB2 como entrada ou saída 1 = RB2 configurado como entrada 0 = RB2 configurado como saída Bit 1: TRISB1: Configura o pino RB1 como entrada ou saída 1 = RB1 configurado como entrada 0 = RB1 configurado como saída Bit 0: TRISB0: Configura o pino RB0 como entrada ou saída 1 = RB0 configurado como entrada 0 = RB0 configurado como saída Wagner da Silva Zanco 14 Inicializando o PORTA Na palca de teste utilizada neste curso os pinos RA5, RA6 e RA7 não estão sendo utilizados como pinos de I/O. Nos pinos RA7:RA6 está conectado o cristal de 4MHz e o pino RA5/MCLR está sendo utilizado como pino de reset (/MCLR). Para configurar os pinos RA3:RA0 como I/O temos de inicializar o registrador CMCON com o valor 000001112. O pino RA4 é implementado com saída de dreno aberto(open drain output), o que significa que é necessário o auxílio de fonte externa. O código a seguir é uma proposta para inicializar o PORTA, na qual os pinos RA1 e RA2 como entrada e os demais como saída. ;*********************************************************************************************************************************************************************************** BCF STATUS,RP1 BSF STATUS,RP0 ;ALTERA PARA BANCO1 MOVLW B'00000110' MOVWF TRISA ;DEFINE RA2:RA1 COMO ENTRADA E DEMAIS PINOS COMO SAIDA BCF STATUS,RP1 BCF STATUS,RP0 ;ALTERA PARA BANCO 0 MOVLW B'00000111' ;CONFIGURA RA3:RA0 COM I/O <2:0> MOVWF CMCON ;*********************************************************************************************************************************************************************************** Inicializando o PORTB O código seguinte inicializa o PORTB. Configura todos os pinos como saída e desabilita os resistores pull-ups. Para configurar o pino RB4/PGM como pino de I/O é necessário desabilitar a porgramação em baixa tensão (LVP). Esta desabilitação é efetuada na hora da prgramação comoserá visto mais adiante. ;*********************************************************************************************************************************************************************************** BCF STATUS,RP1 BSF STATUS,RP0 ;ALTERA PARA BANCO1 MOVLW B'00000000' MOVWF TRISB ;DEFINE TODOS OS PINOS COMO SAIDA MOVLW B'10000000' MOVWF OPTION_REG ;PULL_UPS DESABILIADOS <7> ;DEMAIS BITS IRRELEVANTES BCF STATUS,RP1 BCF STATUS,RP0 ;ALTERA PARA BANCO 0 ;*********************************************************************************************************************************************************************************** Acessando o Hardware A interface (ou elo de ligação) entre os pinos do microcontrolador e os programa são os registradores PORTA e PORTB. Quando, por exemplo, um determinado pinoestá configurado como saída, o nível lógico aplicado pelo programa no respectivo bit daquele PORT aparece no pino. Da mesma forma, quando um pino está configurado como entrada, a leitura do pino é obtida por meio da leitura do respectivo bit do PORT. Vemos a seguir um exemplo de uma leitura feita em um único pino do PORT e uma leitura feita em todos os pinos do PORT de uma vez. ;*********************************************************************************************************************************************************************************** ;LENDO UM PINO (RA1) BTFSS PORTA,1 ;PINO RA1 =1? CLRF TMR0 ;NAO, LIMPA REGS TMR0 CLRF TMR2 ;SIM , LIMPA REGS TMR2 ;*********************************************************************************************************************************************************************************** ;LENDO TODO O PORTB MOVF PORTB,W ;W = CONTEUDO DO PORTB MOVWF TEMP ;TEMP = W ;*********************************************************************************************************************************************************************************** Da mesma forma, podemos escrever em um único pino do PORT ou ecrever em todos os pinos do PORT de uma só vez. A fração de código a seguir ilustra a idéia. Observação: Todos os pinos do PORTA e do PORTB, exceto o pino RB5, são multiplexados com outras funções e a configuração efetuada pelos registradores TRISx só funciona corretamente se o respectivo pino estiver configurado como I/O. Wagner da Silva Zanco 15 ;*********************************************************************************************************************************************************************************** ;ESCREVENDO EM UM PINO (RB2) BCF PORTB,2 ;PINO RB2 =0 ;*********************************************************************************************************************************************************************************** ; ESCREVENDO EM TODO O PORTB MOVLW B’00001111’ ;W = 000011112 MOVWF TEMP ;TEMP = 000011112 ;*********************************************************************************************************************************************************************************** Exercícios 1. Qual a função básica de um computador? Explique. 2. Qual a principal diferença existente entre as arquiteturas Von-Neumann e Harvard? 3. Qual a função da CPU num computador? 4. Como a memória é vista pela CPU? 5. O que é um periférico? 6. Qual a função das interfaces? 7. O que caracteriza uma CPU do tipo CISC e uma do tipo RISC? 8. O que diferencia um microprocessador de um microcontrolador? 9. Defina memória volátil e memória não-volátil. 10. Quais são as características das memórias do tipo EEPROM, Flash ROM e SRAM? 11. Qual tipo de memória de programa pode ter um MCU da família PIC? 12. Qual a função dos registradores de uso geral e dos registradores com finalidades específicas? 13. Qual das características seguintes não pertence ao PIC16F628A? a) 16 pinos de I/O b) Módulo TIMER 0 c) Módulo CCP d) Um canal de comunicação USART e) Conversor A/D 14. Qual a função do sinal de clock. 15. Defina ciclo de instrução. 16. O oscilador do PIC16F628A pode funcionar de quantos modos diferentes? Como é feita a escolha? 17. Quais os parâmetros que devem ser atendidos no desenvolvimento de um projeto de circuito eletrônico? 18. Caso optemos por utilizar um oscilador a cristal, em quais pinos do PIC16F628A devemos conectá-lo? Qual faixa de valores de capacitância podem ter os capacitores que fazem parte do arranjo (C1 e C2)? 19. Quais os tipos de memória que integram o PIC16F628A e quais as suas respectivas funções? 20. Quantas localidades de memória de programa possui o PIC16F628A e quantas estão disponíveis para armazenar instruções? 21. Quantas posições de memória RAM são ocupadas pelos registradores de uso geral (GPRs) e como se dá a distribuição entre os bancos de memória? 22. Quais as formas disponíveis para acessar um dado na memória RAM? 23. Quantas localidades de memória EEPROM possui o PIC16F628A e qual a faixa de endereços utilizada para o acesso a elas? 24. Qual as função dos bits Z e C do registrador STATUS? 25. Quais as localidades de memória RAM ocupadas pelo registrador INTCON? 26. Qual a função do bit TMR1IE(PIE1<0>)? 27. Como podemos denominar um conjunto de instruções que o microcontrolador executa para que uma determinada tarefa seja realizada? 28. Quais os campos que formam uma instrução? Defina-os. 29. Quantas instruções o PIC16F628A é capaz de executar e como elas estão divididas? 30. Qual dos termos a seguir não é encontrado no mnemônico de uma instrução? a) DEC b) CLR c) INV d) MOV e) SWAP Wagner da Silva Zanco 16 31. Qual a instrução que força um determinado bit de um registrador assumir nível lógico 1? 32. Qual a instrução que efetua a soma aritmética do conteúdo do registrador WORK com o valor numérico especificado no operando da instrução? 33. O que faz a instrução COMF f,d? 34. Qual a tarefa executada pela instrução MOVWF f? 35. Como estão divididos os pinos de I/O do PIC16F628A? 36. Quais os registradores responsáveis pela configuração dos pinos de I/O como entrada ou como saída? Como é feita essa configuração? 37. Qual dos pinos de I/O do PIC16F628A só pode ser configurado como entrada? 38. Qual o único pino de I/O do PIC16F628A que não é multiplexado com outras funções? 39. Quais as maneiras de efetuarmos a leitura dos pinos de I/O configurados como entrada? 40. Quais as maneiras de efetuarmos a escrita dos pinos de I/O configurados como saída? 41. Em quais bancos de memória se encontram os registradores TRISA e TRISB? Wagner da Silva Zanco 17 Interrupção Uma interrupção é um evento de hardware que, quando ocorre, provoca um desvio no programa, para que o evento seja tratado. Ao término do tratamento do evento que deu origem à interrupção, o programa retorna ao ponto em que parou quando ocorreu o desvio. O PIC16F628A possui dez fontes de interrupção independentes: Estouro de TMR0 Interrupção externa RB0/INT Mudança de estado num dos pinos (RB7:RB4) Término de escrita na EEPROM Módulo comparador Interrupção de USART (recepção e transmissão) Módulo CCP Estouro do TMR1 Interrupção quando TMR2=PR2 A interrupção pode ser tratada ou não. Para que uma interrupção seja tratada, ela precisa estar habilitada. A habilitação é feita da seguinte forma: 1º - Habilitar a chave individual (INTCON ou PIE1). 2º - Habilitar a interrupção de periférico (INTCON<6>) se a fonte for um periférico. 3º - Habilitar a chave geral de interrupção(INTCON<7>). Cada interrupção pode ser habilitada individualmente e independente das demais. Essa habilitação é feita por meio dos registradores INTCON e PIE1 da seguinte forma: Os flags de sinalização das interrupções são setados automaticamente quando o evento responsável pela interrupção ocorre, mas precisam ser apagados manualmente dentro da rotina de interrupção. É importante observar que o flag de sinalização de qualquer uma das interrupções será setado quando o evento responsável por ela ocorrer, mesmo se a respectiva interrupção estiver desabilitada. Se uma determinada interrupção estiver habilitada e ocorrer o evento responsável por ela, o flag de sinalização correspondente ao evento é setado, a execução do programa principal é interrompida, o endereço da próxima instrução que seria executada, que está armazenada no contador de programa, é colocado em uma pilha e o programa é desviado para a localidade 0x04, na qual será executada uma rotina responsável pelo tratamento da interrupção. Quando a instrução RETFIE é encontrada, o endereço é resgatado da pilha e o programa volta ao ponto em que ocorreuo desvio, como mostra a figura a seguir. Wagner da Silva Zanco 18 Reset No PIC16F628A, o reset pode ocorrer por vários motivos. Pode ser interessante identificar o motivo do reset, para que as devidas ações possam ser tomadas corretamente. Veja a seguir os tipos de reset que podem ocorrer no sistema: Power-on reset (POR - ocorre quando o chip é ligado) /MCLR reset durante operação normal /MCLR reset durante o sleep WDT reset (operação normal) Brown-out reset (BOR - reset devido à baixa tensão de alimentação) Veja na tabela seguinte o status dos flags afetados após os respectivos resets. /POR /BOD /TO /PD RESET 0 x 1 1 Power-on reset 1 0 x x Brown-out reset 1 1 0 u WDT Reset 1 1 u u /MCLR durante operação normal 1 1 1 0 Reset durante o sleep X = desconhecido, U = não muda de nível Power-on Reset (POR) Este é um circuito interno ao MCU que o mantém em reset até que VDD alcance tensão suficiente quando a tensão de alimentação é ligada, para que o MCU possa funcionar corretamente. Power-up Timer É um temporizador que pode ser ativado, fazendo com que o MCU se mantenha em reset por 72ms após a alimentação ser ligada. O uso do power-up timer permite que a tensão da fonte se estabilize, garantindo também a estabilidade do oscilador principal, antes de o MCU entrar em funcionamento, evitando travamentos já na inicialização. O Power-up Timer é ativado por meio do bit de configuração PWRTE, desde que ele esteja setado. O Power-up Timer é uma proteção adicional ao POR. Brown-out Reset (BOR) O PIC16F628A possui um circuito interno chamado BOR, que reseta o MCU quando a tensão de alimentação cai abaixo de 4v por aproximadamente 100µs. Quando a tensão de alimentação volta ao valor nominal, o BOR permite que o MCU seja reinicializado. O BOR é ativado por meio do bit de configuração BOREN, que irá ativá-lo quando setado. Ativar o BOR não ativa automaticamente o Power- up Timer (PWRT) como acontecia com o seu antecessor, o PIC16F628. No PIC16F628A o Power-up Timer deve ser habilitado manualmente por meio do bit de configuração /PWRTE. É possível utilizar um circuito de brown-out externo, mudando desta forma o ponto exato em que o reset irá ocorrer. O circuito mostrado na figura a seguir é uma sugestão do fabricante e fará com que o MCU seja resetado quando a tensão de alimentação cair abaixo de Vz + 0,7, sendo Vz a tensão de ruptura do diodo zener. Se o brown-out externo é utilizado, desabilite o bit de configuração BOREN. O BOR é indicado para sistemas que necessitam ser desligados e religados rapidamente ou em locais onde queda de tensão da rede elétrica é comum. Nesses casos, o BOR impedirá que o MCU trave, caso haja uma interrupção momentânea na tensão de alimentação. Wagner da Silva Zanco 19 Estruturando um Programa em Assembly 1º passo - Título, nome do projetista, data de conclusão e versão do programa 2º passo - Arquivos include 3º passo - Paginação de memória 4º passo - Criar variáveis 5º passo - Identificar flags utilizados no sistema 6º passo - Criar constantes 7º passo - Identificar os pinos que são usados como entrada e como saída 8º passo - Vetor reset 9º passo - Vetor de interrupção e rotinas de interrupção 10º passo - Configuração dos registradores com finalidades específicas 11º passo - Inicialização das variáveis 12º passo - Rotina principal 13º passo - Sub-rotinas Fluxograma O fluxograma é uma arma poderosa que pode auxiliar o programador na montagem do programa. Ele mostra como o programa está estruturado, facilitando a montagem das sub-rotinas. As convenções que vamos utilizar no fluxograma são: Observação: Em todos os fluxogramas encontrados neste livro, considera-se como "Início" do 1º ao 11º passo. Exemplo 1: Acionando um LED com um botão O hardware mostrado na figura 29 é implementado na placa Base de Teste 01, cujo diagrama esquemático se encontra no apêndice B. Basta gravar o programa objeto no MCU e colocá-lo na placa, que ele funcionará sem problemas. Wagner da Silva Zanco 20 O fluxograma ao lado informa: enquanto o botão1 (BT1) estiver pressionado, o LED ficará aceso; enquanto o botão estiver solto, o LED ficará apagado. Com o fluxograma pronto basta convertê-lo na Linguagem Assembly, substituindo cada bloco por uma ou mais instruções, ou até mesmo por sub-rotina. Observe no diagrama esquemático que enquanto BT1 estiver solto, estará chegando 5V (ou nível 1) no pino RA1, visto que um pino de I/O configurado como entrada possui alta impedância. Quando BT1 é pressionado, o pino RA1 é aterrado, o que faz com que chegue nível 0 nele. ;********************************************************************************************************************************************** ; PROGRAMA - ACIONAR UM LED COM BOTAO ; DESENVOLVIDO POR WAGNER DA SILVA ZANCO ; VERSAO 1.0 ; 23/06/2003 ;********************************************************************************************************************************************** ; ARQUIVOS DE DEFINICOES ;********************************************************************************************************************************************** #INCLUDE <P16F628A.INC> ; ARQUIVO PADRAO MICROCHIP PARA16F628A ;********************************************************************************************************************************************** ; PAGINACAO DA MEMORIA ;********************************************************************************************************************************************** ;COMANDOS PARA ALTERACAO DE PAGINA DE MEMORIA PARA ENDERECAMENTO DIRETO BANK0 MACRO ;MACRO PARA SELECIONAR BANCO 0 BCF STATUS,RP0 BCF STATUS,RP1 ENDM ;FIM DA MACRO BANK0 BANK1 MACRO ;MACRO PARA SELECIONAR BANCO 1 BSF STATUS,RP0 BCF STATUS,RP1 ENDM ;FIM DA MACRO BANK1 ;********************************************************************************************************************************************** ; ENTRADAS ;********************************************************************************************************************************************** ; PINOS QUE SERAO UTILIZADOS COMO ENTRADA #DEFINE BOTAO1 PORTA,1 ;0 --> PRESSIONADO ;1 --> LIBERADO ;********************************************************************************************************************************************** ; SAIDAS ;********************************************************************************************************************************************** ;PINOS QUE SERAO UTILIZADOS COMO SAIDA #DEFINE LED PORTB,0 ;0 --> APAGADO ;1 --> ACESO ;********************************************************************************************************************************************** ;********************************************************************************************************************************************** ; VETOR DE RESET ;********************************************************************************************************************************************** ORG 0x00 ;ENDERECO INICIAL DE PROCESSAMENTO GOTO INICIO ;DESVIA PARA INICIO ;********************************************************************************************************************************************** ; INTERRUPCAO ;********************************************************************************************************************************************** ; AS INTERRUPCOES NAO SERAO UTILIZADAS ORG 0x04 ;ENDERECO INICAL DA INTERRUPCAO RETFIE;RETORNA DA INTERRUPCAO ;********************************************************************************************************************************************** ; INICIO ;********************************************************************************************************************************************** INICIO BANK1 ;ALTERA PARA BANCO1 MOVLW B'00000010' MOVWF TRISA ;DEFINE RA1 COMO ENTRADA e DEMAIS BITS COMO SAIDA MOVLW B'00000000' MOVWF TRISB ;DEFINE O PORTB COMO SAÍDA MOVLW B'10000000' MOVWF OPTION_REG ;PULL_UPS DESABILIADOS <7> ;DEMAIS BITS IRRELEVANTES MOVLW B'00000000' Wagner da Silva Zanco 21 MOVWF INTCON ;CHAVE GERAL DE INTERRUPCAO DESLIGADA <7> ;DEMAIS BITS IRRELEVANTES BANK0 MOVLW B'00000111' ;CONFIGURA RA3:RA0 COM I/O <2:0> MOVWF CMCON ;********************************************************************************************************************************************** ; INICIALIZACAO DAS VARIAVEIS ;********************************************************************************************************************************************** CLRF PORTA ;LIMPA PORTA CLRF PORTB ;LIMPA PORTB ;********************************************************************************************************************************************** ;ROTINA PRINCIPAL MAIN BTFSC BOTAO1 ;BOTAO1 ESTA PRESSIONADO? GOTO APAGA_LED ;NAO, DESVIA GOTO ACENDE_LED ;SIM, DESVIA APAGA_LED BCF LED ;APAGA LED GOTO MAIN ;RETORNA AO INICIO ACENDE_LED BSF LED ;ACENDE LED GOTO MAIN ;DESVIA ;********************************************************************************************************************************************** END ;FIM DO PROGRAMA ;********************************************************************************************************************************************** Bits de Configuração Independente do programador utilizado, é necessário efetuar algumas configurações que serão gravadas no chip na hora da programação. O PIC16F628A possui um registrador para esta finalidade, o CONFIG, que pode ser acessado por meio do endereço 2007h. Veja que este endereço está fora da faixa de endereços da memória de programa do componente, que vai de 0000h a 07FFh. Por isso ele só pode ser acessado na hora da programação do MCU. Os itens configurados variam de componente para componente. O PIC16F628A possui as seguintes opções de configuração: Tipo de Oscilador Watchdog Timer (WDT) Power Up Timer Brown Out Detect Master Clear Enable Low Voltage Progam Data EE read Protect Code Protect Tipo de Oscilador - o PIC16F628A pode funcionar com vários tipos de oscilador. A seleção é feita por meio do registrador CONFIG e a escolha tem de ser efetuada de acordo com o oscilador presente na placa em que vai rodar o programa. Eles podem ser: LP Cristal de baixa potência (até 200KHz) XT Cristal/Ressonador (até 4MHz) HS Cristal/Ressonador cerâmico de alta freqüência (até 20MHz) RC: CLOCKOUT RC externo com saída de clock. Essa opção fornece no pino RA6/OSC2/CLKOUT um sinal com freqüência quatro vezes menor que a do oscilador principal. RC: I/O RC externo sem saída de clock (RA6 disponível como I/O) INTOSC: CLKOUT Oscilador interno de 4MHz/37KHz com saída de clock. Essa opção fornece no pino RA6/OSC2/CLKOUT um sinal com freqüência quatro vezes menor que a do oscilador principal. INTOSC: I/O Oscilador interno de 4MHz/37KHz sem saída de clock (RA6 e RA7 disponíveis como I/O) EC Oscilador externo. Nessa opção o pino RA6 funciona como I/O. Watchdog Timer (WDT) - circuito temporizador que provocará um reset no programa sempre que ele produzir um Timeout. Sua utilização é indicada para locais onde o programa não pode parar de funcionar, como no caso de um computador de bordo de um automóvel. O WDT tem um oscilador independente do oscilador principal. Isso significa que, se por algum motivo o oscilador principal travar, o WDT continua em funcionamento. Você pode habilitar ou desabilitar o funcionamento do WDT. O capítulo 9 explica com mais detalhes o funcionamento do WDT. Power Up Timer - quando estiver ativada, fará com que o MCU só comece a funcionar cerca de 72ms depois que a fonte de alimentação for ligada. Isso garante que, quando ele começar a funcionar, o oscilador já estará estabilizado, evitando problemas como travamento. Brown Out Detect - quando essa opção é ativada, o MCU irá resetar, caso a tensão de alimentação caia abaixo de um determinado valor. Caso não esteja ativada, o MCU pode travar quando ocorrer uma queda de tensão momentânea. Master Clear Enable - habilita o pino RA5/MCLR/Vpp a funcionar como entrada de reset. Para configurar esse pino como I/O, essa opção deve ser desabilitada. Wagner da Silva Zanco 22 Low Voltage Program - essa opção ativa a programação em baixa voltagem. A menos que você saiba o que está fazendo, deixe-a desabilitada. É necessário que essa opção esteja desabilitada para que o pino RB4/PGM seja configurado como I/O. Data EE read Protect - se estiver desativada, todos os dados armazenados na EEPROM interna poderão ser lidos pelo programa de gravação. Para proteger os dados armazenados na EEPROM, habilite essa opção. Code Protect - é a mais importante opção a ser configurada. Ativado o código de proteção, ninguém mais consegue ler o programa gravado no chip, nem mesmo você. O chip pode ser regravado, mas não pode ser lida a sua memória de programa, até que uma nova gravação seja feita com essa opção desativada. Ativar o código de proteção garante que o programa gravado no componente não será copiado de forma nenhuma, se o MCU estiver funcionando dentro das especificações elétricas, definidas pelo fabricante. Incluindo os bits de configuração no código fonte As configurações correspondentes aos bits de configuração podem ser incluídas no código-fonte por meio da diretiva __CONFIG. As opções para o PIC16F628A são as seguintes: _BOREN_ON Ativa Brown-out Reset _BOREN_OFF Desativa Brown-out Reset _CP_ON Protege toda a memória de programa _CP_OFF Memória de programa desprotegida _DATA_CP_ON Memória EEPROM protegida _DATA_CP_OFF Memória EEPROM desprotegida _PWRTE_OFF Desativa Power Up Timer _PWRTE_ON Ativa Power Up Timer _WDT_ON Habilita Watchdog Timer _WDT_OFF Desabilita Watchdog Timer _LVP_ON Ativa Low Voltage Progam _LVP_OFF Desativa Low Voltage Progam _MCLRE_ON Habilita Master Clear _MCLRE_OFF Desabilita Master Clear _RC_OSC_CLKOUT RC externo com saída de clock _RC_OSC_NOCLKOUT RC externo sem saída de clock _INTOSC_OSC_CLKOUT Oscilador interno de 4MHz/37KHz com saída de clock _INTOSC_OSC_NOCLKOUT Oscilador interno de 4MHz/37KHz sem saída de clock _EXTCLK_OSC Oscilador de clock externo _LP_OSC Cristal de baixa potência (até 200KHz) _XT_OSC Cristal/Ressonador (até 4MHz) _HS_OSC Cristal/Ressonador de alta freqüência (até 20MHz) Vemos a seguir um exemplo de configuração para o registrador CONFIG, que pode ser incluído no código-fonte. A linha seguinte diz que o Brown Out Detect (doravante denominado Brown Out Reset) está ativado, que todo o código do programa está protegido, que o Power Up Timer está ativado, que o WDT está desabilitado, que a programação em baixa tensão está desativada, que a memória EEPROM está desprotegida, que o /MCLR está habilitado e que o oscilador é a cristal. Quando o programa de gravação for executado,essas opções já estarão selecionadas, facilitando, desta forma, o trabalho do programador. Observe que o caractere & é usado como elo de ligação entre as opções configuradas. __CONFIG _BOREN_ON&_CP_OFF&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_ DATA_CP_OFF &_MCLRE_ON&_XT_OSC Bibliografia ZANCO, WAGNER DA SILVA. Microcontroladores PIC16F628A/648A - Uma abordagem prática e objetiva. São Paulo: Érica, 2005. PIC16F627A/628A/648A: Datasheet DS40300B. USA: MICROCHIP, 1999. 1 Um Resumo da Evolução da Eletrônica Wagner Zanco A função básica de um computador O computador basicamente é um processador de informações. O usuário introduz as informações no computador por meio de um dispositivo de entrada como o teclado, mouse etc. O computador processa as informações e retorna o resultado para o usuário por meio de um dispositivo de saída como o Vídeo ou impressora. Wagner Zanco 2 Arquitetura Von-Neumann CPU – É um circuito integrado (CI) capaz de executar um conjunto de tarefas denominadas instruções. A CPU gerencia todo o sistema e executa os programas. Memória – Armazena os dados que serão processados e os programas que serão executados. Dispositivos de I/O – São os responsáveis pela entrada e saída de dados do sistema. Wagner Zanco Organização da Memória A memória é composta por várias localidades podendo armazenar um conjunto de bits em cada uma. Cada localidade possui seu próprio endereço, sendo este um valor numérico representado no sistema hexadecimal. A unidade padrão de armazenamento de dados na memória é o Byte. Wagner Zanco Arquitetura Harvard Wagner Zanco 3 Von-Neumann versus Harvard CPU CISC – As CPUs utilizadas em computadores que seguem a arquitetura Von-Neumann são do tipo CISC, as quais possuem um set de instruções ampliado (muitas instruções). CPU RISC – As CPUs utilizadas em computadores que seguem a arquitetura Harvard são do tipo RISC, as quais possuem um set de instruções reduzido (poucas instruções). Wagner Zanco GERENCIANDO O SISTEMA Para gerenciar o sistema a CPU precisa se comunicar com a memória e com os dispositivos de I/O. Esta comunicação pode ser de leitura ou de escrita. Leitura - quando a CPU envia uma informação para ser armazenada numa localidade de memória ou para um dispositivo de I/O. Por exemplo, quando a CPU envia uma informação para o vídeo, dizemos que ela escreveu no vídeo. Escrita - quando a CPU busca uma informação na memória ou num dispositivo de I/O. Quando uma tecla é pressionada no teclado e aparece no vídeo, é porque a CPU efetuou uma leitura no teclado e escreveu o dado lido no vídeo. Wagner Zanco “A CPU reconhece cada um dos dispositivos de I/O, assim como cada localidade de memória pelo seu respectivo endereço”. Wagner Zanco 4 - SET(conjunto) de instruções - Velocidade com que as instruções são executadas - Multiprocessamento (execução de várias instruções simultâneas) - Quantidade de memória que é capaz de endereçar - Etc. - SET(conjunto) de instruções; - Velocidade com que as instruções são executadas; - Multiprocessamento (execução de várias instruções simultâneas); -Quantidade de memória que é capaz de endereçar; - Comprimento da via de dados - Etc. CAPACIDADE DE PROCESSAMENTO DE UMA CPU Wagner Zanco MEMÓRIAS SEMICONDUTORAS São memórias implementadas em circuitos integrados (chips de memória). Estão divididas em dois grupos: Volátil e não-volátil. Volátil – É a memórias que perde os dados armazenados quando a energia é desligada. Não-Volátil – É a memória que não perde os dados armazenados quando a energia é desligada. Wagner Zanco ROMROM -- Somente leituraSomente leitura -- ÉÉ programada eletricamente pelo usuprogramada eletricamente pelo usuáário rio PROMPROM -- Somente leituraSomente leitura -- ÉÉ programada eletricamente pelo usuprogramada eletricamente pelo usuáário rio -- Uma vez programada se transforma numa ROMUma vez programada se transforma numa ROM -- NNãão pode ser reprogramadao pode ser reprogramada EPROM EPROM -- Somente LeituraSomente Leitura -- ProgramProgramáável Eletricamente pelo usuvel Eletricamente pelo usuááriorio -- Possui uma janela que quando exposta a raios ultravioletas, seusPossui uma janela que quando exposta a raios ultravioletas, seus dados sdados sãão apagados o apagados podendo ser reprogramada.podendo ser reprogramada. EE22PROM PROM -- Somente LeituraSomente Leitura -- ProgramProgramáável Eletricamente pelo usuvel Eletricamente pelo usuááriorio -- ÉÉ semelhante a uma EPROM ssemelhante a uma EPROM sóó que seus dados sque seus dados sãão apagados atravo apagados atravéés de uma tenss de uma tensãão o eleléétrica aplicada a um de seus pinos, podendo ser reprogramada da mtrica aplicada a um de seus pinos, podendo ser reprogramada da mesma forma que uma esma forma que uma EPROM.EPROM. FLASH-ROM: Identificados pelo sufixo Identificados pelo sufixo ““FF””, estes componentes permitem ser , estes componentes permitem ser apagados/regravados mais de mil vezes atravapagados/regravados mais de mil vezes atravéés de sinais els de sinais eléétricos aplicados em alguns de tricos aplicados em alguns de seus pinos, o que pode ser feito automaticamente por um circuitoseus pinos, o que pode ser feito automaticamente por um circuito gravador de Flash como o gravador de Flash como o Picstart Plus, fabricado pela Microchip ou o JDM, cujo hardware Picstart Plus, fabricado pela Microchip ou o JDM, cujo hardware éé encontrado facilmente na encontrado facilmente na internet. Estes componentes sinternet. Estes componentes sãão a melhor opo a melhor opçãção para teste de programas e implementao para teste de programas e implementaçãção o final dos circuitos, visto que estfinal dos circuitos, visto que estãão ficando cada dia mais baratos.o ficando cada dia mais baratos. MEMÓRIA NÃO-VOLÁTIL Wagner Zanco 5 DRAMDRAM -- Leitura e escritaLeitura e escrita -- Fabricada com capacitoresFabricada com capacitores -- Precisa de REFRESH para manter os dados armazenados, mesmo com aPrecisa de REFRESH para manter os dados armazenados, mesmo com a energia ligada.energia ligada. SRAM SRAM -- Leitura e escritaLeitura e escrita -- Fabricada com FlipFabricada com Flip--flopsflops -- NNãão precisa de refresho precisa de refresh MEMÓRIA VOLÁTIL Wagner Zanco REFRESH - É uma simulação de leitura que é feita em cada localidade de memória com o objetivo de reforçar os dados ali armazenados. Isso é necessário porque a memória DRAM é constituída de capacitores (armazena energia e a perde em pouco tempo). MICROCONTROLADOR “É um computador em um único chip. O microcontrolador integra em um único invólucro CPU, memória e dispositivos de I/O. O primeiro microcontrolador, o 8048, foi desenvolvido pela empresa Intel no final da década de setenta”. Ao contrário do microcontrolador, para se construir um computador com um microprocessador é necessário utilizar memória externa e dispositivos de I/O externos. Wagner Zanco FAMÍLIA PIC Desenvolvida pela empresa Microchip Technology Inc. - PIC10 (8 bits) (menor microcontrolador do mundo) - PIC12 (8 bits) - PIC14 (8 bits) - PIC16 (8 bits) - PIC18 (8 bits) - PIC24 (16 bits) Wagner Zanco 6 Microcontroladores da FamMicrocontroladores da Famíília PIClia PIC - Arquitetura RISC (set de instruções reduzido) - ATÉ 40MHz - Memória de Programas de 12, 14, 16 ou 24 Bits - Memória de programa FlASH-ROM - USART, Conversor A/D, I2C, CAN, SPI, Comparador, PWM, RF, ECCP, Ethernet, USB etc. Wagner Zanco MEMÓRIA DE PROGRAMA ROM TIPO MÁSCARA - O chip já sai da fábrica com o programa gravado nele, não podendo ser regravado de forma nenhuma pelo usuário. O custo destes componentes é bem reduzido, mas só são viáveisse adquiridos em grande quantidade. Estes componentes são identificados pelo sufixo “CR”. OTP - Estes dispositivos utilizam memória PROM para armazenar os programas. Eles vem de fábrica vazios, sendo a gravação do programa feita pelo usuário, não podendo o mesmo ser regravado. Isto impede a utilização destes componentes na fase de desenvolvimento e teste de programas. Os mesmos são identificados pelo sufixo “C”. EPROM - Estes componentes possuem uma janela onde podemos, através da exposição a raios ultravioletas, apagar os programas gravados no chip. Embora seja trabalhoso efetuar o apagamento do programa, estes componentes podem ser utilizados na fase de testes e desenvolvimento de programas. O sufixo pode ser “JW” para dispositivos com encapsulamento do tipo DIP ou “CL” para dispositivos com encapsulamento do tipo PLCC. FLASH - Identificados pelo sufixo “F”, estes componentes permitem ser apagados/regravados milhares de vezes através de sinais elétricos aplicados em alguns de seus pinos, o que pode ser feito automaticamente por um circuito gravador de Flash como o Picstart Plus, fabricado pela Microchip ou o JDM, cujo hardware é encontrado facilmente na internet. Estes componentes são a melhor opção para teste de programas e implementação final dos circuitos, visto que estão ficando cada dia mais baratos. Wagner Zanco ARQUITETURA INTERNA DO PIC16F628A Wagner Zanco 7 CARACTERÍSTICAS DO PIC16F628A - 16 pinos de I/O; - Freqüência de até 20MHz; - Oscilador interno de 4MHz/37KHz; - 2Kx14 bits de memória FLASH de programa; - 224x8 bits de memória RAM para dados; - 128x8 bits de memória E2PROM interna; - TIMER0 (timer /contador de 8 bits); - TIMER1 (timer /contador de 16 bits); - TIMER2 (timer de 8 bits); - 1 canal PWM com captura e amostragem (CCP); - 2 comparadores analógicos com referência interna programável de tensão; - 1 canal de comunicação USART serial; - 1 Timer Watchdog; - Capacidade de corrente de 25 mA por pino de I/O; - 35 instruções; - 10 fontes de interrupção independentes; - Modo de funcionamento Sleep; - Tensão de operação entre 3v a 5v (2v a 5v para versão LF). Wagner Zanco PINAGEM DO PIC16F628A Wagner Zanco PINAGEM DO PIC16F628A Wagner Zanco 8 OSCILADOR Qualquer instrução executada pela CPU utiliza como referência um sinal de clock que é gerado por um oscilador. O Oscilador pode ser externo ou interno. Wagner Zanco SINAL DE CLOCK O sinal de clock é uma onda quadrada que sincroniza a execução das instruções executadas pela CPU. Os Microcontroladores PIC gastam quatro ciclos de clock (ciclo de instrução) para executar uma instrução, salvo algumas exceções. O ciclo de instrução também é chamado de clock interno. T(ciclo de instrução) = 1 / (Fosc/4) Wagner Zanco MODOS DE FUNCIONAMENTO DO OSCILADOR DO PIC16F628A Wagner Zanco 9 MEMÓRIA DE PROGRAMA DO PIC16F628A Wagner Zanco MEMÓRIA DE RAM DO PIC16F628A A memória de RAM (ou de dados) do PIC16F628A é dividida em dois grupos: -Registradores com finalidade específica -Registradores de uso geral Wagner Zanco Obs:. Cada registrador do PIC16F628A ocupa uma localidade de memória e pode armazenar 8 bits. MEMÓRIA DE DADOS DO PIC16F628A Wagner Zanco 10 Bit 7: IRP: Bit de seleção de banco de memória (usado para endereçamento indireto) 1 = Bancos 2 e 3 (100h - 1FFh) 0 = Bancos 0 e 1 (000h - 0FFh) Bit 6 - 5: RP1:RP0: Bit de seleção de banco de memória (usado para endereçamento direto) 11 = Banco 3 (180h - 1FFh) 10 = Banco 2 (100h - 17Fh) 01 = Banco 1 (080h - 0FFh) 00 = Banco 0 (000h - 07Fh) Bit 4: /TO: Bit time out 1 = Depois de um power-up, instrução CLRWDT ou instrução SLEEP 0 = WDT gerou um Timeout Wagner Zanco Bit 3: /PD: Bit power-down 1 = Ocorreu um power-up ou foi executada a instrução CLRWDT 0 = A instrução SLEEP foi executada Bit 2: Z: Bit zero 1 = Indica que o resultado da última operação efetuada na ULA é zero 0 = Indica que o resultado da última operação efetuada na ULA é diferente de zero Bit 1: DC: Digit carry/borrow 1 = A última operação de soma (instruções ADD) ocasionou um estouro entre os bits 3 e 4, isto é, o resultado ultrapassou os 4 bits menos significativos 0 = A última operação efetuada de soma não ocasionou um estouro entre os bits 3 e 4 Bit 0: C: Carry/borrow 1 = A última operação de soma (instruções ADD) ocasionou um estouro de carry, isto é, o resultado ultrapassou os 8 bits mais significativos 0 = A última operação de soma não ocasionou um estouro de carry Wagner Zanco Bit 7: /RBPU: Ativa os resistores pull-ups internos do PORTB 1 = Resistores pull-ups do PORTB desativados 0 = Resistores pull-ups do PORTB ativados Bit 6: /INTEDG: Configura a borda que irá gerar interrupção no pino RB0/INT 1 = Interrupção ocorrerá na borda de subida 0 = Interrupção ocorrerá na borda de descida Bit 5: T0CS: Define a origem do incremento do registrador TMR0 1 = TMR0 será incrementado externamente por uma mudança no pino RA4/T0KI 0 = TMR0 será incrementado internamente pelo ciclo de instrução Bit 4: T0SE: Define a borda em RA4/T0CKI que irá incrementar o TMR0 1 = O incremento ocorrerá na borda de descida 0 = O incremento ocorrerá na borda de subida Wagner Zanco 11 Wagner Zanco Bit 7: GIE: Chave geral de habilitação das interrupções 1 = As interrupções habilitadas individualmente serão tratadas 0 = Nenhuma interrupção será tratada Bit 6: PEIE: Habilita interrupção dos periféricos 1 = Habilita todas as interrupções dos periféricos 0 = Desabilita todas as interrupções dos periféricos Bit 5: T0IE: Habilita interrupção de estouro de TMR0 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 4: INTE: Habilita interrupção externa no pino RB0/INT 1 = Interrupção será tratada 0 = Interrupção não será tratada Wagner Zanco Bit 3: RBIE: Habilita interrupção por mudança de estado nos pinos RB7:RB4 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 2: T0IF: Flag que informa ocorrência de estouro de TMR0 1 = TMR0 estourou (precisa ser apagado por software) 0 = TMR0 não estourou Bit 1: INTF: Flag que informa ocorrência de interrupção no pino RB0/INT 1 = Ocorreu uma interrupção externa no pino RB0/INT (precisa ser apagado por software) 0 = Não ocorreu uma interrupção externa no pino RB0/INT Bit 0: RBIF: Flag que informa ocorrência de interrupção nos pinos RB7:RB4 1 = Ocorreu uma interrupção externa por mudança de estado num dos pinos RB7:RB4 (precisa ser apagado por software) 0 = Não ocorreu uma interrupção externa por mudança de estado num dos pinos RB7:RB4 Wagner Zanco 12 Bit 7: EEIE: Bit de habilitação da interrupção de final de escrita na EEPROM 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 6: CMIE: Bit de habilitação da interrupção do comparador 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 5: RCIE: Bit de habilitação da interrupção de recepção de dados na USART 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 4: TXIE: Bit de habilitação da interrupção de transmissão de dados na USART 1 = Interrupção será tratada 0 = Interrupção não será tratada Wagner Zanco Bit 3: NÃO IMPLEMENTADO: LIDO COMO ' 0 ' Bit 2: CCP1IE: Bit de habilitação de interrupção do módulo CCP 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 1: TMR2IE: Habilita interrupção de estouro de TMR2 1 = Interrupção será tratada 0 = Interrupção não será tratada Bit 0: TMR1IE: Habilita interrupção de estouro de TMR1 1 = Interrupção será tratada 0 = Interrupção não será tratada Wagner Zanco Bit 7: EEIF: Bit de sinalização da interrupção de final de escrita na EEPROM 1 = Operação de escrita completa (limpar flag por software) 0 = Operação de escrita não terminadaou não começou Bit 6: CMIF: Bit de sinalização da interrupção do comparador 1 = Houve mudança de nível lógico na saída do comparador 0 = Não houve mudança de nível lógico na saída do comparador Bit 5: RCIF: Bit de sinalização da interrupção de recepção de dados na USART 1 = O buffer de recepção de USART está cheio 0 = O buffer de recepção de USART está vazio Bit 4: TXIF: Bit de sinalização da interrupção de transmissão de dados na USART 1 = O buffer de transmissão de USART está vazio 0 = O buffer de transmissão de USART está cheio Wagner Zanco 13 Bit 3: NÃO IMPLEMENTADO: LIDO COMO ' 0 ' Bit 2: CCP1IF: Bit de sinalização de interrupção do módulo CCP MODO DE CAPTURA 1 = O TMR1 fez a captura (limpar flag por software) 0 = O TMR1 não fez uma captura MODO COMPARADOR 1 = Ocorreu uma igualdade (TMR1=CCPR1) 0 = Não ocorreu igualdade MODO PWM Sem uso para este modo Bit 1: TMR2IF: Sinaliza interrupção de estouro de TMR2 1 = Ocorreu uma igualdade (TMR2=PR2) (limpar flag por software) 0 = Não ocorreu igualdade Bit 0: TMR1IF: Sinaliza interrupção de estouro de TMR1 1 = Houve estouro de TMR1 (limpar flag por software) 0 = Não houve estouro de TMR1 Wagner Zanco Bit 7: 4, 2: NÃO IMPLEMENTADOS: LIDOS COMO ' 0 ' Bit 3: OSCF: Bit de modo de operação de oscilador interno 1 = Clock de 4MHz 0 = Clock de 37KHz Bit 1: /POR: Bit de sinalização de Power-on Reset (equipamento energizado) 1 = Não houve um Power-on Reset 0 = Houve um Power-on Reset (setar flag por software depois do POR) Bit 0: /BOR: Bit de sinalização de Brown-out Reset (reset por queda de tensão) 1 = Não houve um Brown-out Reset 0 = Houve um Brown-out Reset (setar flag por software depois do BOR) Wagner Zanco Wagner Zanco 14 Wagner Zanco Wagner Zanco PORTAS DE I/O PORTA(RA7:RA0) e PORTB(RB7:RB0) Wagner Zanco NÍVEIS DE TENSÃO CORRESPONDENTES AOS NÍVEIS LÓGICOS 0 e 1 15 Wagner Zanco CONFIGURANDO OS PINOS DE I/O COMO ENTRADA OU COMO SAÍDA Cada bit do TRISA configura o respectivo pino do PORTA Wagner Zanco CONFIGURANDO OS PINOS DE I/O COMO ENTRADA OU COMO SAÍDA Cada bit do TRISB configura o respectivo pino do PORTB Wagner Zanco INICIALIZANDO O PORTA 16 Wagner Zanco INICIALIZANDO O PORTB Wagner Zanco LENDO O PORT Wagner Zanco ESCREVENDO NO PORT 17 Wagner Zanco Tratamento de uma interrupção Wagner Zanco RESET Power-up Timer É um temporizador que pode ser ativado, fazendo com que o MCU se mantenha em reset por 72ms após a alimentação ser ligada. O uso do power-up timer permite que a tensão da fonte se estabilize, garantindo também a estabilidade do oscilador principal, antes de o MCU entrar em funcionamento, evitando travamentos já na inicialização. Power-on Reset (POR) Este é um circuito interno ao MCU que o mantém em reset até que VDD alcance tensão suficiente quando a tensão de alimentação é ligada, para que o MCU possa funcionar corretamente. Brown-out Reset (BOR) O PIC16F628A possui um circuito interno chamado BOR, que reseta o MCU quando a tensão de alimentação cai abaixo de 4v por aproximadamente 100µs. Quando a tensão de alimentação volta ao valor nominal, o BOR permite que o MCU seja reinicializado. Wagner Zanco RESETEstruturando um Programa em Assembly 1º passo - Título, nome do projetista, data de conclusão e versão do programa 2º passo - Arquivos include 3º passo - Paginação de memória 4º passo - Criar variáveis 5º passo - Identificar flags utilizados no sistema 6º passo - Criar constantes 7º passo - Identificar os pinos que são usados como entrada e como saída 8º passo - Vetor reset 9º passo - Vetor de interrupção e rotinas de interrupção 10º passo - Configuração dos registradores com finalidades específicas 11º passo - Inicialização das variáveis 12º passo - Rotina principal 13º passo - Sub-rotinas 18 Wagner Zanco RESETFLUXOGRAMA O fluxograma é uma arma poderosa que pode auxiliar o programador na montagem do programa. Ele mostra como o programa está estruturado, facilitando a montagem das sub-rotinas. Wagner Zanco RESETExemplo 1: Acionando um LED com um botão Wagner Zanco RESETFLUXOGRAMA 19 Wagner Zanco RESETBits de Configuração - Tipo de oscilador - Watchdog Timer (WDT) - Power Up Timer - Brown Out Detect - Master Clear Enable - Low Voltage Progam - Data EE read Protect - Code Protect Wagner Zanco RESETBits de Configuração no Código Fonte _BOREN_ON Ativa Brown-out Reset _BOREN_OFF Desativa Brown-out Reset _CP_ON Protege toda a memória de programa _CP_OFF Memória de programa desprotegida _DATA_CP_ON Memória EEPROM protegida _DATA_CP_OFF Memória EEPROM desprotegida _PWRTE_OFF Desativa Power Up Timer _PWRTE_ON Ativa Power Up Timer _WDT_ON Habilita Watchdog Timer _WDT_OFF Desabilita Watchdog Timer _LVP_ON Ativa Low Voltage Progam _LVP_OFF Desativa Low Voltage Progam _MCLRE_ON Habilita Master Clear _MCLRE_OFF Desabilita Master Clear _RC_OSC_CLKOUT RC externo com saída de clock _RC_OSC_NOCLKOUT RC externo sem saída de clock _INTOSC_OSC_CLKOUT Oscilador interno de 4MHz/37KHz com saída de clock _INTOSC_OSC_NOCLKOUT Oscilador interno de 4MHz/37KHz sem saída de clock _EXTCLK_OSC Oscilador de clock externo _LP_OSC Cristal de baixa potência (até 200KHz) _XT_OSC Cristal/Ressonador (até 4MHz) Wagner Zanco RESETBits de Configuração no Código Fonte
Compartilhar