16F886, PORTB beter sig mycket konstigt...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

16F886, PORTB beter sig mycket konstigt...

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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’."
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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...
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg 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).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ??
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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... :roll:

Men nu fungerar det, så: Tack för hjälpen allihop! :D

(ADC nästa, hoppas det går lättare, har ju exempelkod!)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> ADC nästa, hoppas det går lättare,...

Glöm bara inte att ställa om pinnarna till analoga I/O... :-) :-)
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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. :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Flyttade tråden. Tyckte den passade bättre i Mikroprocessor-delen. :)
grubs
Inlägg: 257
Blev medlem: 6 juni 2007, 01:34:39
Ort: Göteborg

Inlägg 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.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg 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
:D

Jobbar vidare på ADC'n :)
Skriv svar