PORT vs LAT ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

PORT vs LAT ?

Inlägg av Erik M »

Vad är det egentliga problemet med att skriva till PORTx istället för till LATx?
Skriver du till PORTx så hamnar det väl i LATx ändå?
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: PORT vs LAT ?

Inlägg av SeniorLemuren »

Här kommer en förklaring:
When writing to an output, actually both do the same but there is a very important difference.

Regularly, when writing to a port, the value is also read back. When writing to a PORT, the value read back very short after writing it is not neceserally the same as the value written. Due to capacative load, when writing a one (1), it can take some time for the pin to go to the level of the logical 1. There is a slope in this signal related to the capacative load on the pin. So when reading the value, immediatelly after writing it, it might happen that these values differ.

Not so when writing to the LATCH register. This is a PIC internal register that stores the value. When writing a one to the LATCH, this value is saved there immediatelly and also written to the PORT. So although in this case the level on the PORT might take some time to reach the intended level, the value in the LATCH register does have the intended level (or better said state). So in this case when reading from LATCH, this definatelly is the value you just wrote to it, even if the read is one cycle later (which is 25 ns on a 40 MIPS dsPIC33F).
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: PORT vs LAT ?

Inlägg av Mr Andersson »

Om du bara skriver så är det så vitt jag vet ingen skillnad mellan PORT och LAT. Däremot kan det uppstå problem om du ska läsa av porten, modifiera en eller flera bits, och skriva tillbaka nya värdet (känt som Read-Modify-Write). Läser du från LAT får du värdet som processorn driver porten med. Läser du från PORT får du det faktiska värdet som ligger på pinnarna just då vilket kan skilja sig om något annat också driver linan samtidigt.

Det är egentligen samma sak som att själv hålla koll på det drivna värdet i en variabel, förutom att du sparar en byte i minne eftersom processorn redan har ett register för just den funktionen. Ett annat exempel på att lösa RMW-problemet är t.ex. TIs TM4C-serie som har maskade skrivningar till portarna. Dvs. RMW-problemet finns inte alls då man kan välja att skriva enskilda bitar istället för hela porten.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PORT vs LAT ?

Inlägg av Erik M »

Så skillnaden är alltså att man helt enkelt inte använder PORTx.
Utom i ett fall - vilket är om... nä, inte ens det.
(Inte ens om det ska gå väldigt fort, se nedan.)


Så varför använda PORTx, överhuvudtaget...?
För även om jag skriver till PORTx så tar det ju ett tag för den att reagera.
...om jag förstår det hela rätt oavsett om det sker inifrån eller av yttre input.
Och i samma ögonblick som den väl ändrat sig ändras även LATx. Så ingen eftersläpning där - väl...?


Men om tiden det tar att reagera (ändra sig) ligger på 25 ns så spelar det inte någon roll hursomhelst ju, det hinns max en instruktion på den tiden (å då har man skruvat upp hastigheten rejält). Ja alltså, det hinns ju inte med ens det, se nästa.


Exempelvis blir Fosc/4 vid 32 MHz hela 125 ns...
...så var är problemet?

Alltså det är lämpligt skriva till LATx, eftersom det då står skrivet ordentligt.
Och det är lämpligt läsa på LATx, då det är ett ordentligt satt värde.

Så frågan blir återigen - varför alls PORTx...?
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PORT vs LAT ?

Inlägg av Erik M »

Mr Andersson skrev:... Dvs. RMW-problemet finns inte alls då man kan välja att skriva enskilda bitar istället för hela porten.
Jo, just. Och att hantera mer än en input i taget tänker åtminstone jag är olämpligt. Oavsett om denna input är enskild eller grupp av bits.
Och på liknade vis för output.

Men oavsett det hinner koden inte skilja på PORTx och LATx om fördröjningen i omslaget för PORTx ligger på 25 ns och en instruktion på 125 ns.
Dvs oavsett allt annat har omslaget både startat, gjorts och avslutats långt innan nästa instruktion påbörjas.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: PORT vs LAT ?

Inlägg av adent »

Enklaste är att använda Lat för output och port för input. Inga problem.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PORT vs LAT ?

Inlägg av TomasL »

På de gamla PICarna skriver man till LAT och läser från PORT.
På de lite mer moderna så finns inte problemet.

RMW är inget problem när man skriver till hela porten, då existerar det inte.

Dock är det så att en skrivning till enskild portbit alltid involverar en skrivning till hela porten, därför uppstår problemet.

PICen läser först porten, modifierar de bitarna som skall skrivas, och skriver hela porten.
Om då någon av portbitarna, satta som utgång, av någon anledning inte har korrekt utgångsstatus, dvs den har inte hunnit gå till en etta (eller nolla) av någon anledning, så kommer den portbiten att få fel värde.

