/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
ADC med PIC 16F873 HJÆLP !!!
Fra : Ukendt


Dato : 10-02-04 12:10

hej

Er igang med at lave et lille projekt med en PIC16F873 som har 5 analoge
indgange.

Jeg har det problem at jeg ikke kan få den til at læse spændingen rigtigt.
Der sker det at spændingen er 1/3 af det den skulle være. Det vil sige at
den viser ca. 1.2 V når man med et multimeter måler 4.5V.
Hvis man så hæver spænding fra 4.5 til 5V så springer den vildt hurtigt på
det sidste stykke.

Her er mit C- program. Det eneste jeg kan skyde på må være galt er noget med
Right eller Left justifikation i PIC'en eller er der andre der har et
foreslag?

Der sidder et VFD display på til udlæsningen og jeg sender spænding ind på
CH2.
----------------------------------------------------------------------------
------
#include <pic.h>
#include <string.h>
#include <delay.h>
#include <stdio.h>
#include <\ht-pic\samples\delay.c>


bank1 unsigned char text [20]; // Array til tekst på diplay

int temp;
double temp1 ,temp2;

void lcd()
{
int i;
for (i=0; i<strlen(text); i++)
{
PORTB = text[i];
PORTC = 192;
PORTC = 0;
}
for (i=0; i<40-strlen(text); i++)
{
PORTB = 32; // Fill rest with space
PORTC = 192;
PORTC = 0;
}
}

void pulse(void)
{
int i;

RC3 = 1; // Send puls afsted med en varighed på "temp" længde
for (i=1; i<temp; i++)
DelayUs(23); // 100 uS ved 3.2678 MHz krystal
RC3 = 0;
}


void main(void)
{
int ch1, ch2, ch3, ch4, ch5, ch5;

DelayMs(20); // Vent så VFD er klar til at modtage data
TRISA = 255; // Port A til input
TRISB = 0; // Port B til output
TRISC = 0; // Port C til output

RBIE = 0; // interrupt on change disabled
PEIE =0; // Pereferial interrupt disabled
GIE = 0; // global interrupt disabled

ADCON0 = 129; // 00.000.0.0.1 - 2Tosc. Ch0. DONE, x, A/D-operating
ADCON1 = 128; // 1.000.0000 - MSB_of_adrh_0.xxx.All_to_analog

T1CON = 1; // Enable Timer 1

PORTB = 56; // 8 Bit interface
PORTC = 128;
DelayMs(3);
PORTC = 0;

PORTB = 12; // Display on, Cursor off, Blink off
PORTC = 128;
DelayMs(3);
PORTC = 0;

PORTB = 1; // Clear display
PORTC = 128;
DelayMs(3);
PORTC = 0;

TMR1H = 0; // Reset 16 bit counter 1
TMR1L = 0;
TMR0 = 0; // Reset 8 bit counter 0

do {
sprintf(text, "xxxx Universe");
lcd();


ADCON0 = 1; // Start A/D konverter CH 1
ADGO = 1;
while(!ADIF); // Vent til A/D konvertering er færdig
ch1 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

ADCON0 = 9; // Start A/D konverter CH 2
ADGO = 1;
while(!ADIF);
ch2 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding
ch1 = ADRESL;
ch2 = ADRESH;

ADCON0 = 21; // Start A/D konverter CH 3
ADGO = 1;
while(!ADIF);
ch3 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

ADCON0 = 29; // Start A/D konverter CH 4
ADGO = 1;
while(!ADIF);
ch4 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

ADCON0 = 37; // Start A/D konverter CH 5
ADGO = 1;
while(!ADIF);
ch5 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding


temp1 = (5.0 / 1023.0) * ch1; // konverter de 16 bit til en spænding 0-5
Volt
temp2 = (5.0 / 1023.0) * ch2;
sprintf(text, "%d %d", ch1, ch2);
lcd();

temp = 5.0; // Startpuls på 0.5 mS
pulse();
temp = 10.0 + (10.0 / 1023.0 * ch1);
pulse();
temp = 10.0 + (10.0 / 1023.0 * ch2);
pulse();
temp = 10.0 + (10.0 / 1023.0 * ch3);
pulse();
temp = 10.0 + (10.0 / 1023.0 * ch4);
pulse();
temp = 10.0 + (10.0 / 1023.0 * ch5);
pulse();


} while(1);
}





 
 
Bo Braendstrup (10-02-2004)
Kommentar
Fra : Bo Braendstrup


Dato : 10-02-04 12:28



Tom wrote:
>
> hej
>
> Er igang med at lave et lille projekt med en PIC16F873 som har 5 analoge
> indgange.
>
> Jeg har det problem at jeg ikke kan få den til at læse spændingen rigtigt.
> Der sker det at spændingen er 1/3 af det den skulle være. Det vil sige at
> den viser ca. 1.2 V når man med et multimeter måler 4.5V.
> Hvis man så hæver spænding fra 4.5 til 5V så springer den vildt hurtigt på
> det sidste stykke.


> ADCON0 = 9; // Start A/D konverter CH 2
> ADGO = 1;
> while(!ADIF);
> ch2 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding
> ch1 = ADRESL;
> ch2 = ADRESH;

Hvad gør du med ch1 og ch2 herover? Det ser ikke rigtigt ud.

/Bo.

Ukendt (10-02-2004)
Kommentar
Fra : Ukendt


Dato : 10-02-04 14:42



> > ADCON0 = 9; // Start A/D konverter CH 2
> > ADGO = 1;
> > while(!ADIF);
> > ch2 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem
spænding
> > ch1 = ADRESL;
> > ch2 = ADRESH;
>
> Hvad gør du med ch1 og ch2 herover? Det ser ikke rigtigt ud.

Det er kun for at se af low og high byte fra AD konverteren på mit display
(midlertidig).

--
Tom




Bo Braendstrup (10-02-2004)
Kommentar
Fra : Bo Braendstrup


Dato : 10-02-04 14:51



Tom wrote:
>
> > > ADCON0 = 9; // Start A/D konverter CH 2
> > > ADGO = 1;
> > > while(!ADIF);
> > > ch2 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem
> spænding
> > > ch1 = ADRESL;
> > > ch2 = ADRESH;
> >
> > Hvad gør du med ch1 og ch2 herover? Det ser ikke rigtigt ud.
>
> Det er kun for at se af low og high byte fra AD konverteren på mit display
> (midlertidig).

Jamen, senere udlæser du med:

temp1 = (5.0 / 1023.0) * ch1; // konverter de 16 bit til en spænding 0-5
Volt
temp2 = (5.0 / 1023.0) * ch2;
sprintf(text, "%d %d", ch1, ch2);
lcd();

og i kanal2 rutinen øverst har du erstattet (ADRESH * 256) + ADRESL
med ADRESL.

Har du så ikke over skrevet dine variabler for kanal1 og kanal2?

Jeg er IKKE en haj til C, som det sikkert kan ses af ovenstående

/Bo.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste