Página 1 de 1

16F84A - Código Fonte, Dúvidas

MensagemEnviado: 19 Abr 2007 11:28
por Renato_mcl
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

MensagemEnviado: 19 Abr 2007 14:01
por Hogmoho
Saudações Renato

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

Marcelo

MensagemEnviado: 19 Abr 2007 15:33
por Renato_mcl
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

MensagemEnviado: 19 Abr 2007 15:46
por fabim
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

MensagemEnviado: 19 Abr 2007 18:16
por Renato_mcl
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

MensagemEnviado: 19 Abr 2007 18:37
por zielpunkt
É 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.

MensagemEnviado: 20 Abr 2007 08:39
por fabim
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

MensagemEnviado: 20 Abr 2007 22:09
por Renato_mcl
Porcamente não Fabim,

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


Obrigado a todos,


Renato

MensagemEnviado: 28 Mai 2007 20:26
por Renato_mcl
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

MensagemEnviado: 30 Mai 2007 21:30
por zielpunkt
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.

MensagemEnviado: 13 Jun 2007 09:40
por Renato_mcl
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

MensagemEnviado: 13 Jun 2007 09:54
por fabim
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