Sida 1 av 1

PIC16F88 + LCD + A/D

Postat: 11 september 2007, 19:05:20
av Cryptomaster
Hejsan alla !

Jag har precis dammat av halv-getingen (wisp) och börjat labba lite med PIC och company. Har hittils knäckt alla nötter med dom stora verktygen Elektronikforumet och Google. Men nu har jag stött på en extra svår.

"Problemet" ligger i att jag vill få en LCD att visa värdet från A/D convertern.

Utrustning:
PICbasic Pro 2.46
Wisp 628
PIC 16F88

Jag har fått den att visa meddelanden på LCD'N.
Jag har fått den att utföra uppgifter när värdet från A/D'n är det jag specifierat, eller inom vissa ramar.

Hur man får dom enstaka att fungera är inget problem för mig. Men jag vill kunna ha dom båda inkopplade samtidigt, som det är i nuläget så ligger LCD'n på nån av A/D'ns pinnar, och det gillas inte.

Jag har därav två frågor:

1. Kan man få A/D'n att använda enbart 1 av 7 möjliga pinnar ?
2. Kan man få LCD'n att använda andra pinnar än dom som den ligger på som standard. Dom i detta exempel http://www.melabs.com/resources/samples/pbp/lcd.bas

Postat: 11 september 2007, 20:56:26
av sodjan
> 1. Kan man få A/D'n att använda enbart 1 av 7 möjliga pinnar ?

Står i databladet.

> 2. Kan man få LCD'n att använda andra pinnar än dom som den ligger på som standard.

Står i manualen.

Postat: 11 september 2007, 22:42:08
av H.O
Hej,
För att använda andra pinnar än "standard" för LCD'n kan du, till exempel:

Kod: Markera allt

'******** DEFINE THE CONNECTION FOR LCD IN 4 BIT MODE *******
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4             'Databus on PortD 4, 5, 6, 7
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2            'RSBit on PortD 2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3             'Enable on PortD 3
'********************************************************
Kolla PBP-manualen för mer info. Observera att du de 4 "data-pinnarna" måste "hänga ihop", du kan inte "sprida ut" dom över diverse I/O's - om du vill/måste göra det så kan du ta en titt på Darrel Taylors LCD_AnyPin här som förövrigt är ett dedikerat forum för MicroEngineeringLabs PICBasic kompilatorer.

Angående ADC'n så får du, precis som Sodjan skriver, ta en titt i databladet för din PIC - kolla register ANSEL, ADCON0 och ADCON1. Sätt dom som du vill ha dom och använd sedan PBP's ADCIN eller skriv/läs ADCn's register direkt.

/H.O

Postat: 12 september 2007, 00:12:26
av Cryptomaster
I databladet, sida 116:
http://ww1.microchip.com/downloads/en/d ... 30487c.pdf

Där verkar det stå nått,
110 = Channel 6 (RB7/AN6)

men jag förstår inte hur man skall skriva för att använda dessa inställningar ?

Postat: 12 september 2007, 08:01:41
av H.O
Hej,
Dom tre bitarna talar om för ADC'n vilken kanal som du vill ha omvandlad. I princip så skriver du 110 till de tre bitarna, sätter GO/DONE till 1 och väntar tills den åter blir 0, då är konverteringen klar. MEN om du använder PicBasicPro's ADCIN kommando så behöver du inte göra något av ovanstående - PBP gör det åt dig.

Om du vill ha enbart AN1 som analog ingång gör du:

Kod: Markera allt

TRISA = %00000010     'PortA.1 som ingång, resten som utgångar
ANSEL = %00000010     'PortA.1 som analog, resten som digital.
ADCON1 = %10000000    'Right justified, vRef+ är Vdd och vRef- är Vss

myVAR var Word

Start:
  ADCIN 1, myVar
  LCDOUT $FE,1,"myVar = ", #myVar
  Pause 100
Goto Start
OBS! Icke testat, med allt vad det innebär.

Det finns också en del DEFINE's för ADC'n - vad dom gör är egentilgen att dom sätter vissa bitar i ADCON0 och ADCON1 åt dig. Till exempel VAR ADC'n skall få sin klocksignal ifrån etc. Använd dom eller sätt bitarna "manuellt" om du vill ha bättre koll.

