Página 1 de 1

Como pode ser tão difícil algo tão simples...

MensagemEnviado: 20 Mai 2007 11:24
por Fabio_Jerena
Bom pessoal, aqui estou com uma dúvida que chega ser patética, não consigo entender como pode ser tão difícil fazer algo tão simples funcionar...
Olhem este programa:

#include <16F628A.h>
#use delay(clock=4000000)
#fuses NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#use fast_io(a)
#use fast_io(b)

#byte porta = 0x05
#byte portb = 0x06

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As saídas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.


#bit led1 = portb.1 // acende Led1
#bit led2 = portb.2 // acende Led2

void main()
{
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(false);
setup_timer_1(T1_DISABLED);



set_tris_a(0b00000000); // configuração da direção dos pinos de I/O
set_tris_b(0b00000000);

porta=0x00; // limpa porta
portb=0x00; // limpa portb

led1=1;
led2=0;


while(true)
{
led1=!led1;
led2=!led2;
delay_ms(1000);
}
}

E no Proteus versão 6.7 SP3 eu simulo e só um led pisca...
Eu fiz esse programa para testar um circuitinho de decoder do HT6P20B, se esse programa extremamente simples já não quer funcionar que dirá o do decoder que têm uma porção de funções, procedimentos e etc...
Pior que na prática funcionou... Será que eu posso estar comendo bola em alguma coisa, o Proteus têm muitos buggs??? Nunca usa mas quando vou usar dá esses pepinos...
Pior que eu estou desenvolvendo esse programinha para o HT6P20B sem um osciloscópio para me orientar...
Alguém já fez o decoder para esse cara em C, que técnica usou, estou usando o CCP para identificar os bits!!!
Muito obrigado!!!

MensagemEnviado: 20 Mai 2007 12:21
por proex
Cuidado com o Proteus, ele falha e nao simula corretamente muitas coisas, coisa até simples. (mesmo estando corretamente ajustado)

É imprevisivel. Ja tentei simular coisas simples que na pratica funcionavam mas ele nao simulava corretamente nem a pau.

Outras vezes conseguia simular coisa complexas numa boa.

Particularmente nao acho o PRoteus um software totalmente confiavel.

MensagemEnviado: 20 Mai 2007 12:46
por MOR_AL
Olá Fabio_Jerena.

Quando se altera o estado de algum pino de saída, deve-se aguardar que a sua tensão chegue à tensão do valor lógico desejado. Somente depois é que deve-se alterar outro pino da mesma porta.
Sempre haverá uma capacitância equivalente, existente na impedância de carga conectada ao pino.
Quando você escreve em algum pino, o PIC primeiro lê a porta e depois altera. Se a segunda alteração for efetivada antes que a tensão do pino da primeira alteração chegue ao seu valor, que define o estado lógico, a alteração anterior retornará ao valor antigo.

Existem várias maneiras de contornar este problema:
1 - Use uma variável tipo "portb_espelho". Faça todas as alterações que você quizer nesta variável e depois copie-a para "portb".
2 - Escreva no pino desejado. Aguarde algum tempo (talvez 10 a 100 micro segundos) e agora já pode escrever no outro pino da porta.


Espero ter ajudado.

MOR_AL

MensagemEnviado: 20 Mai 2007 13:53
por J.lius
Para qual copilador e este programa?

Por que tudo...
set_tris_a(0b00000000); // configuração da direção dos pinos de I/O
set_tris_b(0b00000000);

se na verdade os leds tem que piscar?

#bit led1 = portb.1 // acende Led1
#bit led2 = portb.2 // acende Led2
não deveria ser...
#bit led1 = pin_b1 // acende Led1
#bit led2 = pin_b2 // acende Led2

MensagemEnviado: 24 Mai 2007 19:29
por Fabio_Jerena
MOR_AL escreveu:Olá Fabio_Jerena.

Quando se altera o estado de algum pino de saída, deve-se aguardar que a sua tensão chegue à tensão do valor lógico desejado. Somente depois é que deve-se alterar outro pino da mesma porta.
Sempre haverá uma capacitância equivalente, existente na impedância de carga conectada ao pino.
Quando você escreve em algum pino, o PIC primeiro lê a porta e depois altera. Se a segunda alteração for efetivada antes que a tensão do pino da primeira alteração chegue ao seu valor, que define o estado lógico, a alteração anterior retornará ao valor antigo.

Existem várias maneiras de contornar este problema:
1 - Use uma variável tipo "portb_espelho". Faça todas as alterações que você quizer nesta variável e depois copie-a para "portb".
2 - Escreva no pino desejado. Aguarde algum tempo (talvez 10 a 100 micro segundos) e agora já pode escrever no outro pino da porta.


Espero ter ajudado.

MOR_AL


Cara, não é que o Proteus simula até isso, brincadeira viu...
Olha só esse trecho de programa:

while(true)
{
led_green = 1;
led_red = 0;
delay_ms(200);
led_green = 0;
led_red = 1;
delay_ms(200);
}

Se vc simula no proteus dá pau nso leds, eles não piscam, um sempre para...
Agora se fizer:

while(true)
{
led_green = 1;
delay_us(5);
led_red = 0;
delay_ms(200);
led_green = 0;
delay_us(5);
led_red = 1;
delay_ms(200);
}

Funciona bonitinho que dá gosto... Agora se essa fosse minha primeira experiência eu tinha rancado todos os meus cabelos!!!

Obrigado pela ajuda, caiu a ficha!!!

MensagemEnviado: 26 Mai 2007 15:33
por MOR_AL
Beleza!
MOR_AL