Aulas ELE133

Post on 21-Jun-2015

268 views 0 download

Transcript of Aulas ELE133

ELE133 Microprocessadores

Universidade Gama Filho

Curso de Engenharia Elétrica

Prof. Neury Nunes Cardoso

(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.

Funções Básicas

• Endereçamento de instruções e dados

• Ciclo de instruções

• Atendimento de interrupções

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

Microcontroladores Componentes internos

• Conversores A/D

• Entradas e saídas digitais

• Módulos CCP e PWM

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

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)

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

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.

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.

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.

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.

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.

Tratamento de interrupções

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.

Interrupções usando C

Vantagem

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

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.

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:

Interrupções usando C

Exemplo

#int_timer0

void rotina_timer0(void)

{

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

}

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.

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.

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.

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.

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;

}

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.

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.

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.

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

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.

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

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).

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.

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).

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.

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.

Prática 3

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)

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.

Funções

Formato geral:

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

{

//bloco de comandos

comando 1;

comando 2;

.....

}

Funções

Exemplo:

int quadrado (int a)

{

//multiplica a por a e retorna o resultado

return a*a;

}

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

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.

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.

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.

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.

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.

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)

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á

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()

Prática 5

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

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.

Prática 5

Tabela de códigos para as teclas:

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.