Till exempel, skall portbiten vara en etta, och den av någon anledning inte kommit upp till rätt nivå, så tror PICen att det är en nolla och skriver en nolla till portpinnen.

Skriver man till LAT så kan man vara 100% säker på att portpinnen får rätt inställning.

Denna Read Modify Write sekvens ligger hårdkodad i processorn och är en del av dess funktion, andra processorer har troligen samma problem.
Nya PICar har det inte.
LAT finns då med av kompabilitetsskäl, men är inte nödvändigt, dock som alltid, läs databladet dör vad som gäller en specifik krets.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PORT vs LAT ?

Inlägg av Erik M »

adent skrev:Enklaste är att använda Lat för output och port för input. Inga problem.
...förutom de två ändringarna av bank.
Vilket i en application med tidsnöd, med många olika läsningar och skrivningar på port, som inte kan ske i svep då de får och ger ändringar beroende på både varandra och andra omständigheter, är besvärligt nog.
Men i övrigt håller jag med dig! :tumupp:
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PORT vs LAT ?

Inlägg av Erik M »

TomasL skrev:... Dock är det så att en skrivning till enskild portbit alltid involverar en skrivning till hela porten...
Uh :?:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: PORT vs LAT ?

Inlägg av sodjan »

> Uh

En skrivning av en enskild bit helt oavsett vilket register det är sker genom
att hela registret först läses, sedan ändras den aktuella biten och sist så skrivs
hela registret tillbaka igen. T.ex med bit-instruktionerna BCF och BSF.

Det är därför två snabba BCF eller BSF mot två olika pinnar på ett PORT register
kan ha lite oväntade sidoeffekter. Genom LAT så slipper man det...

Nu så uppstår problemen under lite speciella förhållanden. Det måste vara en
kapacitiv last på pinnen som gör omslaget långsammare än normalt. Om man har
kontroll på sin konstruktion så kan ofta ett par extra NOP i koden göra att
fenomenet försvinner.

> På de gamla PICarna skriver man till LAT och läser från PORT.

På de "lite gamla PICarna" är inte LAT registret mappat som en adress alls...

> På de lite mer moderna så finns inte problemet.

Eftersom LAT registren är direkt tillgängliga som ett eget register...
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PORT vs LAT ?

Inlägg av TomasL »

Det finns inte på moderna PICar, typ.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PORT vs LAT ?

Inlägg av TomasL »

Erik M skrev:
adent skrev:Enklaste är att använda Lat för output och port för input. Inga problem.
...förutom de två ändringarna av bank.
Vilket i en application med tidsnöd, med många olika läsningar och skrivningar på port, som inte kan ske i svep då de får och ger ändringar beroende på både varandra och andra omständigheter, är besvärligt nog.
Men i övrigt håller jag med dig! :tumupp:
Du behöver aldrig ändra bank för detta då mig veterligen LAT och PORT alltid finns tillgängligt i samma bank
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PORT vs LAT ?

Inlägg av TomasL »

Erik M skrev:
TomasL skrev:... Dock är det så att en skrivning till enskild portbit alltid involverar en skrivning till hela porten...
Uh :?:
Så är det, Thats Life så att säga.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: PORT vs LAT ?

Inlägg av Mr Andersson »

Den här bilden förklarar ganska bra hur det fungerar.
Tagen från databladet för PIC18F2455/2550/4455/4550 (länk)
Andra datablad kanske ser lite annorlunda ut men fungerar troligen på samma sätt.
PIC_PORT.png
Skrivning till LAT och PORT gör exakt samma sak. Båda skriver till output-flipfloppen. Läsning från LAT läser före utgångsbuffern, dvs det värde som skickas ut på pinnen. Läsning från PORT läser pinnens fysiska tillstånd.

Men om då skrivning till PORT och LAT gör exakt samma sak, vad är då problemet? Jo, det här gäller bara för enskilda portpinnar. Problemet med read-modify-write kommer ifrån att det går inte att skriva till enskilda bitar. Man måste skriva om hela porten.
Ex. BCF
PIC_BCF.png
BCF PORTA, 0
gör
Läs PORTA
Nolla bit 0
Skriv tillbaka ny byte till PORTA
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: PORT vs LAT ?

Inlägg av sodjan »

> Det finns inte på moderna PICar, typ.

*Jag* förstår vad du menar, men du uttrycker dig väldigt slarvigt.

*Du* menar att "moderna PIC" är de senare 16 och 32 bit modellerna.
*Du* borde vara tillräckligt kunnig för att förstå att det inte är självklart.

> ...då mig veterligen LAT och PORT alltid finns tillgängligt i samma bank

Fel. Läs på först. Ett fel svar är sämre än inget svar alls.
Skriv svar