Sida 1 av 1
16F886, PORTB beter sig mycket konstigt...
Postat: 3 februari 2008, 18:45:56
av net4all
Hejsan!
Hade tänkt att börja exprimentera med AD-omvandling och har därför införskaffat en PIC 16F886.
Började som vanligt med att ställa in CONFIG-Word, samt köra det gamla "blinka led" programmet. Inga problem alls...
Då var det bara en LED som styrdes.
Men när jag sedan skulle börja styra flera LEDs på PORTB så hände något mycket konstigt...
Om man försöker förändra värdet i PORTB på något annat sätt än att skriva tex PORTB=23; så blir alla bitar 0.
Om man skriver:
PORTB=23;
PORTB.0=0;
Dvs: sätt PORTB till 23 och 0-ställ bit 0 i PORTB
Då blir alla bitarna i PORTB 0...
Men om man gör exakt samma sak på tex PORTC så blir det inga problem..
Följande program används för att göra ett rinnande ljus:
Rinnande Ljus
Om man använder PORTB(som i programet) så blir det bara ett kort blink på PORTB.0 och PORTB.2.
Om man sedan kopplar om hårdvaran och
använder PORTC så får man ett rinnande ljus..
(Hårdvaran alltid samma, förutom portbyte)
Vad kan det vara?
Edit: Radbrytningar
Postat: 3 februari 2008, 19:24:21
av Icecap
Nu använder jag inte den version av C men för att shifta bits är C-kommandot:
"PORTB >>= 1".
'rr' vet jag inte om din kompiler stödjer och jag ids inte sätta mig in i det heller.
Postat: 3 februari 2008, 19:29:14
av net4all
Funktionen rr() är rotera höger, dvs flytta alla bitarna ett steg åt höger..
Shifta bit? Du menar Byta från tex 0 till 1?
Postat: 3 februari 2008, 19:32:28
av sodjan
> Vad kan det vara?
Rent slarv. RTFM.
Speciellt den lilla grå rutan med "Note!" i fet stil :
"The ANSELH register must be initialized
to configure an analog channel as a digital
input. Pins configured as analog inputs will
read 0."
Postat: 3 februari 2008, 20:04:54
av net4all
Ok, så det behövs också för pinnar som är output?
Fattar det som om output inte skulle påverkas, men får väll testa...
Postat: 3 februari 2008, 20:11:06
av Marta
Ja, det behövs, ifall Du vill kunna läsa hur utgångarna står.
Vid läsning så läses pinnens status, inte latchen. När en enda bit skall ändras så läses porten, biten ändras och alla åtta bits skrivs tillbaka. Eftersom då de som är analogkonfiguerade läses som nollor så skrivs de tillbaka som nollor fast de skulle vara ettor.
Alternativen är att konfigurera rätt (enklast), använd en kopia at manipulera och skriv sedan till porten (mindre manualläsande?) eller använda PIC18 där latchen kan läsas (kräver även det lite manualläsande så rätt register används).
Postat: 3 februari 2008, 20:17:26
av sodjan
På ett ställa står det "I/O pins configured as analog input always read 0."
Lite otydligt kanske...
På ett annat (betydligt tydligare) :
"The state of the ANSELH bits has no affect on digital
output functions. A pin with TRIS clear and ANSELH
set will still operate as a digital output, but the Input
mode will be analog. This can cause unexpected
behavior when executing read-modify-write
instructions on the affected port."
Och "Unexpected" var väl precis vad det blev.
Och det är alltså det du gör med dina instruktioner som försöker
ändra en enstaka pinne, alla pinnarna läses (R) som "0", din bit ändras (M)
och det hela skrivs tillbaka (W). Och alltså kommer alla andra bitar
att vara 0 efter operationen. D.v.s ett "R-M-W-problem".
Men, som sagt, varför har du pinnarna som *analoga* I/O-pinnar alls ??
Postat: 3 februari 2008, 21:26:21
av net4all
Ja... Varför har jag dom som analoga?
Än en gång har net4all's oförmåga att läsa datablad ordentligt skapat en ny tråd!
Hade uppenbarligen missat det med read-modify-write och
trott att output inte skulle påverkas...
Men nu fungerar det, så: Tack för hjälpen allihop!
(ADC nästa, hoppas det går lättare, har ju exempelkod!)
Postat: 3 februari 2008, 23:39:54
av sodjan
> ADC nästa, hoppas det går lättare,...
Glöm bara inte att ställa om pinnarna till analoga I/O...

Postat: 4 februari 2008, 17:46:22
av net4all
Istället för att skapa en ny tråd så frågar jag här igen:
ADC'n fungerar med en trimpot, dvs 3-polig, AD pinnen får en spänning mellan VSS till VDD. Allt funkar
Men hur ska jag göra om jag har ett temperaturkänsligt motstånd?
Dvs en termistor, resistans ca 100-200 ohm
Kan inte hitta något som går igenom hårdvaran till ADC'n, bara mjukvaran, som jag redan löst...
Postat: 4 februari 2008, 18:07:17
av sodjan
> Kan inte hitta något som går igenom hårdvaran till ADC'n,
Databladet har allt om ADC'n både hård och mjukvara.
Däremot så finns det inget i databladet om vad du gör *utanför*
processorn, förrutom minsta impedans t.ex.
> Dvs en termistor, resistans ca 100-200 ohm...
Igen speciellt bra "temperaturmätare", men du kan göra en enkel
spänningsdelare med termistorn och ett motstånd. Eventuellt med en
opamp för att få ett bättre sving, eller helt enkelt en riktigt temp-givare...
Postat: 4 februari 2008, 19:34:30
av net4all
Nej, exakt blir det kanske inte, men just nu är det mest bara för att lära sig att hantera ADC'n.
Sen om jag skulle behöva mäta temperatur så får du(Jescab) nog en order på några temperatursensorer.

Postat: 4 februari 2008, 20:43:38
av JimmyAndersson
Flyttade tråden. Tyckte den passade bättre i Mikroprocessor-delen.

Postat: 4 februari 2008, 23:20:05
av grubs
Jag har för mig att Microchip har några application notes på hur man kopplar t.ex. en termistor till ADC:n, med bl.a. linearisering på olika sätt.
Postat: 5 februari 2008, 14:38:34
av net4all
Jaså? Har inte lyckats hitta något...
Men jag har fått det att fungera med spänningsdelare, dock har jag inte gått in på att omvandla ADC'ns värde till grader C.....
En primitiv robot sattes även ihop, mäter egen matnings spänning/varnar när batteriet blir dåligt, navigerar genom att mäta IR-ljus/+"vanligt" ljus
Jobbar vidare på ADC'n
