Você está na página 1de 5

conversor AD para pic em C

Postado por leandroalves85 - 2009/12/28 23:49 _____________________________________

Ol deu uma olhada nos tpicos ativos do site e como achei nada semelhante resolvi postar estou trabalhando num cdigo em c para pic afim de efetuar uma leitura no AD com uma resoluo de 10 bits. estou usando compilador da ccs.sou iniciante e confesso q travei nesse ponto qualquer ajuda valida. eis o cdigo at o momento. #include #device adc=10 #use delay(clock=4000000) #fuses HS,NOWDT,PUT #use rs232(baud=19200, xmit=PIN_C6,rcv=PIN_C7) #include #ifndef lcd_enable #define lcd_enable #define lcd_rs #define lcd_rw #define lcd_d4 #define lcd_d5 #define lcd_d6 #define lcd_d7 #endif #define lcd_type 2

pin_e1 pin_e0 pin_e2 pin_d4 pin_d5 pin_d6 pin_d7

// pino enable do LCD // pino rs do LCD // pino rw do LCD // pino de dados d4 do LCD // pino de dados d5 do LCD // pino de dados d6 do LCD // pino de dados d7 do LCD

// 0=5x7, 1=5x10, 2=2 linhas

byte CONST ini_lcd = {0x20 | (lcd_type 0, soma 1 ao valor lido if (valor) valor += 1; val32 = valor * 4 + ((int32)valor * 113)/128; // imprime o valor da tenso no display // 5000 = 5,000 Volts ou 5000 milivolts printf (lcd_escreve,"Tensao = %lu mV",val32); // se a tecla enter for pressionada if (kbhit()) if (getc() == 13) { // imprime os resultados na serial printf ("Tensao = %lu miliVolts\r\n",val32); printf ("Valor = %lu\r\n",valor); } delay_ms (250); // aguarda 250 ms } output_high(lcd_enable); // habilita display dado = 0; // zera a varivel de leitura // l os quatro bits mais significativos if (input(lcd_d7)) bit_set(dado,7); if (input(lcd_d6)) bit_set(dado,6); if (input(lcd_d5)) bit_set(dado,5); if (input(lcd_d4)) bit_set(dado,4); // d um pulso na linha enable output_low(lcd_enable); output_high(lcd_enable); // l os quatro bits menos significativos if (input(lcd_d7)) bit_set(dado,3); if (input(lcd_d6)) bit_set(dado,2); if (input(lcd_d5)) bit_set(dado,1); if (input(lcd_d4)) bit_set(dado,0); output_low(lcd_enable); // desabilita o display return dado; // retorna o byte lido } void lcd_envia_nibble( byte dado ) // envia um dado de quatro bits para o display {
Frum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE

// coloca os quatro bits nas saidas output_bit(lcd_d4,bit_test(dado,0)); output_bit(lcd_d5,bit_test(dado,1)); output_bit(lcd_d6,bit_test(dado,2)); output_bit(lcd_d7,bit_test(dado,3)); // d um pulso na linha enable output_high(lcd_enable); output_low(lcd_enable); }

void lcd_envia_byte( boolean endereco, byte dado ) { // coloca a linha rs em 0 output_low(lcd_rs); // aguarda o display ficar desocupado //while ( bit_test(lcd_le_byte(),7) ) ; // configura a linha rs dependendo do modo selecionado output_bit(lcd_rs,endereco); delay_us(100); // aguarda 100 us // caso a linha rw esteja definida, coloca em 0 #ifdef lcd_rw output_low(lcd_rw); #endif // desativa linha enable output_low(lcd_enable); // envia a primeira parte do byte lcd_envia_nibble(dado >> 4); // envia a segunda parte do byte lcd_envia_nibble(dado & 0x0f); }

void lcd_ini() // rotina de inicializao do display { byte conta; output_low(lcd_d4); output_low(lcd_d5); output_low(lcd_d6); output_low(lcd_d7); output_low(lcd_rs); #ifdef lcd_rw output_high(lcd_rw); #endif output_low(lcd_enable); delay_ms(15); // envia uma seqncia de 3 vezes 0x03 // e depois 0x02 para configurar o mdulo // para modo de 4 bits for(conta=1;conta
============================================================================

Re:conversor AD para pic em C


Postado por rdmeneze - 2009/12/29 12:56 _____________________________________

no entendi qual a dvida. Seja mais explcito descrevendo o que est ocorrendo que assim poderemos ajud-lo.
============================================================================

Frum Embarcados - Portal Embarcados

_FB_PDF_VERSION

_FB_PDF_DATE

Re:conversor AD para pic em C


Postado por leandroalves85 - 2009/12/29 20:59 _____________________________________

ol bem vamos l... estou comeando a mexer com linguagem c para pic, parte desse programa que postei estava pronto eu mexi muito pouco nele. bem a duvida ao compilar no ccs, ele indica que as minhas funes lcd_ini e lcd_escreve no foram definidas. em assemble eu sempre declaro minhas funoes e rotinas mas em c como isso funciona? a parte do ad esta legal mas o controle do display que esta dando uma dor de cabea danada. falow abrao e obrigado pela ateno.
============================================================================

Re:conversor AD para pic em C


Postado por rdmeneze - 2009/12/29 22:36 _____________________________________

leandroalves85, Est dando erro na compilao pois o ccs no est encontrando as definies das funes que voc est usando. experimente fazer o seguinte: 1) mude a funo main para o final do arquivo; ou 2) copie as definies das funes lcd_init e lcd_escreve para antes da primeira funo que as utilizam, como por exemplo, a funo main.

byte lcd_le_byte(); //le um byte do lcd ( somente com pino rw) void lcd_escreve( char c); // mais funcoes main(){ // }
============================================================================

Re:conversor AD para pic em C


Postado por leandroalves85 - 2010/01/01 11:06 _____________________________________

ento cara funcionou o que vc disse no sabia que a ordem que vc cria as funoes influenciava o display ainda no mostra imagem mais fica piscando sinal que o programa esta rodando vou ver se resolvo isso mais por enquanto valew mesmo cara
============================================================================

Re:conversor AD para pic em C


Postado por rdmeneze - 2010/01/04 16:56 _____________________________________

em relao ao display, tenha certeza de qual tipo de interface voc est fazendo entre o uC e o display. Em relao interface, o LCD aceita comunicao com 8 ou 4 bits. Desta forma, verifique o seu hardware e a compatibilidade entre este e o firmware.
============================================================================

Re:conversor AD para pic em C


Postado por leandroalves85 - 2010/01/04 20:57
Frum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE

_____________________________________

cara problema resolvido estava faltando inicializar os ports de comando do display fiz isso e funcionou redondinho. ento eu usei comunicao de 4 bits. ae brother valew pela ajuda ae cara. te garanto que foi muito importante. qlqr coisa se eu puder ajudar ( acho dificil rrs) ma estou ae. falow abrao
============================================================================

Re:conversor AD para pic em C


Postado por leandroalves85 - 2010/01/11 23:59 _____________________________________

te falar vc tem alguma biblioteca ou exemplo de como fazer uma interpolao no pic tipo assim tem valores em uma tabela ja definida que os coloco numa matriz e em seguida comparo esse valor ao que o AD est lendo, mais o valor esta se perdendo . uma matriz do tipo int a outra do tipo float ser que isso est consumindo muito a ram? falow abs
============================================================================

Re:conversor AD para pic em C


Postado por rdmeneze - 2010/01/12 00:40 _____________________________________

opa! faa uma continha. Lembra-se da equao do primeiro grau? e da famosa "ioi mixox" y - y0 = m(x - x0) ?
============================================================================

Re:conversor AD para pic em C


Postado por leandroalves85 - 2010/01/12 19:53 _____________________________________

brother na boa conta eu sei, to indo pro quinto ano de eng, depois de calculo IV e eletromag I e II o resto nada. o que eu quero saber como em c eu trato matrizes afin de que eu com um valor do meu AD eu passe pelos termos da matriz (sendo a mesma de ordem crescente) para achar o valor intermediario com relao ao AD , tipo : minha matriz = {2,4, 6, 10 ,14} meu AD 11 eu quero varrer essa matriz do primeiro elemento at o "14" pegar o "14" e o "10" e ai sim executar minha interpolao, linaer ou de lagrange ainda estou vendo qual me da melhor preciso. resumo minha duvida como tratar essa matriz em c.
============================================================================

Re:conversor AD para pic em C


Postado por rdmeneze - 2010/01/12 23:30 _____________________________________

bom, vamos ver se eu consigo te ajudar com algo. inicialmente voc tem que levar em considerao qual a grandeza que quer realizar a leitura e como est relacionado o vetor de interpolao com o mesmo. Vou considerar que o seu vetor seja algo como qualquer coisa x dcada de qualquer outra coisa, assim espero que o fragmento a seguir o auxilie:

float m; BYTE index; int matriz = {2,4, 6, 10 ,14}; int y;


Frum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE

for ( index = 0; ( index < sizeof(matriz) - 1) && !( valAD >= matriz && valAD < matriz); index++); m = (matriz - matriz) / ((float)10); // usando a boa e velha equao y-y0 = m(x-x0) y = m*( valAD - (index*10) ) + matriz;
============================================================================

Frum Embarcados - Portal Embarcados

_FB_PDF_VERSION

_FB_PDF_DATE

Você também pode gostar