CANAL AD EM C

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

CANAL AD EM C

Mensagempor zero » 12 Jan 2007 23:45

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á !
Roberto
Técnico Eletrônico - PEM
Avatar do usuário
zero
Nibble
 
Mensagens: 65
Registrado em: 12 Nov 2006 23:57
Localização: Indaiatuba - SP

Mensagempor __JEREK__ » 13 Jan 2007 10:11

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
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor lucaszampar » 13 Jan 2007 10:12

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í!
Avatar do usuário
lucaszampar
Byte
 
Mensagens: 105
Registrado em: 11 Out 2006 22:30
Localização: Limeira - SP

Mensagempor lucaszampar » 13 Jan 2007 10:13

__JEREK__, postamos quase junto...

zero, o exemplo acima está bem mais fácil de entender...
Avatar do usuário
lucaszampar
Byte
 
Mensagens: 105
Registrado em: 11 Out 2006 22:30
Localização: Limeira - SP

Mensagempor zero » 13 Jan 2007 14:23

obrigado pelo post estou acabando de montar o circuito para testar ...
valew jerek e lucas !
Roberto
Técnico Eletrônico - PEM
Avatar do usuário
zero
Nibble
 
Mensagens: 65
Registrado em: 12 Nov 2006 23:57
Localização: Indaiatuba - SP

Mensagempor zero » 13 Jan 2007 15:45

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
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Roberto
Técnico Eletrônico - PEM
Avatar do usuário
zero
Nibble
 
Mensagens: 65
Registrado em: 12 Nov 2006 23:57
Localização: Indaiatuba - SP

Mensagempor zero » 13 Jan 2007 15:47

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();
}
//***********************************************************************
//***********************************************************************

//////////////////////////////////////////////////////////////////////////
Roberto
Técnico Eletrônico - PEM
Avatar do usuário
zero
Nibble
 
Mensagens: 65
Registrado em: 12 Nov 2006 23:57
Localização: Indaiatuba - SP

Mensagempor lucaszampar » 13 Jan 2007 15:49

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.
Avatar do usuário
lucaszampar
Byte
 
Mensagens: 105
Registrado em: 11 Out 2006 22:30
Localização: Limeira - SP

Mensagempor microeletronica » 13 Jan 2007 20:28

hehehhe - Conversao com S...
:P

Eh isso.
microeletronica
Byte
 
Mensagens: 158
Registrado em: 05 Dez 2006 18:22


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x