Problem med att sätta specifik pinne på port, Microchip C18

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Frisk
Inlägg: 92
Blev medlem: 9 maj 2007, 21:31:10
Ort: Södertälje
Kontakt:

Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av Frisk »

Hej, ursäkta en onödigt lätt fråga, men sökt någon timme här nu och även googlat ett tag utan att hitta något konkret svar.

Satt igår och tänkte dra igång ett gammalt projekt igen, men kom inte så långt.
Tänkte skrukturera upp koden ordentligt denna gång och köra riktiga defines m.m. för att lätt kunna följa vad koden gör. Började med de 4 lysdioder som sitter på kortet (PORTA 0-3).

Upptäckte dock något jag inte räknat med, kör just nu Microchip C18-kompilatorn.
För att ändra t.ex. Port A0 har jag fått för mig man skriver på detta sätt: PORTAbits.RA0 = x; Detta fungerar, men koden verkar inte ändra bara den pinnen jag är intresserad av, utan hela porten. har jag PORTA satt till 0x0F och skriver PORTAbits.RA0 = 1 blir PORTA istället 0x01, sätter jag 0 blir den 0x00.

Är ju inget svårt problem att gå runt, men skulle kännas bra med en förklaring innan jag lämnar problemet. Är "PORTxbits.Rxn"-kommandot enbart till för att läsa portar?

Antar väl eg. inte hårdvaran spelar någon roll i just denna fråga men är i alla fall en PIC18F4550. MPLAB IDE 8.20 Microchip C18 3.15
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

> Antar väl eg. inte hårdvaran spelar någon roll...

Självklart spelar det *all* roll !
Jag sätter en slant på att du bara har slarvat med att läsa databladet.
Jag tror jag vet vad det beror på, men vi kan väl vänta tills du har kollat,
det står ju i databladt och det finns ingen alnedning att upprepa det här.
Och det har inte ett smack med C18 att göra...

> och även googlat ett tag

Helt bortkastat, det står tydligt i databladet.
Frisk
Inlägg: 92
Blev medlem: 9 maj 2007, 21:31:10
Ort: Södertälje
Kontakt:

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av Frisk »

Tack för svaret. Trodde helt det var något kompilator-relaterat problem.

Läst om PORTA i databladet nu, men ser inget som förklarar de problem jag råkat ut för. Kan man få nån liten hint till var jag ska läsa? Vad som möjligtvis skulle kunna vara är att det är bättre å använda LATA, men tolkar databladet som att en skrivning till porten ändå ändrar LATA, eller?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

Ja, LATA kringgår sannolikt det du har missat.
Problemet är inte när du skriver till PORTA, utan då PORTA läses.
Kolla den lilla grå rutan där det står "Note:"...
Frisk
Inlägg: 92
Blev medlem: 9 maj 2007, 21:31:10
Ort: Södertälje
Kontakt:

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av Frisk »

Tack för hjälpen! Ska testa detta istället då.

Har läst igenom Portar i allmänhet och PORT A-D utan att hitta denna note, den note jag hittar på PORTA är "On a Power-on Reset, RA5 and RA3:RA0 are configured as analog inputs and read as ‘0’. RA4 is configured as a digital input"
Har vi olika datablad? Detta har jag: http://ww1.microchip.com/downloads/en/D ... 39632D.pdf
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

Du har hittat rätt "Note:"
Det är just "...and read as ‘0’..." som är problemet.
Stäng av analoga funktioner och prova igen...
Frisk
Inlägg: 92
Blev medlem: 9 maj 2007, 21:31:10
Ort: Södertälje
Kontakt:

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av Frisk »

Problemet låg inte i att de var analoga, det var redan inställt, kunde som sagt ställa pinnarna satte jag 0x0F på porten tändes samtliga, dock slocknade alla utom den aktuella då jag skrev PORTAbits.RA0 = 1 satte jag 0a istället slocknade hela porten.
När jag istället använde LATAbits.LATA0 fungerade det dock enligt förväntan.

