aulas ele133

52
ELE133 Microprocessadores Universidade Gama Filho Curso de Engenharia Elétrica Prof. Neury Nunes Cardoso

Upload: rcvrj

Post on 21-Jun-2015

268 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aulas ELE133

ELE133 Microprocessadores

Universidade Gama Filho

Curso de Engenharia Elétrica

Prof. Neury Nunes Cardoso

Page 2: Aulas ELE133

(uP) x (uC)• uP - Microprocessadores

• uC - Microcontroladores

• Possuem basicamente a mesma estrutura interna com elementos comuns tais como registradores, UC (unidade de controle), ULA (unidade lógica e aritmética) e etc.

• Os uC possuem elementos internos específicos tais como temporizadores, conversores A/D, etc.

Page 3: Aulas ELE133

Funções Básicas

• Endereçamento de instruções e dados

• Ciclo de instruções

• Atendimento de interrupções

Page 4: Aulas ELE133

Microcontroladores Componentes internos

• ULA - Unidade lógica e aritmética

• UC - Unidade de controle

• Registradores (especiais e uso geral)

• Memória de programa (flash)

• Memória de dados (RAM)

• Memória EEPROM

• Temporizadores

Page 5: Aulas ELE133

Microcontroladores Componentes internos

• Conversores A/D

• Entradas e saídas digitais

• Módulos CCP e PWM

• Módulos de comunicação (Usart)

Page 6: Aulas ELE133

MicrocontroladoresDesenvolvendo aplicações

• Identificar as necessidades do projeto

• Especificar as variáveis de entrada e saída quanto a quantidade e tipo (digitais e/ou analógicas)

• Projetar o hardware necessário ao problema

• Desenvolver o algoritmo ou fluxograma da solução

• Implementar a solução (software)

Page 7: Aulas ELE133

Microcontrolador 16F877A da Microchip

- 40 pinos

- 8 canais analógicos

- 3 portas de 8 bits (RB,RC,RD)

- 1 porta de 3 bits (RE)

- 1 porta de 5 bits (RA)

- Oscilador interno ou externo

- Pinos com múltiplas funções

Page 8: Aulas ELE133

Microcontrolador 16F877A da Microchip - Interrupções

• Para qualquer uP ou uC, as interrupções representam toda capacidade destes dispositivos, permitindo que os mesmos possam monitorar vários processos “simultâneos”.

• Trata-se da capacidade de parar uma tarefa principal para atender uma solicitação de alta prioridade, normalmente uma operação de I/O ou solicitação de um periférico.

Page 9: Aulas ELE133

Microcontrolador 16F877A da Microchip - Interrupções

• No caso dos PICs podemos ter os seguintes tipos de interrupções:

• Interrupção dos TIMERS - ocorre sempre que um temporizador gerar um overflow.

• Interrupção EXTERNA - quando habilitada, permite atender interrupções geradas por sinais elétricos provenientes de outros circuitos e/ou outros processadores, sempre na borda de subida ou descida.

Page 10: Aulas ELE133

Microcontrolador 16F877A da Microchip - Interrupções

• Interrupção por MUDANÇA DE ESTADO - Também é uma interrupção externa mas acontece sempre em qualquer transição (subida e descida).

• Interrupção da EEPROM - acontece ao final de uma escrita na EEPROM, não sendo obrigatório o seu uso, porém, em alguns casos seu uso é indicado para evitar atrasos.

Page 11: Aulas ELE133

Microcontrolador 16F877A da Microchip - Interrupções

Interrupção da USART - utilizada pelo sistema de comunicação serial para informar o recebimento de um dado ou a finalização da transmissão.Interrupção do módulo CCP - Módulo (capture, compare e PWM) possui duas interrupções para informar o fim da captura ou fim da comparação.

Page 12: Aulas ELE133

Tratamento de interrupções

• Envolve a utilização de alguns registradores especiais dos processadores.

• PC - Contador de programa

• SP - Stack pointer (Ponteiro de pilha)

• Consiste em desviar o fluxo normal de execução de um programa para uma subrotina específica que irá tratar a interrupção gerada.

Page 13: Aulas ELE133

Tratamento de interrupções

Page 14: Aulas ELE133

Interrupções usando C

O compilador CCS utiliza duas formas para tratar as interrupções.

Modo Automático

Neste caso o compilador irá gerar todo o código necessário para rotina de tratamento da interrupção. Este código se encarregará de salvar o ambiente interno do PIC para posterior recuperação.

Page 15: Aulas ELE133

Interrupções usando C

Vantagem

Facilidade de implementação (o programador se preocupa somente com a solução do problema).

Page 16: Aulas ELE133

Interrupções usando C

Desvantagem

Nem sempre o código gerado pelo compilador é o código mais otimizado, podendo se tornar um problema para aplicações críticas em relação ao tempo de resposta.

Page 17: Aulas ELE133

Interrupções usando C

Utilização

Para utilizar uma determinada interrupção em C, usamos as diretivas:

#int_xxx

onde xxx representa elemento gerador da interrupção:

Page 18: Aulas ELE133

Interrupções usando C

Exemplo

#int_timer0

void rotina_timer0(void)

{

X++; // incrementa a variável X

}

Page 19: Aulas ELE133

Interrupções usando C

Como as interrupções nos PICs possuem endereço fixo, quando programamos em assembler, devemos nos preocupar com o endereço onde estará armazenada a rotina de tratamento da interrupção. Já utilizando o C, no modo automático, a colocação da diretiva diz ao compilador em qual endereço colocar a rotina.

Page 20: Aulas ELE133

Interrupções usando C

Modo manual

Neste modo, o programador terá que escrever todo o código de salvamento do ambiente do processador antes do código da rotina propriamente dita.

Page 21: Aulas ELE133

Interrupções usando C

Vantagem

O código pode ficar mais eficiente pois pode-se gastar tempo salvando somente aquilo que for necessário do ambiente do processador e não todas as informações como no modo automático.

Page 22: Aulas ELE133

Interrupções usando C

Desvantagem

Torna o código mais complexo do ponto de vista de implementação tirando o foco do programado na solução do problema.

Page 23: Aulas ELE133

Interrupções usando C

Exemplo

#inline

void rotina_t0()

//rotina de tratamento do timer0

//observar a diretiva #inline

{

X++; // incrementa a variável X

t0if=0;

}

Page 24: Aulas ELE133

Priorizando interrupções

Para priorizar as diferentes interrupções utiliza-se uma diretiva #priority:

Exemplo:

#priority timer1, timer0

Indica que a interrupção do timer1 é prioritária em relação ao timer0.

Page 25: Aulas ELE133

Interrupção do TIMER0

Usaremos a interrupção gerada por este elemento do PIC para controlar um dos processos em nosso modelo. Todo TIMER é, na verdade, um contador com um número finito de bits, no caso do TIMER0 são 8 bits, ou seja, ele pode contar de 0 a 255, totalizando 256 incrementos até que ocorra um overflow.

Page 26: Aulas ELE133

Interrupção do TIMER0

No momento que ocorrer um overflow, caso a interrupção do TIMER0 esteja habilitada, a sua rotina de tratamento será “chamada” e executada. Usaremos esta rotina para controlar o tempo que cada LED permanece ligado, a partir do modelo da última prática.

Page 27: Aulas ELE133

PIC 16F877A - Mapa de Memória

A memória dos PICs está dividida em 2 grandes grupos:

- Memória de programa

- Memória de dados

Page 28: Aulas ELE133

Memória de Programa

Região interna da memória do PIC onde ficam armazenados os programas a serem executados.

É uma memória regravável, do tipo FLASH que permite reeditar várias vezes as diferentes versões dos programas desenvolvidos.

Page 29: Aulas ELE133

Memória de dados

Memória do tipo volátil onde ficam armazenados os registradores especiais e as variáveis dos programas em execução.

É subdividida em 4 bancos denominados:

- Banco 0 - Banco 1

- Banco 2 - Banco 3

Page 30: Aulas ELE133

Memória de ProgramaMemória de programa com

8K x 14, ou seja cada um dos 8K endereços pode armazenar 14 bits de instrução.

A memória de programa engloba a pilha de subrotinas, o vetor de reset e o vetor de interrupções.

As páginas de 0 até 3 são as regiões onde efetivamente o programa permanecerá armazenado (FLASH).

Page 31: Aulas ELE133

Prática 2

Implementar a solução para um programa que seja capaz de realizar um controle on/off para um LED conectado ao pino RB1 do 16F877A pelo acionamento de uma tecla (NA) conectada ao pino RB2, ou seja, se o LED estiver desligado o acionamento momentâneo da tecla deverá ligar o LED e se estiver ligado, o acionamento deverá desligar o LED.

Page 32: Aulas ELE133

Prática 2

Para ler o estado lógico de uma tecla, normalmente utiliza-se um algoritmo que permita confirmar o acionamento da mesma, ou seja, efetua-se a leitura da tecla e após um determinado intervalo de tempo efetua-se uma nova leitura, somente na 2a leitura, caso o estado permaneça o mesmo da 1a é que o programa deverá aceitar como uma informação válida de acionamento. Esta técnica é chama de debounce e pode ser obtida por hardware ou software (nosso caso).

Page 33: Aulas ELE133

Prática 2

Determinar:

Variáveis de entrada e saída.

Fluxograma da solução.

Algoritmo da solução.

Programa em C

Modelo para testes no PROTEUS

Gravar programa na placa e testar.

Page 34: Aulas ELE133

