printf transmite valores negativos pela serial

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

printf transmite valores negativos pela serial

Mensagempor kunde » 01 Nov 2007 14:54

Olá pessoal.
Estou usando um PIC16F628A para ler uma frequência de entrada de um sinal quadrado.
Este sinal varia a frequência rapidamente no tempo, por isso resolvi contar o tempo de cada borda descendente em um pino do PIC.
Toda vez que transmito o tempo lido pela RS232 obtenho vários valores negativos.
Vejam o trecho do código.

#INT_EXT
void intEXT()
{
if (enable) {
time = get_timer0();
printf(" :%d", time);
//calcFreq(time);
set_timer0(0);
}
}


O interessante é que se testo o código, ou debugo ele o valor de timer nunca aparece como negativo. Só acontece quando uso o printf.
Alguem sabe me explicar o que esta acontecendo ou como posso contornar o problema?

Obrigado!




ps: A serial esta configurada com #use rs232 com taxa de 57600
kunde
Bit
 
Mensagens: 17
Registrado em: 14 Fev 2007 22:52

Mensagempor Fábio Pereira » 01 Nov 2007 15:07

Isto porque %d é para valores signed. Assim, qualquer valor maior que 32767 será considerado negativo.

Experimente utilizar %u e seja feliz.

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor kunde » 01 Nov 2007 15:13

Então Fábio.
Vc esta certo, porém minha variável time é unsigned int e teoricamente o timer0 do PIC16F628 conta até 256.
Realmente o valor negativo que vejo parece ser um complemento.
Mas será q o timer esta contando mais que 256 mesmo configurado para 8bits?

Abraço
kunde
Bit
 
Mensagens: 17
Registrado em: 14 Fev 2007 22:52

Mensagempor Doglao » 01 Nov 2007 15:45

a sua variavel continua sendo unsigned como declarada, mas para mostrar ela como unsigned tem que se usar mesmo %u para ter o efeito desejado na sua visualizacao.
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Fábio Pereira » 01 Nov 2007 18:32

Bom,

No caso do CCS (int = 8 bits), qualquer valor acima de 127 (ou 32767 no caso de uma variável long int) será considerado negativo se for impresso utilizando o %d.

Ps.: não, o seu timer 0 não está contando além de 255!

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON


Voltar para PIC

Quem está online

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

x