Anda di halaman 1dari 7

EXERCCIOS mdulo 4 Eletrnica Resoluo por: Fbio Bezerra de Souza Facens 2011

1) Fazer um programa em assembly do 8515 para encontrar o valor FFH numa tabela iniciada no endereo 100H da RAM com 50 elementos e substitu-lo por 00H. .include"8515def.inc" .def numero = r18 .dseg .org 0x100 NUM: .BYTE 50 .cseg ldi numero,0 ldi r16,0x00 loop: ldi YL,LOW(NUM) ldi YH,HIGH(NUM) add YL,numero ld r17,Y cpi r17,0xFF brne fim st Y,r16 fim: inc numero ;incrementa contador cpi numero,50 ;compara com 50 breq fim_varredura ;pula para fim_varredura se chegou a 50 rjmp loop ;se no volta a ler valores fim_varredura: rjmp fim_varredura ;fim, loop infinito 2) Fazer um programa em assembly do 8515 para ler a tecla CH0 da figura abaixo. A condio inicial LED0=1, LED1=0, LED2=0, LED3=0. Se o valor lido for 0, deslocar os LEDs em um sentido. Se o valor lido for 1 deslocar no sentido contrrio. Colocar comentrios no programa. ;carrega o endereo(LOW) de NUM em YL ;carrega o endereo(HIGH) de NUM em YH ;soma numero ao ponteiro da tabela ;carrega o valor da posio corrente da tabela em r17 ;compara o valor lido com 0XFF ;salta para fim se n for igual a 0xFF ; igual, ento substitui pelo valor em r16(0x00) ;renomeia R18 como numero ; ;reserva 50 bytes a partir do endereo 0x100

;inicia numero com 0 ;carrega 0x00 em r16

.include "8515def.inc"

.def Aux = r16 .def tempo1 = r17 .def tempo2 = r18 .def tempo3 = r19 .cseg Ldi Aux,0x0F out DDRB, r16

;renomeia r16 como Aux ;renomeia r17 como tempo1 ;renomeia r18 como tempo2 ;renomeia r19 como tempo3

;carrega Aux com 0x0F ;configura PORTB para os ;PB0 a PB3 como Sada ;PB4 a PB7 como entradas ;carrega aux com 0x01 para inciar leds ;Atualiza portb com o valor de aux ;CH0 == 1 ;no, ento vai para rotao direita ;sim, ento ;rotate left ;vai para continua ;rotao para direita ;rotete rigth ;continua ;delay ;carrega tempo3 com 5 ;rotina de delay ;decrementa tempo1 ;pula p delay se n chegou a zero ;decrementa tempo2 ;pula p delay se n chegou a zero ;decrementa tempo 3 ;pula p delay se n chegou a zero ;volta para o loop principal

Ldi Aux, 0x01 loop: out PORTB, AUX sbis PINB,4 rjmp rotaciona_dir rol Aux rjmp continua rotaciona_dir: ror Aux continua: ldi tempo3,5 delay: dec tempo1 brne delay dec tempo2 brne delay dec tempo3 brne delay rjmp loop

3) O conversor A/D de aproximaes sucessivas da figura abaixo converteu um valor de tenso (Vin=3,2V) em um valor digital que est disponvel no PORTA. Mostrar qual o valor digital convertido e fazer um software em assembly do 8515 para armazenar esse valor lido na posio 60H da RAM interna.

.include "8515def.inc" .def Aux = r16 ldi Aux, 0x00 out DDRA, Aux ldi Aux, 0xFF out DDRB, Aux in Aux,PINA out PORTB, Aux ldi YL, LOW(0x60) ldi YH, HIGH(0x60) st Y,Aux loop: rjmp loop 4) Usando o circuito da questo anterior, fazer um software em assembly do 8515 para ler 50 valores do conversor A/D de aproximaes sucessivas a cada 10 ms e armazen-los a partir do endereo 60H da RAM interna. .include"8515def.inc" .def Aux = r16 .def tempo1 = r17 .def tempo2 =r18 .def numero = r19 .equ CS .equ RD .equ WR = PC0 = PC1 = PC2 ;carrega 0x00 para AUX ;configura PORTA como entrada ;carrega )xFF em Aux ;configura PORTB como sada ;le o valor do conversor AD ;Exibe valor no PORTB ;armazena endereo 0x60 ;armazena o valor lido na posio 0x60 da RAM

;renomeia R18 como numero

.dseg .org 0x60 NUM: .BYTE 50

; ;reserva 50 bytes a partir do endereo 0x100

.cseg ldi numero,0 ldi Aux,0X00 out DDRA,Aux ldi Aux, 0x07 out DDRC, Aux cbi sbi loop: cbi PORTC,RD in Aux, PINA sbi PORTC, RD ldi YL,LOW(NUM) ldi YH,HIGH(NUM) add YL,numero st Y,r16 PORTC,CS PORTC,WR