Vad är skillnaden mellan dessa kommandon? Försökt läsa mig till det i databladet utan att helt förstå när man ska använda vilken, i detta fallet var det ju iaf tydligt att använda LATA, men om jag ska ändra en hel port, och vet vilket värde den ska ha, är det då bättre att använda PORT? Skriver den utan att läsa innan?
När är isf kommandot för portbitar aktuellt? (PORTAbits.RA0) är det bara vid läsning eller finns det någon gång man "bör" använda det även vid skrivning?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

> Problemet låg inte i att de var analoga, det var redan inställt,

Vad var vadå ? Hur var de analoga funktionerna konfigurerade ?
Du har inte sagt ett smack om att de skulle vara avstängde, och
alltså antog jag att du hade glömt bort det eller missat det. Du har
ju inte visat någon kod som visar vad du faktiskt har gjort, bara
försökt beskriva med egna ord vad du *tror* att du har gjort (vilket
oftast misslyckas).

> När jag istället använde LATAbits.LATA0 fungerade det dock enligt förväntan.

Ja, som jag sa. Det kringgår problemet, men löser inte grundproblemet.

> Vad är skillnaden mellan dessa kommandon?

Vilka "kommandon" ?
Det är ju samma kommando som skriver till LATA eller PORTA.
Eller menar du "skillnad mellan dessa portar" ?

> men om jag ska ändra en hel port,

Vid skrivning av hel port finns inget "read-modify-write" fenomen
att ta hänsyn till.

> Skriver den utan att läsa innan?

Om "den" är "skrivning av hel port", ja.
Om "den" är "LATx", så nej, det är ingen skillnad.

Ditt "problem" är att skrivning med bit-instruktionerna även läser regsitret först.
Jag tror att det framgår av databladet. Leta efter "read-modify-write".
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av vfr »

Om den läser eller inte innan den skriver, har inte med portadressen att göra. Det beror på instruktionen. Gör du en RWM-instruktion (Read Modify Write) så läser den först porten. Hur ska den annars veta hur övriga bitar skall vara när den bara skall sätta t.ex bit 1? Då måste först hela porten läsas in och rätt bit modifieras för att sedan skriva ut reultatet. Skillnaden på latchregisterna och dom vanliga portregisterna är just vid läsningen. På portadressen så läses portens värde, d.v.s ingångar läses som ingångsbitar, medan på latchadressen så läses vad du har satt utgångslatcharna till att vara. I många fall spelar det kanske inte så stor roll vilket man använder, men skall du göra RWM-instruktioner så är det viktigt att använda latchregisterna. Speciellt om man har vissa pinnar som ingångar.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

Det vanligaste fallet av r-m-w problem är när man har "glömt" att slå av analoga funktioner,
då läses alla pinnar som "0" och man får konstiga fel där t.ex tända lysdioder
släcks "av sig självt"...
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av vfr »

Visst är det så!
Användarvisningsbild
BER
Inlägg: 399
Blev medlem: 9 mars 2005, 00:02:10
Ort: Östergötland

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av BER »

Har haft samma problem som Frisk. Det var första gången jag använde 18-serien och skulle porta ett projekt från 16-serien. Har för mig att jag hade läst att instruktionsuppsättningen skulle vara bakåt kompatibel. När jag skrev en byte på port D så ändrade sig port C,D och E. Jag skrev då till PORTD registret... vilket inte var rätt. Läste igenom databladet (denna gång noggrant) och insåg då att jag skulle skriva till LAT D. Det kanske är en tolkningsfråga vad som menas med bakåt kompatibel. Jag tycker dock att det är en hårdvarubugg om två andra register ändras om jag råkar skriva till ett register som är ämnat för läsning.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av vfr »

Nu missförstår du nog saker och ting. RWM-problemet har inget att göra med att ändra ett register som får till följd att andra register ändras.

