PIC18f4550 ADC problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

PIC18f4550 ADC problem

Inlägg av [ALV] »

Jag har ett problem med att läsa av ADC från min AN0 pinne, hela picen fryser när jag försöker starta omvandlingen. Allt annat funkar bra så länge jag av kommenterat adc omvandlingen, dvs min led blinkar samt att jag får saker över Usart.

Kan någon förklara vad jag gör för fel, antagligen har det med konfigurationen av bittarna att göra, ja har sökt på nätet och hittat massa förslag men inget var tydligt nog eller fungerade med min setup så den konfiguration som syns nedan har jag så gott jag kan satt efter databladet.

jag använder en pic 18f4550 med 4MHz extern kristall.
register:
_FOSC_HSPLL_HS + _PLLDIV_1_1L + _CPUDIV_OSC1_PLL2
vilket ger mig 48MHz


Har ett motstånd kopplat till AN0 ,en led kopplat till RD2 och så använder jag Usart rx tx pinnarna till en rs232 link.

Använder MikroC v6.xx (dvs en lite äldre version)

Kod: Markera allt

unsigned float temp_res;

void main() {
	USART_Init(9600);  // USART 9600

	TRISA  = 0xFF;     // PORTA is input
	ADCON1 = 0b00001101;    //
	ADCON0 = 0b00000001;    // Use AN0
	ADCON2 = 0b00111000;  // Some timing that i don't understand

	PORTD.F2 = 0;
	TRISD = 0;
	PORTD.F2 = 1;
  while(1) {
		temp_res = ADC_Read(0); // This is the problem.
		USART_Write(temp_res);
		PORTD.F2 = 1;
		Delay_ms(100);
		PORTD.F2 = 0;
		Delay_ms(100);
	}
}
Min led lyser konstant efter att jag satt PORTD.F2 = 1 sen hänger sig programet eller liknande.

Tack för på förhand!

/Richard
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

> Har ett motstånd kopplat till AN0 ,en led kopplat till RD2

Bara så ? Hänger de i luften ?

Från koden :

> "Some timing that i don't understand"

Fixa det ! Det kan kanske vara det största felet.
Eller (om du vill ha hjälp) tala åtminstånde om vad du inte förstår.

> unsigned float temp_res;

Varför använder du float ??
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

Re: PIC18f4550 ADC problem

Inlägg av [ALV] »

>> Har ett motstånd kopplat till AN0 ,en led kopplat till RD2
>Bara så ? Hänger de i luften ?

Motståndet är kopplat från AN0 till vss. (jag förstod det dock som att det inte spelar någon roll om något är inkopplat eller ej)

>> "Some timing that i don't understand"
>Fixa det ! Det kan kanske vara det största felet.
>Eller (om du vill ha hjälp) tala åtminstånde om vad du inte förstår.

Jag vill ha hjälp, jag vet dock inte om det är problemet eller ej, jag förstår helt enkelt inte databladet fullt ut för ANCON2.
eftersom jag inte helt greppat det så försökte jag vara på den säkra sidan genom att ställa upp TAD till max med Fosc/2 bara för att inte hamna under TAD minimum.
Någon kanske kan förklara vad det registret gör

>> unsigned float temp_res;
>Varför använder du float ??
enkelt, jag anade att mitt värde kunde vara för stort och därmed orsakade problem, antagligen har det med en feltolkning av databladet att göra med.
saxat ur databladet -> "Performing a conversion on unimplemented channels will return a floating input measurement."
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18f4550 ADC problem

Inlägg av Icecap »

"floating input" betyder att en ingång inte är ansluten, det har INGET med variabeltypen "float" att göra!
Fixa alltså till detta innan allt annat!
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

Re: PIC18f4550 ADC problem

Inlägg av [ALV] »

>"floating input" betyder att en ingång inte är ansluten, det har INGET med variabeltypen "float" att göra!
>Fixa alltså till detta innan allt annat!

Fixat, en unsigned short ska fixa biffen i så fall.

[EDIT] menar alltså inte att det löste mitt problem.

såhär ser koden ut nu, har lagt till lite mer kommentarer.

Kod: Markera allt

unsigned short temp_res;

void main() {
	USART_Init(9600);  // USART 9600

	TRISA  = 0xFF;     // PORTA is input
	ADCON1 = 0b00001101;    // Use vss vdd as vref, set an0, an1 to analog input
	ADCON0 = 0b00000001;    // Use an0 for adc
	ADCON2 = 0b00111000;  // Some timing that i don't understand

	PORTD.F2 = 0;
	TRISD = 0;
	PORTD.F2 = 1;
  while(1) {
		temp_res = ADC_Read(0);
		USART_Write(temp_res);
		PORTD.F2 = 1;
		Delay_ms(100);
		PORTD.F2 = 0;
		Delay_ms(100);
	}
}
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