;inicia numero com 0

;configura PORTA como entrada ; configura PC0 a PC2 como Sada ;habilita conversor AD ;desabilita escrita no AD ;habilita leitura ;le o valor da converso ;carrega o endereo(LOW) de NUM em YL ;carrega o endereo(HIGH) de NUM em YH ;soma numero ao ponteiro da tabela ;grava valor na RAM ;compara com 50 ;pula para fim_leitura se chegou a 50

inc numero cpi numero,50 breq fim_leitura ldi tempo2,156 delay: dec tempo1 brne delay dec tempo2 brne delay rjmp loop fim_leitura: rjmp fim_leitura ;

1/4MH * 255 * 256 = 10ms

5) Fazer um software em assembly do 8515 para ler o dado armazenado no endereo 100H da RAM e coloc-lo no conversor D/A. Mostrar o valor Vout da tenso de sada do conversor D/A. Endereo 100H Contedo 0CH

.include"8515def.inc" .def Aux = r16 .dseg .org 0x100 NUM: .BYTE 1 .cseg ldi Aux, 0XFF out DDRB, Aux ldi YL,LOW(NUM) ldi YH,HIGH(NUM) ld Aux,Y out PORTB, Aux loop: rjmp loop ;carrega 0xff em Aux ;configura PORTB como sada ;carrega o endereo(LOW) de NUM em YL ;carrega o endereo(HIGH) de NUM em YH ;le o valor da posio 0x100 ;escreve valor lido no PORTB ;renomeia R16 como Aux ; ;reserva 1 bytes a partir do endereo 0x100

6) Fazer um programa em assembly do 8515 para ler o teclado (CH0-CH3) da figura abaixo e colocar o valor lido nos LEDs (LED0-LED3). Colocar comentrios no programa.

.include"8515def.inc" .def Aux = r16 .cseg ldi Aux, 0X0F out DDRA, Aux ;carrega 0x0F em Aux ;configura PA0 a PA3 como sada ;PA4 a PA7 como entrada ; renomeia r16 como Aux

loop: in Aux,PINA swap Aux out PORTA, Aux rjmp loop ;le o valor no PORTA e armazena em Aux ;troca nibbles ;carrega Aux em PORTA ;volta para loop

7) Programar o Timer0 do microcontrolador 8515 para gerar uma forma de onda quadrada de 100 Hz. Use o pino PB0 como sada. Usar interrupo por overflow do Timer0. ; freqncia do cristal = 3,69 MHz ; freqncia do Timer/Counter0 = 3,69 MHz / 1024 = 3,6 KHz o Perodo = 277,5 us ; intervalo de tempo at o estouro do Timer/Counter0 = 18 * 277,5 us = 5ms .include "8515def.inc" .def Aux = r16 .def Contador = r17 .cseg .org .org $0000 rjmp RESET $0007 rjmp TIMER0_OVF Aux, HIGH(RAMEND) ; definindo o fim da SRAM como incio da pilha SPH, Aux ; escreve endereo no ponteiro da pilha (parte alta) Aux, LOW(RAMEND) ; SPL, Aux ; escreve endereo no ponteiro da pilha (parte Aux, 0b00000001 DDRB, Aux Aux, 0b00000000 PORTB, Aux r16, 0b00000101 TCCR0, Aux Contador, 7 Aux, 0b00000010 ; carrega valor 0x01 em Aux ; move valor 0x01 para DDRB (PB0 sada) ; carrega valor 0x00 em Aux ; move valor 0x00 em PORTB (PORTB em ZERO) ; carrega valor 0x05 em Aux ; a freqncia do Timer/Counter0 ser CK / 1024 = 3,6 KHz ; carrega Contador com valor 7 (contador de estouros) ; carrega valor 0x02 em Aux ; renomeia r16 como Aux ; renomeia r17 como Contador

RESET: ldi out ldi out baixa) ldi out ldi out ldi out ldi ldi

out TIMSK, Aux ldi Aux,(255-18) ; out TCNT0,Aux sei VOLTA: rjmp VOLTA

; habilita interrupo por overflow do Timer/Counter0 ;inicia TIMER ; habilita interrupes (bit I em SREG setado) ; pula para VOLTA

; Sub-rotina de tratamento de interrupo por Overflow do Timer/Counter0 TIMER0_OVF: in Aux, PORTB ; l valor no PORTB (sada) com Aux ; complementa Aux out PORTB, Aux ; escreve na sada PB0 ldi Aux,(255-18) ; out TCNT0,Aux ;inicia TIMER FIM: reti ; retorno de interrupo

Anda mungkin juga menyukai