Página 1 de 1

sinal de audio

MensagemEnviado: 02 Dez 2010 07:22
por alex1000
pessoal, estoiu usando um 18f2550 para gerar um sinal de audio de 1khz.
fiz um programa básico e no osciloscópio obtive 250 hz.
algo esta errado mas a compreensão me escapa.

programa:
#include<18f2550.h> // tipo de pic
#fuses NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR,INTRC_IO //fuses9
#use delay(clock=4000000) // frequencia utilizada




void main() // função principal
{

set_tris_b(0x00); // seta a direção dos pinos da portB
output_b(0x00); // carrega o valor de portB com 0x00
port_b_pullups(true); //aciona open colector

while(1)
{
output_high(pin_b0); //seta para 1 pino B0
delay_us(500); // mantem a instrução anterior por 0.5 segundos

output_low(pin_b0); //seta para 0 pino B0
delay_us(500); // mantem a instrução anterior por 0.5 segundos
}
}

poderiam dr uma olhada e comentar?

MensagemEnviado: 02 Dez 2010 10:11
por styg
cara, nao manjo de pic, mas tu ta usando 4MHz mesmo?
o clk do pic nao é freq. xtal/4 ?? se for isso deverias ta setando essa linha assim:

#use delay(clock=1000000) // frequencia utilizada

MensagemEnviado: 02 Dez 2010 12:46
por Guri
HEHEHEH...por isso é que programo em ASM...AAAAASSSSSSMMMMMM...

Será que o teu erro não esta no delay de 500us...

Lembra da regra: 1/T...onde 1 é a base de tempo e T é a frequencia, originando assim no time ...

1 / 1000hz = 0.001us, logo para ter a frequencia do jeito que voce fez o sw...vc tem que manter essa relação...

experimenta mexer nesse delay...

Outra alternativa muito elegante e precisa é vc utilizar o sistema DDS por software mesmo, dá para obter um ótima precisão se esse é seu caso...ou também utilizar o timer 1 do pic...

Usa o timer na interrupção, fica mais elegante.

MensagemEnviado: 02 Dez 2010 16:15
por renatokodaira
O oscilador interno do 18F2550 eh de 8MHz, e voce escolheu essa opçao nos fuses. Alem disso voce precisa configurar os POSTSCALER no registrador OSCCON bits 4 a 6 pra ver qual frequencia de clock esta indo realmente para a CPU.

Se voce diz ao compilador que seu clock eh de 4MHz (use delay clock 40000000) mas na verdade ele funciona com outra frequencia, ficarah tudo errado.