Oi pessoal, é comum fazer um programa que no Proteus roda tudo direitinho e quando coloca no pic e vai rodar só dá erro?

Já verifiquei se existe algum erro na placa e está tudo certo,.

O programa seria para comunicação RS-232 entre dois pics16f887, no proteus esta funcionando redondo, a entrada analógica em um muda o estado da porta B do outro, onde tem um DAC R-2R, seria basicamente pra transmitir áudio de um para o outro, comunicação serial esta funcionando, captura de audio esta funcionando, variações na comunicação serial quando entra o audio, mas no outro pic não tem variação no portal B, tenho 5 pic16f887 aqui em nenhum o resultado deu certo.....

Exibições: 334

Anexos

Responder esta

Respostas a este tópico

Bom dia, 

Transmitir audio com DAC R-2R? Quantos bits? Qual a frequência de amostragem?

Use um DAC de 10 bits no mínimo. Recomendo de 12 bits. 

De toda forma, terá que usar um filtro na saída, para melhorar a qualidade do áudio. 

Estou usando um DAC R-2R com AmpOp, pesquise o que é um dac R-2R. O problema não é nenhuma das coisas que falou, o problema é que no microcontrolador, aparentemente no programa, alguma coisa errada na comunicação, mas no proteus esta rodando perfeitamente, conforme imagem em anexo.

Olá.

   Na imagem vi alguns pulldowns (resitores para terra) e uma chave dipswitch, não vi R2R... Mas de qualquer forma não é possível palpitar sobre a comunicação, uma vez que vc só mandou uma imagem de baixissima resolução onde não se consegue ler quase nada da ligação no proteus, onde funciona. Precisavamos de algo sobre a situação onde não funciona.

   Mande uma foto de sua montagem, o código, coisas uteis para um diagnóstico e tentaremos ajudar.

   De qualquer forma, como o José Gustavo Abreu Murta disse, os resultados práticos de se transmitir áudio por uma serial, ainda mais se for em 8bits, são bastante limitados.

   Vc pode estar sofrendo por um detalhe minusculo como interligar o GND, configurar o cristal, alimentar, algo que não é possível enxergar no que vc postou.

  O ideal seria usar primeiro um pequeno código que jogue nos pinos qq coisa que chegue pela serial, ligar o PC na serial do receptor e mandar caracteres. Com um multímetro verificar os estados das saídas.

   Realmente o proteus não é infalível mas quando bem configurado faz grande maravilhas.

Mandei a imagem do proteus pra mostrar o programa funcionando no proteus, lá da pra ver o portal b os terminais ligados (vermelho) e os terminais desligados (azul) e que existe uma comunicação entre ambos os MCUs, a resolução no pc esta ótima, consegui ver valor de resistência e todos os demais textos, o switch é a codificação, onde só existe comunicação entre os dois se ambos forem iguais, vou mandar um print do circuito no eagle e de todo o programa.

Mas a questão é que no proteus esta funcionando a comunicação entre os MCUs mas no real não, o GND em ambos é o mesmo pois estou usando a mesma fonte para ambas as placas, o oscilador é interno, conforme mostra na imagem do proteus.

#include <16F887.h> //
#device ADC=10 //
#fuses PROTECT //
#fuses INTRC //
#fuses NOBROWNOUT //
#fuses CPD //
#fuses NODEBUG //
#fuses NOLVP //
#fuses NOWRT //
#fuses NOIESO //
#fuses MCLR //
#fuses NOWDT //
#byte porta = 0b00000001 //
#byte portb = 0b00000000 //
#byte portc = 0b00000001 //
#byte portd = 0b11111111 //
#byte porte = 0b00000001 //
#use delay (clock=8000000) //
int envia,endr; //
#define botaoe pin_E0 //
#define cod01 pin_D0 //
#define cod02 pin_D1 //
#define cod03 pin_D2 //
#define cod04 pin_D3 //
#define cod05 pin_D4 //
#define cod06 pin_D5 //
#define cod07 pin_D6 //
#define cod08 pin_D7 //
#use RS232(baud=57600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,BITS=8,STOP=1) //
#use fast_io(a) //
#use fast_io(b) //
#use fast_io(c) //
#use fast_io(d) //
#use fast_io(e) //
//
void main() //
{ //
envia=0; //
endr=0; //
setup_oscillator(OSC_8MHZ); //
setup_vref(VREF_LOW); //
setup_adc(ADC_CLOCK_INTERNAL); //
setup_adc_ports(sAN0); //
set_adc_channel(0); //
while(true) //
{ //
setup_uart(true); //
set_uart_speed(57600); //
putchar(input_d()); //
endr=getchar(); //
while(endr==input_d()) //
{ //
envia=(read_adc()/8); //
if(input(botaoe)) //
{ //
bit_set(envia,7); //
} //
else //
{ //
bit_clear(envia,7); //
} //
setup_uart(UART_DATA); //
output_b(getchar()); //
putchar(envia); //
} //
} //
} //

Anexos

Rovilaon, boa tarde.

Não tinha visto o diagrama do seu circuito. Estudo conversores DAC e ADC desde a trinta anos atrás (somente). Estudo esses conversores pois gosto muito desse assunto. 

E não conheço somente esse tipo de DAC R-2R (mais rudimentar e mais impreciso de todos), mas vários outros tipos. Se tiver interesse, recomendo a leitura desse livro (download grátis):

The Data Conversion Handbook, 2005

https://www.analog.com/en/education/education-library/data-conversi...

Esse livro foi editado pela empresa Analog Devices, um dos melhores fabricantes nessa área de conversores.

Sobre a montagem do seu DAC R-2R  esta incompleta e incorreta, por isso não esta funcionando. 

Recomendo que leia e estude a partir dessa pagina do Handbook :

CHAPTER 3 - DATA CONVERTER ARCHITECTURES

R-2R DACs - pagina 3-12

 

Usei inicialmente 7 bits para teste, como eu disse acima, usei o portal B pra isso, fica limitado usar mais bits quando se esta usando pic, pois são enviados de 8 em 8 bits na comunicação rs-232 e o portal B por exemplo, possui 8 bits, complicaria demais, o que ajudaria pode ser um capacitor de 1uF ou 10uF na saída do AmpOp, já fiz testes desta forma no passado e o resultado foi uma saída absurdamente suave... Mas o problema não é no ADC ou DAC, esta sendo aparentemente na comunicação e no MCU.....

Bom dia Rovilon,

Então comigo acontecia mesma coisa com proteus com pic, funcionava no proteus , mas montava na placa não funcionava um simples timer e não sabia porque , o Sr Rui ajudou demais nisso.

Sr Rui?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço