16F84A - Código Fonte, Dúvidas

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

16F84A - Código Fonte, Dúvidas

Mensagempor Renato_mcl » 19 Abr 2007 11:28

Olá pessoal,

Montei o carregador de baterias do link abaixo a cerca de um ano, o máximo que eu sabia era gravar o PIC e colocar para rodar.

http://home.planet.nl/~j_havinga/BattCh ... harger.htm

Hoje não sou tão leigo, estudo o 16F628A e tento entender o 16F84A através da web.

Alguns exemplos que não consigo entender:

No IRQ handler tem esta linha:
btfsc CURRENT_STATE,STATE_CHARGE_READY ; not charging anymore, goodbye (do not enable irq again )

Não está defindo no programa CURRENT_STATE,STATE_CHARGE_READY
No programa aparece assim
CURRENT_STATE equ H'14'
#define STATE_CHARGE_READY 0

Tem outra linha assim
loop goto loop ; wait for interrupt

Não aparece loop em outra linha do programa.

Tem outras linhas iguais ao primeiro exemplo.
Se alguém puder analisar o fonte original no link que passei e postar comentários eu agradeço.

Grato

Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Hogmoho » 19 Abr 2007 14:01

Saudações Renato

Você notou a virgula ? São duas variáveis distintas.
E logo abaixou elas estão com valores atribuidos.

Marcelo
Hogmoho
Bit
 
Mensagens: 9
Registrado em: 13 Out 2006 08:48

Mensagempor Renato_mcl » 19 Abr 2007 15:33

Olá Hogmoho,

Eu tinha visto a vírgula sim, mas não entendi, inclusive tem outras instruções com duas variáveis e espaço entre a vírgula e a variável seguinte, este exemplo que postei não tem espaço.

Bom, eu ainda não tinha visto isto no assembly, como funciona?
BTFSC - testa as duas variáveis? e se uma é 0 e a outra é 1?

E quanto a linha com o loop, qual a sua opinião?


Grato

Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor fabim » 19 Abr 2007 15:46

btfsc CURRENT_STATE,STATE_CHARGE_READY ..

CURRENT_STATE é uma variavel
STATE_CHARGE_READY é uma constante

mesmo que.
BTFSC
testa o bit STATE_CHARGE_READY"obs de 0 a 7 normalmente"
Da variavel CURRENT_STATE e pula a proxima linha se o resultado 0 for positivo.

CURRENT_STATE = status...
STATE_CHARGE_READY é o bit pra saber se pode ou não ligar o gie ou pra saber se o bit identifica a ocorrencia que le esperava pra executar a rotina.. coisas do tipo

Abraços

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Renato_mcl » 19 Abr 2007 18:16

Legal Fabim,

Vamos ver se eu entendi, sempre que aparecer este tipo de instrução "variável,constante" vai testar primeiro a constante e depois a variável?
Esta é uma forma de utilizar menos linhas de instrução?

Tenho que ralar muito pra entender os códigos mais complexos e sem comentários que ajude a esclarecer.
Pra complicar, alguns comentários deste programa estão em Holandês.

Obrigado

Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor zielpunkt » 19 Abr 2007 18:37

É assim...
Código: Selecionar todos
CURRENT_STATE equ H'14' ; ->denomina o registrador do end 0x14 da RAM de "CURRENT_STATE";
#define STATE_CHARGE_READY 0 ; ->bit '0' desse registrador;

Então...
Código: Selecionar todos
btfsc CURRENT_STATE,STATE_CHARGE_READY ; -> testa bit '0' do registrador que vc chamou de 'CURRENT_STATE'

Também...
Código: Selecionar todos
loop goto loop ; wait for interrupt... -> é um loop que não sai do mesmo lugar, esperando por uma interrupção acontecer.

É isso.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor fabim » 20 Abr 2007 08:39

porcamente traduzindo é a mesma coisa que zielpunkt explicou mais...

var
CURRENT_STATE : byte;

const
STATE_CHARGE_READY : byte = 0;


codigo de execução.
asm
btfsc CURRENT_STATE,STATE_CHARGE_READY
end

porcamente traduzido.

btfsc == testa se zero e pula a proxima linha se sim, se diferente de zero executa a proxima linha.

Intão

testa se o bit "STATE_CHARGE_READY " da variavel CURRENT_STATE é zero e pula a proxima linha se sim..

