Jag får konstiga tecken på LCDn när jag försöker läsa från 10bit ADn. Endast AN0 används i pic18f2455. Har jag gjort nåt fel eller? Jag har även försökt läsa av endast ADRESH och ADRESL som är 8bit var och skriva ut i LCDn men samma fel.
Nej, itoa() fungerar fint. Jag har tidigare omvandlat tal (int, char) med den funktionen och sparat i en string (här "data"). Sen är det bara att skriva ut den med "putsXLCD(data)".
sodjan, de tecken jag får är typ vågräta linjer med en pixels mellanrum (LCDn är en 5x7). Förstår du?
Det konstiga är också att det första tecknet som skrivs på LCD är vanlig siffra som ändras med samplingen, men de övriga är som beskrivet ovan.
Jag har väl inte gjort fel på initieringen av ADn elller?
Bör du inte speca hur mycket utrymme den skall tilldelas?
Kan vara så att det inte får plats med ett \0 islutet på strängen och då skriver kanske din LCD rutin ut diverse annat som ligger i minnet.
Anledningen att jag frågade var att man kanske via teckentabellen för LCD'n kan räkna ut bakvägen vad som faktiskt skickas ut till den.
Är det rätt *antal* tecken, eller kommer det jycket mer än vad det ska ?
Kan du skriva ut någonting alls på LCD'n från samma kod ?
T.ex ettan i "putrsXLCD( "1" );", kommer den ut ?
Hur mycket debugging har du gjort ?
Har du verifierat itoa och LCD rutinen genom att ge "tal" ett hårdkodat värde (alltså inte hämtat från ADC'n) ?
Det är ju centralt att ta reda på om det är ADC'n eller LCD'n du har problem med !!
Har du provat att göra ett enkelt assembler program för att läsa ADC för att verifiera att de delarna är OK ?
Har du kollat assembler koden som genereras för att verifiera att C kompilatorn gör vad du tror ?
Vad är det för C kompilator ?
Är "for(i=0;i<50;i++);" för ADC'ns aqcuisition time (borde i och för sig räcka...) ?
Felet ligger inte i "char data[]"...det som läggs in dit är 10bitars data fast konverterad till sträng.
Antalet tecken som skrivs på LCDn är rätt, alltså 10st. Anledningen till att jag lade till "putrsXLCD( "1" );" är just att kolla att LCD inte är död. Så det fungerar klockrent. Självaste rutinen "itoa" fungerar fint som jag skrev tidigare.
"for(i=0;i<50;i++);" har jag lagt till i efterhand för säkerhetskull, men annars finns ju "Tad" tiden definierade i ADCON registren. Kompilatorn är C18.
Jag kanske borde ta en titta på assembler koden som genereras.
Vilken funktion i C18 är det som inte är värd att använda ? Och varför inte ?
Vad är det i manualen som inte verkar stämma (det är vad jag läser mellan rederna att du tycker) ?
Det är lite dålig stil (efter ha fått flera att lägga tid på att hjälpa till) inte lämna en förklaring till vad som var orsaken till dina problem med koden...
PS : Jag förstår fortfarande inte varför det skulle bli 10 tecken på LCDn.
"det" är själva strängkonverteringen (i C18 itoa) felet ligger. Den sträng som konverterats kan inte skrivas ut till lcdn med putsXLCD rutinen; det är just då man får konstiga tecken (men ibland funkar det faktiskt typ 1 på 10) .
Jag skrev ihop nåt snabbt och vips så funkade allt utmärkt:
vad gör if satserna för nytta?
digits är ju alltid 4! Altså körs alla alltid...
data[] borde definitivt sättas till en längd, om inte minst för att göra koden tydlig, man har ju inte en susning om den är 10 bytes eller 200 bytes när man vill banta programmet.