/H.O

Postat: 12 september 2007, 09:21:11
av sodjan
> I databladet, sida 116:

Se databladet sidan 113, "Register 12-1".

Är det det något som är oklart där ?
Och i så fall vad ?

Postat: 12 september 2007, 14:26:31
av Cryptomaster
Tack för alla svar !

Efter H.O's inlägg så har poletten trillat ner och jag ser (eller i alla fall åt rätt håll) hänger ihop i databladet.

%xxxx.... motsvarar då Ja och Nej till varje del som beskrivs i databladet, och man kan därav använda databladet för att läsa ut vad dom olika bitarna motsvarar, och sen välja ja eller nej. Eller enligt databladet.

Det enda egentliga problemet, det var väl att förstå binära talsystemet, det var ett tag sedan man höll på med det.
Databladet är inte direkt svårt, det är bara väldigt mycket, men i grund och botten är det Ja och Nej hela tiden.

Det är bara en fråga; i databladet så beskrivs vissa bits som "uninplemented read as 0".

Den används alltså inte, så det borde inte då heller spela nån roll vad man skriver på den platsen ?

Men man måste skriva en 1:a eller 0:a ? Det går inte att hoppa över den ?

Postat: 12 september 2007, 14:36:14
av sodjan
> Men man måste skriva en 1:a eller 0:a ?

Vad annars ? "En halv" :-)
Det här är en digital värld... :-)

> så det borde inte då heller spela nån roll vad man skriver på den platsen

Korrekt.

Postat: 12 september 2007, 14:50:38
av Cryptomaster
Jag tänkte mest att man inte kan skriva "ingenting", men då skulle ju alla bitar flytta sig. Eller processorn kommer uppfatta det som om att dom är flyttade ?

Men går det att slopa att skriva dom ?, eller är det bara fylla ut dom med 0:a, eller 1:a om man tycker det är snyggare ?

Postat: 12 september 2007, 14:55:29
av Icecap
Om bitsen inte har betydelse pga. andra val är de "Don't care", alltså kan man skriva '0' eller '1' helt efter vilket humör man är på.

Postat: 12 september 2007, 15:06:35
av H.O
Hej,
Om dom tre mest signifikanta bitarna är unimplemented så kan du skriva:

Whatever = %10101
eller
Whatever = %00010101
eller
Whatever = 21
eller
Whatever = $15

Du kan också sätta bitarna en och en om du skulle villja det:
Whatever.0 = 1
Whatever.1 = 0
Whatever.2 = 1
Whatever.3 = 0
Whatever.4 = 1


/H.O

Postat: 12 september 2007, 16:32:40
av sodjan
> Whatever = %10101

Inte bra.
Man måste hela tiden fundera på om det var till höger eller till vänster som det fylls ut.
Och om det var med nollor eller ettor. Koden blir också mer svårläst.

> Whatever = %00010101

Bättre.
Ange alltid 8 bitar om det är ett 8 bitars register. Oavsett eventuella "undefined" bitar...
Visar också att man visste vad man höll på med när man skrev koden.

Postat: 12 september 2007, 17:42:47
av H.O
Sodjan,

Vad då?? Kan hålla med om att det kanske ser "snyggare" ut att "fylla ut" med nollor men inte skriver du Whatever = 021 i decimal form?? Siffran längst till höger är väl den minst signifikanta oavsett talsystem? DÄREMOT - om "undefined" bitarna vore bit 0 och 1 i registret så måste man GIVETVIS "fylla ut".

Håller inte heller med om att det nödvändigtvis visar att man vet vad man gör om skriver till bitar som inte har någon funktion - men det är som sagt också valfritt.

/H.O

Postat: 12 september 2007, 19:34:48
av sodjan
Det beror på vilket radix man kör med. Decimalt format är lite speciellt.
För alla är det självklart att decimala tal inte anges med inledande nollor.

Hex, okt och binärt därimot skrivs normalt med alla inleddande nollor utskrivna.
Jag skriver hellre t.ex hellre h'0E' än h'E' o.s.v

> Kan hålla med om att det kanske ser "snyggare"...

Och eftersom det inte finns någon nackdel, så är det alltså avgort... :-)