Ir ao conteúdo

Outro Assembly ATMEGA328p - Botão com diferentes funcionalidades


Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Postado

Olá a todos.

 

Estou fazendo um programa em Assembly usando ATMEGA328p e preciso fazer um programa que inicie com o led apagado e após apertar um botão, o led deve ficar aceso e, ao apertar novamente, deve ficar piscando. Ao apertar o botão novamente, o led deve ficar aceso e, se apertar novamente, deve ficar piscando, e assim sucessivamente.

 

consigo fazer a lógica de deixar um led aceso enquanto o botão está pressionado, porém preciso que ele fique aceso por tempo indeterminado após o clique, mesmo que eu solte o botão depois.

 

Vi que nesse post: 

 há uma relação com o que eu quero fazer, mas o código que foi disponibilizado era com 3 leds e no meu caso só preciso de 1 led. Gostaria de utilizar a lógica de incrementar alguma variavel e fazer um if para ver em qual situação o botão se encontra, que foi sugerido no post acima.

 

Segue o meu código atual para acender um led enquanto o botão está pressionado:

 

.org 0x00				;Origem no endereço de 00hexa de memória

start:
    LDI r16,0x80		;Carrega 80hexa no registrador auxiliar 16
	OUT DDRD, r16		;Configura PORTD7 como saída
	LDI r16,0x40		;Carrega 40hexa no registrador auxiliar 16
	OUT PORTD,r16		;Inicializa PD7 em LOW, habilita pull-up em PD6

	NOP

loop:
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para ligar LED
	CBI  PORTD,PD7		;Sim, desliga LED
	RJMP loop			;Desvia de volta para label loop

led_on:
	SBI  PORTD,PD7
	RJMP loop

 

  • Solução
Postado
.org 0x00				;Origem no endereço de 00hexa de memória

start:
    LDI r16,0x80		;Carrega 80hexa no registrador auxiliar 16
	OUT DDRD, r16		;Configura PORTD7 como saída
	LDI r16,0x40		;Carrega 40hexa no registrador auxiliar 16
	OUT PORTD,r16		;Inicializa PD7 em LOW, habilita pull-up em PD6

	NOP
	CBI  PORTD,PD7		;desliga LED

loop:
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para ligar LED
	JMP loop			;Desvia de volta para label loop

loop1:
	SBIS PIND,PD6		;Botão solto?
	RJMP pisca_led		;Não, desvia para piscar LED
	RJMP loop1			;Desvia de volta para label loop1

pisca_led:
	;escreva aqui código para o led ficar piscado
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para acender LED
	RJMP pisca_led	

led_on:
	SBI  PORTD,PD7
	RJMP loop1

 

Postado
12 minutos atrás, Flávio Pedroza disse:
.org 0x00				;Origem no endereço de 00hexa de memória

start:
    LDI r16,0x80		;Carrega 80hexa no registrador auxiliar 16
	OUT DDRD, r16		;Configura PORTD7 como saída
	LDI r16,0x40		;Carrega 40hexa no registrador auxiliar 16
	OUT PORTD,r16		;Inicializa PD7 em LOW, habilita pull-up em PD6

	NOP
	CBI  PORTD,PD7		;desliga LED

loop:
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para ligar LED
	JMP loop			;Desvia de volta para label loop

loop1:
	SBIS PIND,PD6		;Botão solto?
	RJMP pisca_led		;Não, desvia para piscar LED
	RJMP loop1			;Desvia de volta para label loop1

pisca_led:
	;escreva aqui código para o led ficar piscado
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para acender LED
	RJMP pisca_led	

led_on:
	SBI  PORTD,PD7
	RJMP loop1

 



MUITO OBRIGADO!

@Flávio Pedroza você consegue me ajudar na lógica do led piscando? não sei se tenho que incluir mais coisas no método de "start". preciso que o led pisque de 1 em 1 segundo, creio que seja algo simples, mas estou começando a programar em assembly agora....

 

Postado
.org 0x00				;Origem no endereço de 00hexa de memória

start:
    LDI r16,0x80		;Carrega 80hexa no registrador auxiliar 16
	OUT DDRD, r16		;Configura PORTD7 como saída
	LDI r16,0x40		;Carrega 40hexa no registrador auxiliar 16
	OUT PORTD,r16		;Inicializa PD7 em LOW, habilita pull-up em PD6

	NOP
	CBI  PORTD,PD7		;desliga LED

loop:
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para ligar LED
	JMP loop			;Desvia de volta para label loop

loop1:
	SBIS PIND,PD6		;Botão solto?
	RJMP pisca_led		;Não, desvia para piscar LED
	RJMP loop1			;Desvia de volta para label loop1

pisca_led:
	SBI  PORTD,PD7		; acende led
	RCALL delay_1sec		
	CBI  PORTD,PD7 		;apaga led
	
	SBIS PIND,PD6		;Botão solto?
	RJMP led_on			;Não, desvia para acender LED
	RJMP pisca_led	

led_on:
	SBI  PORTD,PD7
	RJMP loop1

delay_1sec:
	;escreva aqui um código que pause a execução do progarama por um segundo
	ret

O jeito mais simples é você acender o led, pausar um segundo e depois apagar. Basta agora você implementar o código que gera o delay de um segundo.

  • Membro VIP
Postado
9 horas atrás, aphawk disse:

Mamão com açúcar ...

 

aulo

Aulão... quando a pessoa se torna um visitante penso que ela não está mais entre nós. Por algum motivo se descadastrou. Talvez tenha colocado o nome verdadeiro, nick social conhecido ou do gênero ou se acanhou por algum motivo. Talvez pra se esconder do professor ou do gênero.

 

11 minutos atrás, vtrx disse:

este microcontrolador,ele é bem interessante,pena que ainda é caro

Seu "concorrente" quase direto é o pic16f886 que é ainda + caro. A linha STM8 e STM32 é barata bem como a MSP430

(a pesquisar...)

  • Triste 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!