Página 1 de 1
CANAL AD EM C

Enviado:
12 Jan 2007 23:45
por zero
Ola pessoal infelizmente não comprei o livro do fabio pereira (comprei de um concorrente ) e to apanhando pacas para aprender C ... ja programo em asssembly ...
É o seguinte :
Quero fazer uma experiencia para fazer uma leitura de um lm35 pelo ad do 877A
A e jogar num lcd .....
Minhas dúvidas :
- como habilito ad no 877 em C , no inicio do programa ?
- como manipulo estes dados do AD ?
puts nao sei se to sendo muito chucro .... mas ja pesquisei no forum vi algo parecido e ainda fiquei na dúvida agradeço desde já !

Enviado:
13 Jan 2007 10:11
por __JEREK__
Oi Zero, olha ai um programinha de bandeja prô cê:
- Código: Selecionar todos
#include<16f876.h>
#use delay(clock=4000000)
#include "funcao_LCD_16x2.h"
#define adc = 10 // Configura o compilador para conversor A/D de 10 bits
#fuses XT,PUT,BROWNOUT,NOLVP,NODEBUG,CPD,NOWDT,NOWRT
set_tris_b(0b00000000);
int32 valor;
int32 val32;
void main ()
{
int32 val32;
SETUP_ADC_PORTS(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_ms(10); // ATENÇÃO sempre que selecionar um canal, aguradar 10ms pelol menos
// antes de efetuar a converção A/D de forma a garantir que o
// capacitor interno de amostragem possa carregar com tensão
// de entrada.
inicializa_lcd(); // Faz a inicialização do LCD, é OBRIGATÓRIO
//printf(escreve_lcd,"Valor = %lu",valor); // Escreve na 1° linha
printf(escreve_lcd,"Valor ADC0 = ");
envia_byte_lcd(0,0xc0); // Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"Tensao = ");
while(true)
{
valor = read_adc(); // Efetua a converção A/D
envia_byte_lcd(0,0x88);
printf(escreve_lcd,"%lu t",valor); // Escreve na 1° linha
//if(valor) valor +=1;
val32 = ((valor * 5000)/255);
//val32 = valor * 4 + ((int32)valor * 113)/128;
envia_byte_lcd(0,0xc9); // Desloca o cursor para a segunda linha do LCD
printf(escreve_lcd,"%lumV t",val32);
//printf(escreve_lcd,"RV1 = %u",valor_RV1); // Escreve na 2° linha
delay_ms(250);
}
}
ele foi feito para 16F876 mas é só mudar para 877 que vai funcionar igual

Enviado:
13 Jan 2007 10:12
por lucaszampar
Fala zero,
Qual o compilador que está usando?
Se for o CCS:
Logo no início do programa, no abaixo do #include... coloque:
#device ADC=10
Isso indica qual a resolução do seu ad em bits, neste caso é de 10 bits, então a leitura do seu AD irá variar de 0 à 1023.
No programa principal:
// Configura A/D
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
Para selecionar o canal de leitura (AN0, AN1, AN2)..
set_adc_channel( 0 ); // AN0
Para retornar um valor no LCD:
printf(lcd_escreve, "Valor %lu", Read_ADC());
é pra ser isso...
qquer coisa, estamos aí!

Enviado:
13 Jan 2007 10:13
por lucaszampar
__JEREK__, postamos quase junto...
zero, o exemplo acima está bem mais fácil de entender...

Enviado:
13 Jan 2007 14:23
por zero
obrigado pelo post estou acabando de montar o circuito para testar ...
valew jerek e lucas !

Enviado:
13 Jan 2007 15:45
por zero
amigos SURGIU OUTRO PROBLEMA .... ESTOU USANDO MPLAB COM CCS ......em c ....
quando compilo o pprograma ele abre a biblioteca do lcd sozinho certo ?
e ae ele nao compila dando um erro na biblioteca e nao no programa em si .....
o erro é
Deleting intermediary files... done.
Executing: "C:\Arquivos de programas\PICC\Ccsc.exe" "lcd.c" +FM +DF +LN +T -A +M +Z +Y=9 +EA
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 47(10,18): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 54(5,13): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 56(1,9): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 59(5,13): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 60(23,31): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 62(24,32): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 63(23,31): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 70(24,32): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 71(23,31): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 129(1,9): Undefined identifier -- delay_us
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\LCD_LIB_D.c" Line 138(1,9): Undefined identifier -- delay_ms
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\lcd.c" Line 67(6,10): Undefined identifier modo
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\lcd.c" Line 85(6,10): Undefined identifier modo
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\lcd.c" Line 110(6,10): Undefined identifier modo
*** Error 12 "D:\ROBERTO\Apostila18F458rev2\Cap9\lcd\lcd.c" Line 131(6,10): Undefined identifier modo
como se delay nao existisse .... ?????
o meu programa principal é
#include <16F877A.h>
#include <LCD_LIB_D.c>
#use delay(clock=6144000)
#fuses XT,PUT,BROWNOUT,NOLVP,NODEBUG,CPD,NOWDT,NOWRT
////////////////////////////////////////////////////////////////////////////
// prototipos
void TelaPadrao(void);
void Tela2(void);
//////////////////////////////////////////////////////////////////////////////////
// VARIAVEIS
int8 CONTADOR;
////////////////////////////////////////////////////////////////////////////
// DEFINICOES
#define nao 0
#define sim 1
////////////////////////////////////////////////////////////////////////////
// ######### ESTE INCLUDE NAO PODE FALTAR
//
////////////////////////////////////////////////////////////////////////////
void main()
{
//////// Inicializacao de variaveis
//////// Inicializacao de hardware
setup_adc_ports(no_analogs); // se nao usar A/D, devemos ajustar os ports para digital
setup_comparator(NC_NC_NC_NC); // se nao usar o comparador, devemos desligar o mesmo
SETUP_COUNTERS(rtcc_internal,rtcc_div_32);
LCD_INIT(); // obrigatorio
TelaPadrao();
Delay_ms(2000);
contador = 9;
for (;;)
{
if (contador < 9)
contador++;
else
contador = 0;
Tela2();
Delay_ms(1000);
}
}
/////////////////////////////////////////////////////////////////////////////
void TelaPadrao()
{
LCDClear();
cursor(1,2);
modo = dado;
caractere = 'E'; LCDEnviaByte();
caractere = 'x'; LCDEnviaByte();
caractere = 'p'; LCDEnviaByte();
caractere = 'e'; LCDEnviaByte();
caractere = 'r'; LCDEnviaByte();
caractere = 'i'; LCDEnviaByte();
caractere = 'e'; LCDEnviaByte();
caractere = 'n'; LCDEnviaByte();
caractere = 'c'; LCDEnviaByte();
caractere = 'i'; LCDEnviaByte();
caractere = 'a'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = '0'; LCDEnviaByte();
caractere = '4'; LCDEnviaByte();
Cursor(2,1);
modo = dado;
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = 'D'; LCDEnviaByte();
caractere = 'i'; LCDEnviaByte();
caractere = 's'; LCDEnviaByte();
caractere = 'p'; LCDEnviaByte();
caractere = 'l'; LCDEnviaByte();
caractere = 'a'; LCDEnviaByte();
caractere = 'y'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = 'L'; LCDEnviaByte();
caractere = 'C'; LCDEnviaByte();
caractere = 'D'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
}
/////////////////////////////////////////////////////////////////////////////
void Tela2()
{
LCDClear();
cursor(1,1);
modo = dado;
caractere = 'E'; LCDEnviaByte();
caractere = 'x'; LCDEnviaByte();
caractere = 'p'; LCDEnviaByte();
caractere = ':'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = '0'; LCDEnviaByte();
caractere = '4'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = 'L'; LCDEnviaByte();
caractere = 'C'; LCDEnviaByte();
caractere = 'D'; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
caractere = ' '; LCDEnviaByte();
cursor(2,1);
modo = dado;
caractere = 'C'; LCDEnviaByte();
caractere = 'o'; LCDEnviaByte();
caractere = 'n'; LCDEnviaByte();
caractere = 't'; LCDEnviaByte();
caractere = 'a';LCDEnviaByte();
caractere = 'd';LCDEnviaByte();
caractere = 'o';LCDEnviaByte();
caractere = 'r';LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
caractere = '=';LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
// ao somar 48 (30H) transformamos o NUMERO em seu ASCII equivalente
caractere = 48+contador; LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
caractere = ' ';LCDEnviaByte();
}
/////////////////////////////////////////////////////////////////////////
//***********************************************************************
// Fim do programa fonte
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Enviado:
13 Jan 2007 15:47
por zero
E A BIBLITECA LCD É ESSA
//##################################################################################
// Rotinas padrao do lcd no port D - incluir antes do main()
// com #include <lcd_lib_D.c>
//////////////////////////////////////////////////////////////////////////
#define bitEnable pin_D3
#define bitRS 2
//////////////////////////////////////////////////////////////////////////
int1 mododisp; // indica se eh comando ou dado
int8 caractere; // caractere a mostrar no lcd
int8 ajustado; // caractere ajustado para envio ao lcd
#define comando 0
#define dado 1
#define enable output_high(bitEnable);delay_cycles(1);output_low(bitEnable)
void LCD_INIT(void);
void LCDEnviaByte(void);
void LCDClear(void);
void Cursor (int8 linha,coluna);
void ApagarLCD(void);
void AcenderLCD(void);
void CursorApagado(void);
void CursorPiscando(void);
void EnviaOCaractere(int8 qual);
//////////////////////////////////////////////////////////////////////////
// *
// * LCD
// * Pino 1 - GND
// * Pino 2 - + 5Vcc
// * Pino 3 - Cursor do Trimpot de contraste
// * Pino 4 - RS - em RC0
// * Pino 5 - RW - em '0' (somente escrevo no display)
// * Pino 6 - E - em RC1
// * Pinos 7~10 - nao usados
// * Pino 11 - D4 - em RC2 RD4
// * Pino 12 - D5 - em RC3 RD5
// * Pino 13 - D6 - em RC4 RD6
// * Pino 14 - D7 - em RC5 RD7
//***********************************************************************
//***********************************************************************
void LCD_INIT()
{
delay_ms (30) ;
// Saida do port = X X D7 D6 D5 D4 E RS
// RESET DISPLAY. DATA= 0011 RS=0 E=0
ajustado = 0b00110000;
output_d(ajustado);
output_high(bitEnable);
delay_ms(5);
output_low(bitEnable);
delay_ms(5);
output_high(bitEnable);
delay_ms(1);
output_low(bitEnable); delay_ms(1);
output_high(bitEnable); delay_ms(1);
output_low(bitEnable); delay_ms(1);
// Saida do port = D7 D6 D5 D4 E RS x x
// RESET DISPLAY. DATA= 0010 RS=0 E=0
ajustado = 0b00100000;
output_d(ajustado);
output_high(bitEnable); delay_ms(1);
output_low(bitEnable); delay_ms(1);
//////// Ajuste para 4 bits
caractere = 0b00101000; // 28H = 4 bits
mododisp = comando;
LCDEnviaByte();
//////// Ajuste de modo
caractere = 0b00000110; // 6 = modo
mododisp = comando;
LCDEnviaByte();
//////// Ajuste para ligar o display
caractere = 0b00001100; // 12 = on, cursor off, nao pisca
// 14 = on, cursor on, nao pisca
// 15 = on, cursor on, pisca
mododisp = comando;
LCDEnviaByte();
LCDClear();
}
//***********************************************************************
void LCDEnviaByte() // a var caractere tem o valor a enviar
{
///// parte alta
ajustado = 0b00000000;
if (mododisp == dado) // xxxxx0xx ou
bit_set(ajustado,bitRS); // xxxxx1xx
if (bit_test(caractere,7)) // 0xxx ERxx ou onde R eh o RS
bit_set(ajustado,7); // 1xxx ERxx e 'E' eh o enable
if (bit_test(caractere,6)) // x0xx ERxx ou
bit_set(ajustado,6); // x1xx ERxx
if (bit_test(caractere,5)) // xx0x ERxx ou
bit_set(ajustado,5); // xx1x ERxx
if (bit_test(caractere,4)) // xxx0 ERxx ou
bit_set(ajustado,4); // xxx1 ERxx
output_d(ajustado);
enable;
///// parte baixa
ajustado = 0b00000000;
if (mododisp == dado)
bit_set(ajustado,bitRS);
if (bit_test(caractere,3))
bit_set(ajustado,7);
if (bit_test(caractere,2))
bit_set(ajustado,6);
if (bit_test(caractere,1))
bit_set(ajustado,5);
if (bit_test(caractere,0))
bit_set(ajustado,4);
output_d(ajustado);
enable;
delay_us(50);
}
//***********************************************************************
void LCDClear()
{
//////// Ajuste de modo
caractere = 1; // 1 = clear
mododisp = comando;
LCDEnviaByte();
delay_ms(2);
//////// L1c1
caractere = 0x80; // 80h = 128 = L1 C1
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
///////////////////////////////////////////////////////////////////////
void Cursor (int8 linha,coluna)
{
if (linha == 1)
caractere = 0x7f + coluna;
else
caractere = 0xbf + coluna;
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
///////////////////////////////////////////////////////////////////////
void ApagarLCD()
{
caractere = 0b00001000; // 10 = off
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
///////////////////////////////////////////////////////////////////////
void AcenderLCD()
{
caractere = 0b00001000; // 12 = on
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
///////////////////////////////////////////////////////////////////////
void CursorApagado()
{
caractere = 0b00001100; // 12 = off
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
///////////////////////////////////////////////////////////////////////
void CursorPiscando()
{
caractere = 15;
mododisp = comando;
LCDEnviaByte();
mododisp = dado;
}
/////////////////////////////////////////////////////////////////////////////
void EnviaOCaractere(int8 qual)
{
mododisp = dado;
caractere = qual;
LCDEnviaByte();
}
//***********************************************************************
//***********************************************************************
//////////////////////////////////////////////////////////////////////////

Enviado:
13 Jan 2007 15:49
por lucaszampar
Ao invés de:
#include <16F877A.h>
#include <LCD_LIB_D.c>
#use delay(clock=6144000)
#fuses XT,PUT,BROWNOUT,NOLVP,NODEBUG,CPD,NOWDT,NOWRT
Coloque:
#include <16F877A.h>
#use delay(clock=6144000)
#fuses XT,PUT,BROWNOUT,NOLVP,NODEBUG,CPD,NOWDT,NOWRT
#include <LCD_LIB_D.c>
Ele dá esse erro pois a rotina de lcd usa o delay_ms e ele ainda não inicializado.

Enviado:
13 Jan 2007 20:28
por microeletronica
hehehhe - Conversao com S...
Eh isso.