seria o mesmo que.

btfsc CURRENT_STATE, 0

é isso

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Renato_mcl » 20 Abr 2007 22:09

Porcamente não Fabim,

Achei excelente a explicação, você não imagina o quanto me ajudou.


Obrigado a todos,


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor Renato_mcl » 28 Mai 2007 20:26

Olá pessoal,

Depois de muito ralar consegui fazer o circuito funcionar.
O problema estava na Rotina do LCD que travava tudo, descobri depois que simulei no Proteus.
Para corrigir esta rotina levei um bom tempo porque eu não sabia como funcionava o LCDl, aprendi graças a ajuda de vários forsitas.
Já recarreguei várias pilhas recarregáveis, desliga automático qdo as mesmas completam a carga.
Para quatro pilhas funciona bem, agora estou tentando carregar uma pilha por vez, porém a tensão na entrada do LM 311 fica abaixo do estipulado pelo autor.

Comentários do autor que pode ser visto no link que postei no inicio do tópico:

The LM311 comparator, together with the PIC serves as a simple (non-linear) ADC. The absolute ADC-output value is not important, since only the change in battery voltage is considered. The charging current is switched off when the battery voltage is sampled (each second). The resistor pair R6/R8 should be configured such that the maximum battery voltage is measured in the range 0xE0 .. 0xE8 by the ADC. Then, since the ADC is non-linear, the ADC is sensitive enough to detect a negative slope in time.

Não sei o que deve ser alterado para carregar uma ou duas pilhas por vez.
Alterei o R6 do divisor resistivo na entrada Vin+, e aí a tensão fica abaixo do estipulado e não desliga automático.

Agradeço se puderem me ajudar.


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor zielpunkt » 30 Mai 2007 21:30

Me parece que o AO recebe a referência na entrada não-inversora a partir do +5V. Talvez explique o fato de ele não responder corretamente a partir da tensão de uma única pilha. Poderia tentar mudar essa referência por meio de um divisor resistivo (trim-pot). Observe que no esquema o autor cita que podem ser necessárias mudanças em C4/R7, também.

Abço.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor Renato_mcl » 13 Jun 2007 09:40

Olá a todos,

Não tentei as alterações sugeridas pelo Zielpunkt, porque ainda não consegui entender como este AO funciona no circuito.
Encontrei muita informação na internet sobre Amplificador Operacional, porem nada que explique como fuciona o LM311 da maneira que está no meu circuito.
Tenho feito uma quantidade enorme de simulações no Proteus e não consigo "pegar" quando e como acontece a variação na saida do AO.
No proteus coloquei um resisitor variável no R6 para simular a queda de tensão durante a carga, funciona como se fosse o circuito real carregando pilhas recarregáveis.
Interessante que qdo provoco a queda de tensão através do R6, cerca de 1 segundo depois desliga a carga das pilhas.

Tentei simular só o LM311 sem o PIC, mas não deu certo não.
Pensei em comprar o Livro Amplificadores Operacionais do autor Antonio Pertence Junior (R$62,00), mas não sei se vale a pena para o meu caso que é apenas Hobby.

Agradeço se puderem opinar,


Renato
Renato_mcl
Byte
 
Mensagens: 204
Registrado em: 04 Dez 2006 20:34

Mensagempor fabim » 13 Jun 2007 09:54

o LM311 é um comparador..........................

Se ele tem um resistor de 100K e um capacitor de 470nF..

5V esta para .

T = 100 000 * 0.000470

T = 47mS...

Funciona assim...

Setasse o transistor para zerar o capacitor, depois o camarada libera o transistor e começa a contar tempo até que a tensão de in - seja > in +.
Neste momento a saida vai para zero e o cara breca o timer.

Suponha que o tempo foi de 18mS.
intão 18mS esta para quantos volts ?
5V / 47 = 0,106V @mS...
18mS do tempo de captura * 0.106V = 1,872V.....

Cara.. vc precisa treinar mais o seu raciocinio de analogicos.. Não adianta vc ser um expert de digitais se num sabe nem entender lógica discreta.. Apenas um comentário.... Não leve a mal. é apenas pra encher o seu saco pra vc ficar mais animado pra pesquisar sobre discretos..

Abração, espero ter lhe ajudado.

Fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x