Prática 3

Implementar um programa em C para o 16F877A que permita controlar o acionamento de 4 leds conectados as saídas RB0, RB1, RB2 e RB3, respectivamente, permitindo mudar o sentido de acionamento em sequência (da esquerda para direita e vice-versa) conforme o acionamento da tecla conectada em RA0. Adicionalmente, as teclas conectadas em RA1 e RA2 devem ser utilizadas para aumentar ou diminuir o tempo que cada led permanecerá ligado.

Page 35: Aulas ELE133

Prática 3

Page 36: Aulas ELE133

Prática 3

Determinar:

Variáveis de entrada e saída.

Fluxograma da solução.

Algoritmo da solução.

Programa em C

Modelo para testes no PROTEUS (será fornecido)

Page 37: Aulas ELE133

Funções

Permite criar sub-rotinas que podem ser chamadas em qualquer ponto do programa. Normalmente, as funções são implementadas para realização de uma tarefa bem específica e que pode se repetir mais de uma vez durante a codificação. Por exemplo:

A leitura de teclas de controle em uma aplicação.

Page 38: Aulas ELE133

Funções

Formato geral:

{tipo da função} nome_da_função ({parâmetros})

{

//bloco de comandos

comando 1;

comando 2;

.....

}

Page 39: Aulas ELE133

Funções

Exemplo:

int quadrado (int a)

{

//multiplica a por a e retorna o resultado

return a*a;

}

Page 40: Aulas ELE133

Funções

As funções devem vir declaradas antes do programa principal. (função main())

A passagem do parâmetro para função pode ser feita de duas formas:

- Por valor

- Por referência

Page 41: Aulas ELE133

Funções

Passagem de parâmetro por valor:

Neste caso o conteúdo do parâmetro é passado para função e ficará armazenado na variável local. O resultado poderá ser retornado pela função, se for o caso.

Page 42: Aulas ELE133

Funções

Passagem de parâmetro por referência:

Neste caso, além do valor, o endereço do parâmetro é passado para função. Desta forma, caso a variável local, receptora do parâmetro, mude seu conteúdo, o parâmetro na rotina ou programa chamador, também mudará de valor. Ou seja, a passagem por referência pode ser uma forma alternativa de retornar um resultado.

Page 43: Aulas ELE133

Prática 3

Implementar o mesmo problema descrito na prática 2, utilizando o conceito de interrupção.

OBS: Usar a interrupção do timer 0.

Objetivos:

Aprender a implementação prática de uma interrupção.

Page 44: Aulas ELE133

Prática 4

A partir do problema solucionado na prática 3, implementar a mesma solução utilizando o conceito de funções para a leitura das teclas de controle.

Page 45: Aulas ELE133

Prática 3

Nesta solução, o controle do acionamento sequencial dos Leds deverá ser feito através da rotina de interrupção do timer 0, ou seja, a cada overflow gerado pelo timer, a rotina deverá decidir se é o momento (tempo) correto de deslocar os Leds para esquerda ou direita e enviar para as saídas.

Page 46: Aulas ELE133

Prática 3

Funções e diretiva a serem estudas e utilizadas:

• setup_timer_0()

• set_timer0()

• enable_interrupts()

• #int_timer0 (diretiva de compilação)

Page 47: Aulas ELE133

Prática 4

Implementar a mesma função da prática 3, entretanto, neste caso o elemento que irá controlar a frequência de acionamento dos Led´s deverá ser um potenciometro colocado no canal analógico AN0. O programa deverá configurar o canal analógico na condição de um conversor A/D de 10 bits, efetuar a leitura e estabelecer um valor entre 10 e 1000 ms para o tempo de acionamento de cada Led, ou seja, para os valores compreendidos entre 0 e 1023 lidos do conversor o programa deverá

Page 48: Aulas ELE133

Prática 4

correlacionar com um valor entre 10 e 1000 ms.

Funções e diretivas a serem estudadas:

#device adc=

setup_adc_ports()

setup_adc()

set_adc_channel()

read_adc()

Page 49: Aulas ELE133

Prática 5

Implementar um sistema utilizando o 16F877A que seja capaz de ler um teclado matricial do tipo (teclado telefônico)

Page 50: Aulas ELE133

Prática 5

Para esta implementação deverá ser utilizada a interrupção do timer 0 que deverá controlar uma varredura no teclado a cada 20 ms. O valor lido do teclado deverá ser armazenado em uma variável e enviado para uma das portas de I/O.

Page 51: Aulas ELE133

Prática 5

Tabela de códigos para as teclas:

Page 52: Aulas ELE133

Prática 5

Portas de I/O a serem utilizadas:

Porta RA ---> para realizar a varredura do teclado.

Porta RB ---> para exibir o valor armazenado na variável que armazena o código da

tecla.