Problemet består i att när mikrokontrollern skall sätta t.ex en enstaka bit i ett register för en ut-port, så måste den först läsa hur dom andra bitarna i registret skall vara. Om då dessa portbitar är satta som digitala eller ananloga ingångar så är inte det lästa värdet lika med utvärdet på porten. Det gör då att andra portbitar blir satta till ett felaktigt värde baserat på det som är inläst. Så är det i alla mikrokontroller och portkretsar om man inte har alldeles speciella möjligheter i arkitekturen att sätta enstaka bitar i ett register. Det är inte vanligt.

Det är detta som Microchip kringgår genom att lägga till ett extra register, latchregistret. Oavsett om portbitarna är satta som ingångar eller utgångar så representerar det registret det verkliga utvärdet för portbitarna.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av sodjan »

> När jag skrev en byte på port D så ändrade sig port C,D och E.

Det tror jag inte ett smack på. V.v. visa ett exempel på det !

> Jag tycker dock att det är en hårdvarubugg om två andra register
> ändras om jag råkar skriva till ett register som är ämnat för läsning.

"Ämnat till läsning" förstår jag inte alls. Vad menar du ?
Du har haft något annat fel i din kod som du har helt misstolkat
(eller misslyckats med att beskriva korrekt här).
Användarvisningsbild
BER
Inlägg: 399
Blev medlem: 9 mars 2005, 00:02:10
Ort: Östergötland

Re: Problem med att sätta specifik pinne på port, Microchip C18

Inlägg av BER »

Nu missförstår du nog saker och ting. RWM-problemet ... ja och nej

Förstår problematiken, men gjorde en liten feltolkning, (var lite slö och läste inte databladet efter de första inlägget om RWM). Läste RWM-instruktion i tidigare inlägg och tänkte då att kompilatorn tolkar ju PORTAbits.RA0 = X till en BCF instruktion eller en BSF instruktion, missad att RWM-operationen är en del av tidigare nämnda instruktioner.

Envis som jag är så skulle jag dock vilja hävda att PORT registren endast bör användas för avläsning på 18-serien, då jag lyckades få halva kretsens portregister att få fnatt genom att skriva en byte till ett PORT register. Jag har inte set någon ERRATA på felet och vid tillfället så lyckades jag återskapa det på fem olika kretsar (samma modell) med två olika "kisel" versioner.

Det tror jag inte ett smack på. V.v. visa ett exempel på det
suck ...

"Ämnat till läsning" förstår jag inte alls. Vad menar du ?
Om t.ex. en databuss skall läsas av som är kopplad till en port så används PORT registret för avläsning.
Visst kan man läsa LAT registret men då får man veta vad man skrev sist.

min förenklade tolkning är att primärfunktionen för PORT registren i 18-serien är att de skall användas för avläsning och primärfunktionen för LAT registren är att de skall användas för skrivning.

sojdan: Kan du förklara den stora meningen med att skriva till PORT registret i stället för LAT registret?

Jag kan beskriva lite mer precist så får ni dra era egna slutsatser
Krets : PIC18F458
Debugger: ICD2
Kompilator: C18

1. Vid debugging av koden så upptäckte jag att konstruktionen fullständigt spåra ur. (har ej koden kvar i den utgåvan)
2. Fann att det var raden "PORTD = 0x55;" som fick konstruktionen att spåra ur.
3. Lade en brytpunkt på raden, gjorde reset, och starta om
4. Lästa av värdena i watch fönstret och mätte av portarna med multimeter.
5. Gick in i asemblerfönsret och utförde ett single step så att jag kom förbi MOV instruktionen
6. Lästa av värdena i watch fönstret och mätte av portarna med multimeter.
7. Konstaterade att även LAT C och LAT E hade ändrats bekräftade även genom att mäta nivåerna på de pinnar som var satta till utgångar på portarna C och E.
Skriv svar