Vilken spänning är det som du ska mäta ? Vss ? Alltså "noll" ?
Varför inte en spänningsdelare så att du i alla fall får ett "intressant" värde ?
Hur stort sa du att motståndet var ?

> jag förstår helt enkelt inte databladet fullt ut för ANCON2.

Och om du inte kan tala om *VAD* som är oklart så spelar det ju ingen större roll.

> enkelt, jag anade att mitt värde kunde vara för stort och därmed orsakade problem,

För stort för vadå ?
Och igen, varför en float ?
Varför inte göra så som manualen gör ?

> saxat ur databladet -> "Performing a conversion on unimplemented channels will return a floating input measurement."

Vilken datablad" ???
Är det "Note2" under "REGISTER 21-1" i kapitel 21.0 i DS29362 ?
Och i så fall, vad har det för rellevans ? Använder du en "unimplemented channel" ??
Notera också att det som *där* kallas "floating" inte har ett smack med
varabeltypen "float" i C...

Och "unimplemented channel" betyder inte riktigt det som Icecap sa, men i alla fall...
bos
Inlägg: 2308
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC18f4550 ADC problem

Inlägg av bos »

[ALV] skrev:Fixat, en unsigned short ska fixa biffen i så fall.
Ja, det fixar biffen om du inte vill kunna lagra hela ADC-värdet.

(tips: short är 8-bit, och enligt databladet är 4550-ADC:n 10-bit. Med andra ord kommer två bitar försvinna, och din AD-omvandling kommer bli "godtycklig" beroende på vilka två bitar din kompilator kasserar)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

Jag förstår fortfarande inte varför du inte kör så som manualen gör
(med en vanlig unsigned int)...
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

Re: PIC18f4550 ADC problem

Inlägg av [ALV] »

>Vilken spänning är det som du ska mäta ? Vss ? Alltså "noll" ?
>Varför inte en spänningsdelare så att du i alla fall får ett "intressant" värde ?
>Hur stort sa du att motståndet var ?

Motståndet är 1k - 1000k (Photoresistor) och är kopplat till vdd såklart dvs +5v, det ger just runt +4.4v till AN0.

>> jag förstår helt enkelt inte databladet fullt ut för ANCON2.
>Och om du inte kan tala om *VAD* som är oklart så spelar det ju ingen större roll.
Vad gör den?
Hur stor påverkan på har den?
Hur räknar jag ut vad "rätt" register är för detta exempel projekt?

>För stort för vadå ?
>Och igen, varför en float ?
>Varför inte göra så som manualen gör ?

Jag trodde att jag eventuellt fick ett större värde än unsigned short som då skulle ställt till med problem.
av ren "traggel and error" så testade jag det.
Vilken manual?
Om du menar MikroC manualen så har jag sörsökt utan lycka.


>> saxat ur databladet -> "Performing a conversion on unimplemented channels will return a floating input measurement."
>Vilken datablad" ???
>Är det "Note2" under "REGISTER 21-1" i kapitel 21.0 i DS29362 ?
>Och i så fall, vad har det för rellevans ? Använder du en "unimplemented channel" ??
Det stämmer picens datablad, antog att det var en feltolkning men chansade och körde på float.

>Och "unimplemented channel" betyder inte riktigt det som Icecap sa, men i alla fall...
Vad betyder det då? "om inte inkopplad eller configurerad/enablad"
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

Re: PIC18f4550 ADC problem

Inlägg av [ALV] »

bos & sodjan, körde adc_read(0) >> 2 med unsigned short förut men måste glömt att sätta dit det igen efter allt testande.

Jag ändrade till:

Kod: Markera allt

unsigned int temp_res;
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18f4550 ADC problem

Inlägg av Icecap »

Du använder funktioner som du inte vet vad gör (USART_Init, USART_Write, ADC_Read) och med MikroC skulle jag inte lita på dessa funktioner, de säger mig samtidig att du inte har den koll på mikroprocessorn som så som behövs för att använda högnivå-språk när man adderar dina problem och "lösningar" ihop.

Så i enkelhet verkar du ha tagit dig vatten över huvudet och det kanske är dags att backa ett steg. Nu kanske det verkar vara hårda ord men jag står för dom.

Personligt hatar jag dessa funktioner då källkoden inte finns och man har inte ett suck om de faktisk gör deras uppgift och med tanke på MikroElektronika's rykte är jag tveksam till att det inte fint kan finnas en del fel, jag har själv hittat lite fel som jag har rapporterat till dom. De kan t.ex. mycket väl kopierat en "ADC_Read" från en PIC16-implementering och då ha en "goto $-1" i den kod vilket kan fingera på PIC16 men kan vara ganska dumt på en PIC18, allt detta är dock bara en gissning och en misstro till den kompiler som bevisligen har haft en del konstigheter för sig.

