Ir ao conteúdo
  • Cadastre-se
Philippe Henrique

Problemas práticos com programação assembly

Recommended Posts

Estou programando em assembly um projeto para a mostra tecnológica do meu curso.

O projeto:

A ideia, quando uma pessoa entrar na sala, o programa deverá ligar todo o sistema da sala, e somente quando a ultima pessoa sair da sala ele irá ser desligado.

Este projeto funciona com 2 sensores, sendo que dependendo se eles forem acionados ou não cada um realiza uma tarefa:

;-- Condições dos sensores:
;   sensor1       sensor2        
;    0                 0               nada acontece
;    0                 1               alguém saiu da sala
;    1                 0               alguém entrou na sala
;    1                 1               nada acontece

 

O problema:

Como ainda estou testando o projeto, substituí os sensores por botões, e a saída que seria o sistema da sala por um led.

No proteus funciona perfeitamente, porém na prática não funciona, só funciona se eu tirar a call delay, mesmo assim o led não fica aceso.

código:

 

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

	list p=16f627A										;Listagem do Microcontrolador utilizado

;-- Arquivos incluidos --
	#include <p16f627a.inc>								;Inclusão dos arquivos do 16f627a

;-- Configurações / Fuse bits --
	__CONFIG _WDT_OFF & _PWRTE_ON & _CP_OFF & _INTOSC_OSC_CLKOUT & _BOREN_OFF

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

;-- Entradas --
	#define		sensor1		PORTB,1					;Sensor1 ligado em RB1 (pino 7)
	#define		sensor2		PORTB,2					;Sensor2 ligado em RB2 (pino 8)

;-- Saídas --
	#define		led1		PORTB,3					;Led1 ligado em RB3 (pino 9)

;-- Paginação de memória --
	#define		bank0		bcf STATUS,RP0			;Cria um Mnemônico para o banco de memória 0
	#define		bank1		bsf STATUS,RP0			;Cria um Mnimônico para o banco de memória 1	

;-- Registradores de uso especial --

	cblock		H'20'

	contador
	d1
	d2
	d3

	endc

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;-- Vetor de reset --

	ORG			0x00								;Endereço inicial de processamento
	goto		inicio								;pula para label 'inicio'

;-- Vetor de Interrupção --
	
	ORG			0x04
	retfie
	
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;-- Sub Rotinas --

delay:
	movlw 		0x08
	movwf 		d1
	movlw 		0x2F
	movwf 		d2
	movlw 		0x03
	movwf 		d3
Delay_0:
	decfsz 		d1, f
	goto 		$+2
	decfsz 		d2, f
	goto 		$+2
	decfsz 		d3, f
	goto 		Delay_0
						;3 cycles
	goto $+1
	nop
	return
						; Generated by htt


;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;-- Início do programa --
inicio:
			bank1								;Seleciona o banco 1 de memória
			movlw 		B'00000000'				;Carrega '00000000' em Work
			movwf		TRISA					;Carrega o conteúdo de Work em TRISA
			movlw		B'00000110'				;Carrega '00000110' em Work
			movwf		TRISB					;Carrega o conteúdo de Work em TRISB
			bank0								;Seleciona o banco 0 de memória
			movlw		H'07'	
			movwf		CMCON					;Desativa os comparadores virtuais no CMCON
			movlw		H'00'					;Carrega '00000000' em Work
			movwf		PORTA					;Inicia todas as portas em low
			movwf		PORTB					;Inicia todas as portas em low
			movwf		contador				;Inicia o contador em '0'
			
;-- Condições dos sensores:
;   sensor1		sensor2		
;	0			0			nada acontece
;	0			1			alguém saiu
;	1			0			alguém entrou
;	1			1			nada acontece

entrar:												
			btfss		sensor1					;Sensor1 =1?
			goto		entrar					;Não/ Retorna para o primeiro teste 'entrar'
			goto		teste_sensor2			;Sim/ Pula para o teste do sensor2
			
teste_sensor2:
			btfss		sensor2					;Sensor2 =1?
			goto		entrou					;Não/ Pula para 'entrou' (significa que alguém entrou)
			goto		entrar					;Sim/ Retorna para 'entrar' capeta (para verificar se alguem entrou)

;-- Correção do erro que se mais de uma pessoa entrasse	
;   continuaria ligando o circuito.	Quando entramos nesse
;   loop, garantimos que se alguém a mais entrar não irá
;   ligar novamente. e este loop também significa que tem
;	alguém dentro da sala.

entrou:
			call		delay					;Delay
			incf		contador,F				;Incrementa o contador, e guarda o resultado nele próprio
			call		liga					;Pula para 'liga'

teste1:
			btfss		sensor1					;Sensor1 =1?
			goto		teste2					;Não/ Pula para 'teste2'
			goto		ts2						;Sim/ Pula para 'ts2'

teste2:
			btfss		sensor2					;Sensor2 =1?
			goto		teste1					;Não/ Retorna para 'teste1'
			goto		ts1						;Sim/ Pula para 'ts1'

ts1:
			btfss		sensor1					;Sensor1 =1?
			goto		decremento				;Não/ Pula para 'decremento'
			goto		teste1					;Sim/ Pula para 'teste1'
			
ts2:
			btfss		sensor2					;Sensor2 =1?
			call		only_inc				;Não/ Pula para 'only_inc'
			goto		teste1					;Sim/ Retorna para 'teste1'
												

			
