Ir ao conteúdo
  • Cadastre-se

Problemas práticos com programação assembly


Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

 

Link para o comentário
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.

 

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!