sodjan: det är faktisk rätt vad jag svarade! ""Performing a conversion on unimplemented channels will return a floating input measurement." Alltså: om man läser en en ej aktiverat kanal får man en utläsning som en kanal med flytande (ej ansluten) ingång.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

> Vad betyder det då? "om inte inkopplad eller configurerad/enablad"

"unimplemented" betyder ungefär "finns inte".
Icecap talade om "oansluten" eller "okonfigurerad" vilket är något annat.

"Float" som det används i t.ex C betyder "flytande decimalkomma".
"Floating" som det används i t.ex "floating input measurement" betydere
ungefär "osäkert", "varierande" eller "oklart" mätvärde.

> Jag trodde att jag eventuellt fick ett större värde än unsigned short som då skulle ställt till med problem.

Ja, det kan du ju få. Det är därför manualen kör med "int".
Att köra med en float är däremot helt onödigt (och eventuellt helt fel).

> Motståndet är 1k - 1000k (Photoresistor) och är kopplat till vdd såklart dvs +5v,

OK. Du har alltså (i princip) alltid 5V in på ADC'n. Det ger ju inte heller så speciellt
spännande avläsningar. Du kan alltså inte koppla så helt enkelt. Fixa en spänningsdelare
med fotoresistorn i "ena benet".

> >> jag förstår helt enkelt inte databladet fullt ut för ANCON2.

ADCON2 ?

> Vad gör den?

Se : "REGISTER 21-3: ADCON2: A/D CONTROL REGISTER 2"

> Hur stor påverkan på har den?

Påverkan på vadå ? På något annat än det som beskrivningen säger ?

> Hur räknar jag ut vad "rätt" register är för detta exempel projekt?

T.ex "21.2 Selecting and Configuring Acquisition Time"
och "21.3 Selecting the A/D Conversion Clock". Se även
"TABLE 21-1: TAD vs. DEVICE OPERATING FREQUENCIES".

Som jag sa tidigare, om något är oklart så måste du tala om *vad* som
är oklart. Inte bara fråga om samma sak som databladet redan talar om.
Ange ett konkret citat ur databladet som är oklart så tar vi det...
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

> sodjan: det är faktisk rätt vad jag svarade!
> Alltså: om man läser en en ej aktiverat kanal får man en utläsning
> som en kanal med flytande (ej ansluten) ingång.

Nej, det hade du INTE... :-)

Det citat som du kommenterar handlar om de tre värden på "CHS3:CHS0: Analog Channel Select bits"
som inte "pekar" på någon implementerad (därav "unimplemented") ADC-kanal alls !

Det handlar inte om hurvida de är aktiverade eller inte, de *finns* helt enkelt inte alls !

Om man däremot läser från en existerande kanal som inte är aktiverad så får man det
aktuella värdet på en digitala pinnen, inte ett "floating" värde, om jag inte minns fel...
[ALV]
Inlägg: 204
Blev medlem: 30 september 2004, 13:55:12
Ort: Stockholm

Re: PIC18f4550 ADC problem

Inlägg av [ALV] »

Icecap: vad föreslår du att jag ska göra då? jag har inga andra picar hemma, och anser väl att skillnaden mellan 16 och 18 serien inte är gigantisk i svårighets grad "om man bortser från att jag faktiskt kör 4550 som har usb som kan ställa till det"
det jag försöker göra borde vara bland det mest elementära och jag försöker lära mig men nu kan jag inte längre avgöra om det är jag som gör fel eller om det är något annat.

Antar att du kommer peka mig mot asm, isf var är min tutorial? och hur enkelt är det att sätta upp en HID med asm exempelvis?
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18f4550 ADC problem

Inlägg av sodjan »

> Icecap: vad föreslår du att jag ska göra då?

Jag är inte Icecap, men i alla fall... :-)

1. Se till att du förstår hur ADC'n fungerar.
2. Om det inte fungerar med C, skriv ett enkelt ASM "proof of concept". (Sannolikt inte fallet)
3. Gör lite grundläggande felsökning.

Jag skulle t.ex göra ungefär detta :

1. Ersätt fotomotstånden med en fast spänningsdelare med ett par 1Kohm motstånd.
2. Kolla att jag inte har missat något med konfigureringen av de aktuella pinnarna.
3. Sätt ADCON2 så att jag är "on the safe side". D.v.s "ta till" acquisition och conversion time.

En sak från första posten:

> Min led lyser konstant efter att jag satt PORTD.F2 = 1 sen hänger sig programet eller liknande.

Betyder det att du kommer förbi ADC_Read() ?
I så fall är det väl något annat ?
Skriv svar