decremento:
			call		delay
			decfsz		contador,F				;Decrementa o cont, se for = 0 vai para 'desliga'
			goto		teste1					;Retorna para 'teste1'
			goto		desliga
			
			
only_inc:										;Somente incrementa (Não liga o circuito)
			call		delay
			incf		contador,F				;Incrementa o cont, guarda o resultado nele mesmo                                                                                          
			return
		
liga:
			bsf			led1					;Liga o Led
			return

desliga:
			bcf			led1					;Desliga o Led
			goto		entrar					;Retorna ao loop inicial

			end

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que não programas em c senão teria a 'obrigação' de te ajudar kk

 

Não devo te ajudar com o assembly. Vou chutar que, como estás a usar botões, na prática hás de considerar o tal deboucing. Algo rápido a fazer é colocar um capacitor em paralelo com botões. Melhor se as entradas do mc forem smith trigger

Também verifique os fuses. Tens certeza que precisa do clock no pino ? (_INTOSC_OSC_CLKOUT)

Outro chute: a saída que estás a usar realmente é push pull? Algumas são só open colector.

+1: não estaria faltando algum pullup ou down?

chega

 

Talvez o defeito esteja entre a cadeira e o teclado. Neste caso, pelo menos temos algo em comum kk

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendo muito de assembly... vou apenas jogar umas ideias no ar:

mas como é o sensor atual? tipo de passagem? por feixe de luz?

você está utilizando um contador? 10 pessoas entraram, 9 saíram, então ainda tem 1 pessoa na sala...

se for algo assim, pode ser que o fato de entrarem ou saírem duas pessoas ao mesmo tempo, gere apenas um acionamento do sensor, e com isso erro na contagem...

 

você já pensou em usar sensor de presença? e junto com ele colocar um código temporizador, tipo assim (se o sensor não der sinal por mais de X minutos, ele entende que não tem ninguém na sala, e desliga o sistema)

lembrando que esta opção pode gerar um pouco de gasto extra de energia, quando todos saírem da sala ele ficará estes X minutos ainda em funcionamento.

 

fiz aqui em casa um sistema que usava dois tipos de sensores juntos (luminosidade e presença) com isso caso duas situações fossem atendidas, o sistema ligava. portanto você também pode usar dois ou mais sensores/métodos ao mesmo tempo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, BloodCeltics Lopes disse:

não entendo muito de assembly... vou apenas jogar umas ideias no ar:

mas como é o sensor atual? tipo de passagem? por feixe de luz?

você está utilizando um contador? 10 pessoas entraram, 9 saíram, então ainda tem 1 pessoa na sala...

se for algo assim, pode ser que o fato de entrarem ou saírem duas pessoas ao mesmo tempo, gere apenas um acionamento do sensor, e com isso erro na contagem...

 

você já pensou em usar sensor de presença? e junto com ele colocar um código temporizador, tipo assim (se o sensor não der sinal por mais de X minutos, ele entende que não tem ninguém na sala, e desliga o sistema)

lembrando que esta opção pode gerar um pouco de gasto extra de energia, quando todos saírem da sala ele ficará estes X minutos ainda em funcionamento.

 

fiz aqui em casa um sistema que usava dois tipos de sensores juntos (luminosidade e presença) com isso caso duas situações fossem atendidas, o sistema ligava. portanto você também pode usar dois ou mais sensores/métodos ao mesmo tempo.

 

Bom.. O sensor seria o de feixe de luz mas eu não estou utilizando sensores por enquanto, como disse substituí por botões. Mas valeu pela ideia do sensor de presença, vai ajudar bastante. 

 

adicionado 3 minutos depois
1 hora atrás, Isadora Ferraz disse:

Que bom que não programas em c senão teria a 'obrigação' de te ajudar kk

 

Não devo te ajudar com o assembly. Vou chutar que, como estás a usar botões, na prática hás de considerar o tal deboucing. Algo rápido a fazer é colocar um capacitor em paralelo com botões. Melhor se as entradas do mc forem smith trigger

Também verifique os fuses. Tens certeza que precisa do clock no pino ? (_INTOSC_OSC_CLKOUT)

Outro chute: a saída que estás a usar realmente é push pull? Algumas são só open colector.

+1: não estaria faltando algum pullup ou down?

chega

 

Talvez o defeito esteja entre a cadeira e o teclado. Neste caso, pelo menos temos algo em comum kk

 

Vou tentar o capacitor em paralelo com o botão, tem ideia de qual valor seria o capacitor?

 

Sobre o oscilador estou utilizando o interno do pic, mas n utilizo nenhum pino do PORTA.

 

E o que seria push pull?

Compartilhar este post


Link para o post
Compartilhar em outros sites

entre 1 e 100nF

 

_INTOSC_OSC_CLKOUT intuitivamente faz com que o pino saia o clock no pino. Já ouvi falar de intosc_io = pino =i/o. Clock só fica interno mesmo.

 

é quando a saída=1 meio que causa um curto entre saída e vcc e quando=0, causa um curto entre saida e gnd. Open colector (ou drain) só dá curto entre saída e gnd. Ou seja só acende led se catodo nele.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz Vou dar uma verificada nessas coisas, n tenho certeza se o resistor de pullup está ligado corretamente, depois posto o resultado aqui, obrigado :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×