PIC18f4550 ADC problem
Re: PIC18f4550 ADC problem
Inte nödvändigtvis mot ASM men se till att du faktisk vet vad du gör! DU kan vilja göra så mycket HID du vill, i nuläget kan du ju inte få det att fungera eller hur?
I nuläget vet du inte vad som inte fungerar och du vet inte heller varför eller hur?
Därför anser JAG att du kan göra precis samma steg som du skulle ha gjort i ASM, alltså ett antal "register nånting = ett visst värde" som setup.
Sedan läser du ADC'ns statusbit efter ett omvandlat värde som du sedan sänder via UART'en vid att kolla statusbit och skriva när den är klar osv. På detta vis har du ingen obekanta och du kan kolla varje steg med en LED som markering, något jag har klarat mig med i många år.
I nuläget vet du inte vad som inte fungerar och du vet inte heller varför eller hur?
Därför anser JAG att du kan göra precis samma steg som du skulle ha gjort i ASM, alltså ett antal "register nånting = ett visst värde" som setup.
Sedan läser du ADC'ns statusbit efter ett omvandlat värde som du sedan sänder via UART'en vid att kolla statusbit och skriva när den är klar osv. På detta vis har du ingen obekanta och du kan kolla varje steg med en LED som markering, något jag har klarat mig med i många år.
Re: PIC18f4550 ADC problem
Ta ett steg i taget.[ALV] skrev:vad föreslår du att jag ska göra då?
Som det är nu har du tre byggstenar (adc, usart, delay) som du inte har en aning om hur de funkar under huven utan du utgår kallt från att de funkar. Steg 1 är att eliminera dem, för att sen gradvis införa dem och på så vis utesluta att det är de som felar.
För delay kan du göra typ unsigned int i; for(i = 0; i < 12345; i++) {}. Istället för usart (har inte lusläst trådens alla detaljer och jag orkar inte göra det, men jag antar du använder den för att skriva ut debuginfo) kan du använda lysdioder. ADC:n gör du med manuell kod.
Det är så man utvecklar kod, tar en sak i taget. Att ta för många okända variabler på en och samma gång slutar oftast med att man ändå måste riva isär allt i atomer i slutändan, och börja om från början med ett steg i taget. Enklast är att ta dessa steg redan från början.
Re: PIC18f4550 ADC problem
tack för alla svar!
Sodjan:
>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.
1. jag försöker, trodde mig ha kunskap nog att kunna få igång den i all fall men icke.
2. gärna, har du några länkar till sidor som går igenom grunderna? vad behöver jag för compilator i så fall? använder xwisp2 som vill ha en hex fil.
>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.
har bytt till ett 3k (enl min multimeter iaf).
>2. Kolla att jag inte har missat något med konfigureringen av de aktuella pinnarna.
jag har trippelkollat, därför jag ber om hjälp bland annat.
>3. Sätt ADCON2 så att jag är "on the safe side". D.v.s "ta till" acquisition och conversion time.
exakt det jag tror mig ha gjort, tar gärna emot ett bekräftande.
>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 ?
Nej, jag kommer inte förbi ADC_Read(), jag tänder min diod för att se att den startar sen förblir den tänd och indikerar på att den inte kör min loop.
bos:
Jag har testat de mesta i den vägen, inte delay biten dock men det kan jag naturligtvis testa med.
Jag vill understryka att jag är ganska säker på att det är ADC_Read som dör efter att ha testat att bara tända en led efter att ha läst av AN0 men inte lyckats.
Hur som, nu är jag jag nyfiken på att köra en asm kod snutt för att endast ersätta ADC_Read(), finns det någon som skulle kunna tänka sig att bidra med kod eller vettig läsning för ändamålet?
Sodjan:
>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.
1. jag försöker, trodde mig ha kunskap nog att kunna få igång den i all fall men icke.
2. gärna, har du några länkar till sidor som går igenom grunderna? vad behöver jag för compilator i så fall? använder xwisp2 som vill ha en hex fil.
>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.
har bytt till ett 3k (enl min multimeter iaf).
>2. Kolla att jag inte har missat något med konfigureringen av de aktuella pinnarna.
jag har trippelkollat, därför jag ber om hjälp bland annat.
>3. Sätt ADCON2 så att jag är "on the safe side". D.v.s "ta till" acquisition och conversion time.
exakt det jag tror mig ha gjort, tar gärna emot ett bekräftande.
>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 ?
Nej, jag kommer inte förbi ADC_Read(), jag tänder min diod för att se att den startar sen förblir den tänd och indikerar på att den inte kör min loop.
bos:
Jag har testat de mesta i den vägen, inte delay biten dock men det kan jag naturligtvis testa med.
Jag vill understryka att jag är ganska säker på att det är ADC_Read som dör efter att ha testat att bara tända en led efter att ha läst av AN0 men inte lyckats.
Hur som, nu är jag jag nyfiken på att köra en asm kod snutt för att endast ersätta ADC_Read(), finns det någon som skulle kunna tänka sig att bidra med kod eller vettig läsning för ändamålet?
Re: PIC18f4550 ADC problem
Varför ASM?
Det är ju bara att välja rätt A/D-ingång ("register x = värde"), aktivera en omvandling (sannolikt "Startbit = 1"), vänta på att omvandlingen blir klar (while(!Klar_Bit);) och sedan läsa värdet ("Resultat = A/D_Register nånting").
Det är ju bara att välja rätt A/D-ingång ("register x = värde"), aktivera en omvandling (sannolikt "Startbit = 1"), vänta på att omvandlingen blir klar (while(!Klar_Bit);) och sedan läsa värdet ("Resultat = A/D_Register nånting").
Re: PIC18f4550 ADC problem
Jaha, då har jag försökt med en del varianter men kommer inte långt.
manuell avläsning verkar fungera bättre, men jag vet inte om jag får ut något adc resultat.
Denna kod fungerar, min led blinkar och jag får output på uart men den retunerar bara 0, jag har testat att koppla AN0 pinnen direkt på vdd utan att det förändras.
Några tips om vad som kan vara fel?
manuell avläsning verkar fungera bättre, men jag vet inte om jag får ut något adc resultat.
Kod: Markera allt
unsigned int i = 0;
void main() {
Usart_Init(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 = 0b10111000; // Some timing that i don't understand
PORTD = 0;
TRISD = 0;
PORTD.F2 = 1;
Delay_ms(2000);
while(1) {
//ADCON0 = 0b00000011; // start adc
ADCON0.F1 = 1;
while(!ADCON0.F1) {
i = ADRESH;
}
Usart_Write(i);
PORTD.F2 = 1;
VDelay_ms(100);
PORTD.F2 = 0;
Delay_ms(100);
}
}
Några tips om vad som kan vara fel?
Re: PIC18f4550 ADC problem
Varför läser du bara av det ena resultatsregistret (ADRESH)? Eftersom du har dessutom har omvandlingen satt till right justified (i ADCON2) är det stor sannolikhet att ditt AD-värde är såpass lågt att bit 9 och 10 blir nollor.
Prova i = (ADRESH << 8) | ADRESL; istället.
Prova i = (ADRESH << 8) | ADRESL; istället.
Re: PIC18f4550 ADC problem
hmm, jag trodde det var just det jag undvek genom att använda Right.
jag provar..
jag provar..
Re: PIC18f4550 ADC problem
Ingen märkbar skillnad, terminalen ger mig fortfarande 0x00 hela tiden, oavsett motstånd på AN0.
Jag frötstår dock fortfarande inte avsnitt 21.1 i picens datablad, jag gissar blint när jag sätter ANCON2 registret känns det som.
Jag frötstår dock fortfarande inte avsnitt 21.1 i picens datablad, jag gissar blint när jag sätter ANCON2 registret känns det som.
Re: PIC18f4550 ADC problem
Har iofs inte läst databladet till just denna processor, men, många PICar har separat matning till AD'n vilket du måste koppla in.
I övrigt, ett schema på hur du gjort, samt börja med exempelkoden som finns i bl.a. databladet, och även i uChips mycket stora samling av Appnotes.
Det finns dessutom ett antal bra böcker om just dessa processorer, en del finns på nätet en del finns att köpa.
"The Quintessential PIC Microcontroller" är en bra start, du hittar den på min server bl.a.
I övrigt, ett schema på hur du gjort, samt börja med exempelkoden som finns i bl.a. databladet, och även i uChips mycket stora samling av Appnotes.
Det finns dessutom ett antal bra böcker om just dessa processorer, en del finns på nätet en del finns att köpa.
"The Quintessential PIC Microcontroller" är en bra start, du hittar den på min server bl.a.
Re: PIC18f4550 ADC problem
Exakt hur du kopplat till den analoga ingången? Låter som du bara har ett(1) motstånd till Vss? För att få något intressant värde måste du ha en spänningsdelare, vilket redan har påpekats.
Re: PIC18f4550 ADC problem
> > 1. Ersätt fotomotstånden med en fast spänningsdelare med ett par 1Kohm motstånd.
> har bytt till ett 3k (enl min multimeter iaf).
*Ett* ? Varför ett motstånd ? Och hur ?
> Ingen märkbar skillnad, terminalen ger mig fortfarande 0x00 hela tiden, oavsett motstånd på AN0.
Bortsätt att du verkar ha kopplat galet, vad har du får spänning på AN0 ?
Sen håller jag med övriga. Vi behöver en komplett beskrivning av hur det
*hela* är kopplat, hur CONFIG är inställt o.s.v.
Jag är rellativt övertygad om att det är något skitfel, något som du
gör (eller inte gör) men inte har berättat om (än). Om det är något
utöver hur du kopplar AN0 är lite svårt att säga just nu.
> Jag frötstår dock fortfarande inte avsnitt 21.1 i picens datablad,
Och du måste fortfarande förklara *VAD* som är oklart ! Men å andra
sidan så är det dels en kanske lite väl teknisk text, dels så brukar det
vara så att om man får timingen lite fel så blir bara värderna lite fel.
I ditt fall så spelar det kanske ingen större roll med tanke på hur
du har kopplat AN0. Se till att du har en rimlig uppkoppling till AN0
först innan vi fokuserar för mycket på registren för ADC.
> ...många PICar har separat matning till AD'n vilket du måste koppla in.
Inte just den här, men däremot dubbla Vss och Vdd, och alla 4 ska kopplas in.
> har bytt till ett 3k (enl min multimeter iaf).
*Ett* ? Varför ett motstånd ? Och hur ?
> Ingen märkbar skillnad, terminalen ger mig fortfarande 0x00 hela tiden, oavsett motstånd på AN0.
Bortsätt att du verkar ha kopplat galet, vad har du får spänning på AN0 ?
Sen håller jag med övriga. Vi behöver en komplett beskrivning av hur det
*hela* är kopplat, hur CONFIG är inställt o.s.v.
Jag är rellativt övertygad om att det är något skitfel, något som du
gör (eller inte gör) men inte har berättat om (än). Om det är något
utöver hur du kopplar AN0 är lite svårt att säga just nu.
> Jag frötstår dock fortfarande inte avsnitt 21.1 i picens datablad,
Och du måste fortfarande förklara *VAD* som är oklart ! Men å andra
sidan så är det dels en kanske lite väl teknisk text, dels så brukar det
vara så att om man får timingen lite fel så blir bara värderna lite fel.
I ditt fall så spelar det kanske ingen större roll med tanke på hur
du har kopplat AN0. Se till att du har en rimlig uppkoppling till AN0
först innan vi fokuserar för mycket på registren för ADC.
> ...många PICar har separat matning till AD'n vilket du måste koppla in.
Inte just den här, men däremot dubbla Vss och Vdd, och alla 4 ska kopplas in.
Re: PIC18f4550 ADC problem
Jag och mspaint är inte riktigt vänner så jag utelämnade lite saker för uart , kristall och MCLR.
Kompletterar med exakt konfiguration senare under dagen.

Kompletterar med exakt konfiguration senare under dagen.

Re: PIC18f4550 ADC problem
Du har fortfarande inte ändrat på inputten till den analoga ingången. Det sodjan menade med 2st 1k motstånd var att du med dem skulle skapa en spänningsdelare. Med två likadana motstånd får du då en input på 2.5V vid 5V matning. Så som du har kopplat nu så kommer det bli 5V oavsett vilket motstånd du använder.
Re: PIC18f4550 ADC problem
Hårdvara:
PIC18LF4550
4MHz kristall
Config:
CONFIG1L = --010100 (PLLDIV_1 + CPUDIV_OSC1_PLL2)
CONFIG1H = 00--111x (FSOC_HSPLL_HS)
CONFIG2L = inget satt
CONFIG2H = 0000000 (WDT_OFF)
CONFIG3L = inget satt
CONFIG3H = inget satt
CONFIG4L = 000--0-0 (LVP OFF, XINST OFF)
CONFIG4H - CONFIG7H = inget satt
Kod:
Koppling:

Det som inte framgår bland annat är att jag har MCLR inkopplat på klassiskt vis.
Mäter ut 2.4 V på pinne AN0
Nuläget:
Jag får mitt startup medelande "111" på min uart terminal.
Jag får inte ut något vettigt adc värde på terminalen.
Min led blinkar som den ska.
[EDIT] skämmas borde jag!, det är alltså en PIC 18LF4550-i/p (däremot ser jag inte att skillnaden ska spela någon roll i detta fall)
Har jag missat något så uppdaterar jag denna post.
PIC18LF4550
4MHz kristall
Config:
CONFIG1L = --010100 (PLLDIV_1 + CPUDIV_OSC1_PLL2)
CONFIG1H = 00--111x (FSOC_HSPLL_HS)
CONFIG2L = inget satt
CONFIG2H = 0000000 (WDT_OFF)
CONFIG3L = inget satt
CONFIG3H = inget satt
CONFIG4L = 000--0-0 (LVP OFF, XINST OFF)
CONFIG4H - CONFIG7H = inget satt
Kod:
Kod: Markera allt
unsigned int i = 0;
void main() {
Usart_Init(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 = 0b10111000; // Right just, ??
PORTD = 0;
TRISD = 0;
PORTD.F2 = 1;
Delay_ms(2000);
Usart_Write(111); // startup message
while(1) {
//ADCON0 = 0b00000011; // start adc
ADCON0.F1 = 1; // start adc
while(!ADCON0.F1) {
i = (ADRESH << 8) | ADRESL;
}
Usart_Write(i);
PORTD.F2 = 1;
Delay_ms(400);
PORTD.F2 = 0;
Delay_ms(400);
}
}

Det som inte framgår bland annat är att jag har MCLR inkopplat på klassiskt vis.
Mäter ut 2.4 V på pinne AN0
Nuläget:
Jag får mitt startup medelande "111" på min uart terminal.
Jag får inte ut något vettigt adc värde på terminalen.
Min led blinkar som den ska.
[EDIT] skämmas borde jag!, det är alltså en PIC 18LF4550-i/p (däremot ser jag inte att skillnaden ska spela någon roll i detta fall)
Har jag missat något så uppdaterar jag denna post.
Re: PIC18f4550 ADC problem
Vad är ADCON0.F1
Eftersom jag inte känner igen din C-version, får du förklara det.
På uChipspråk brukar det heta ADCON0bits.GO
Sedan gissar jag att din While-loop (!ADCON0.F1) under förutsättning att det är samma som uChipspråk då är felaktig,
Den skall vara
ADCON0bits.GO släcks när konverteringen är färdig
I din version, kommer du aldrig in i whileloopen, eftersom ADCON0.F1 är 1 ett tag (ett antal ms)
Dvs koden bör se ut så här, ungefär
Eftersom jag inte känner igen din C-version, får du förklara det.
På uChipspråk brukar det heta ADCON0bits.GO
Sedan gissar jag att din While-loop (!ADCON0.F1) under förutsättning att det är samma som uChipspråk då är felaktig,
Den skall vara
Kod: Markera allt
While (ADCON0.F1);
Därefter hämtar du resultatet
I din version, kommer du aldrig in i whileloopen, eftersom ADCON0.F1 är 1 ett tag (ett antal ms)
Dvs koden bör se ut så här, ungefär
Kod: Markera allt
while(ADCON0.F1);
i = (ADRESH << 8) | ADRESL;
Usart_Write(i);