PIC IO ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Är det så att den ställs i skrivdelen? av cykeln läs-ändra-skriv

Ja.

> GPIO är inte det ett register som ligger i nåt slags minne "inuti" själva processorn?

Jo, var annars ?
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1552
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

>sodjan:
>Notera att "RD PORT" läser pinnen *efter* bufferten, så om pinnen är
>en ingång så läses nivån på pinnen, inte på GPIO vippan. Det är därför
>det kan bli problem när man gör bcf/bsf på *andra* pinnar, eftersom
>alltid hela GPIO läses och skrivs tillbaka (och alltså sätter GPIP
>vippan = aktuell nivå på pinnen...).


Jag hajar inte vad som är "problem". Vill man inte att GPIO alltid ska återspegla hur nivån är på pinnarna ?
Om en pinne är utgång får den kommer insignalen från pinnen själv, borde ju inte vara något problem ? eller..
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Vill man inte att GPIO alltid ska återspegla hur nivån är på pinnarna ?

Vill och vill. Varför det ?

Om en pinne är en ingång så är de ju inte ens ihopkopplade.
Motsvarande bit i GPIO kan stå hur som helst utan att det "återspeglas" på pinnen.

"Problemet" är read-modify-write fenomenet (så som jag beskrev det tidigare).

> Om en pinne är utgång får den kommer insignalen från pinnen själv,...

Spelar ingen roll om pinnen är ut- eller ingång, "insignalen" (d.v.s det man "ser"
då man *läser* från GPIO är *ALLTID* det som råkar finnas på den fysiska pinnen.

> borde ju inte vara något problem ?

Nej, och det sa jag inte heller. Det *KAN* vara ett problem, om man inte
vet vad man håller på med.

Är det något problem att se under vilka omständigheter man
skulle kunna bli "lurad" av RMW fenomenet ?
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1552
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

sodjan: >*KAN* vara ett problem

Jag kan förstå att GPIO och pinnarna kan vara olika.
Men så fort man läser av GPIO så uppdateras GPIO med läget på pinnarna.
När är det, det inte blir rätt, när *kan* det vara problem ?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

När du använder en RMW-instruktion (t.ex bsf eller bcf) på en port där vissa pinnar är satta till ingångar. När man använder RMW-instruktioner så är det viktigt att det värde som läses i första delen av instruktionen är utvärdet. På pinnar som är ingångar så är det inte det, utan det invärde som råkar finnas på pinnen.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men så fort man läser av GPIO så uppdateras GPIO med läget på pinnarna.

Nej !

*Bara* om instruktionen även *skriver* tillbaka något till GPIO/PORTx.

Enbart en "MOVF GPIO, W" är inget problem. Inte heller t.ex
BTFSC/BTFSS eller något annat som *inte* skriver tillbaka något.

Det finns lite olika sätt att se på det, många proffs skulle t.ex
säga att man *aldrig* ska använda BCF/BSF direkt mot GPIO/PORTX register...

Man kan göra som man vill, bara man förstår de eventuella problemen.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1552
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

Har kollat i Microchips:
Mid-Range MCU Family Reference Manual

I section 9.9 och 9.10 står det om det vi diskuterat i denna tråd.

Dom har ett exempel, som jag tycker är lite konstigt.
Dom skriver till två bitar som är ingångar, tycker det är tankemässigt fel att skriva till en ingång, den ska man ju läsa av.

------------------------------------------------------------------
Example 9-9: Read-Modify-Write Instructions on an I/O Port

; Initial PORT settings: PORTB<7:4> Inputs
; PORTB<3:0> Outputs
; PORTB<7:6> have external pull-ups and are not connected to other circuitry
;
; PORT latch PORT pins
; ---------- ---------
BCF PORTB, 7 ; 01pp pppp 11pp pppp
BCF PORTB, 6 ; 10pp pppp 11pp pppp
BSF STATUS, RP0 ;
BCF TRISB, 7 ; 10pp pppp 11pp pppp
BCF TRISB, 6 ; 10pp pppp 10pp pppp
;
; Note that the user may have expected the pin values to be 00pp ppp.
; The 2nd BCF caused RB7 to be latched as the pin value (high).
bearing
Inlägg: 11682
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Exemplet är gjort för att visa just att resultatet inte blir som man kanske tror om man sätter bitarna i registret medans de är ingångar.

Man kan skriva till ingångar, men det är bättre att ge hela porten ett värde då. Ett korrekt sätt att göra det som dom tänkt göra är att OCH:a bit 6 och 7 med 0

Kod: Markera allt

	MOVLW	0x3F	;0011 1111
	ANDWF	PORTB, F
	BANKSEL TRISB
	ANDWF	TRISB, F

Anledning till att man vill skriva till porten (när den är ingång) innan man ändrar den till utgång är att utgången ska ha rätt värde det ögonblick den blir utgång.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bearing har rätt i varför man vill skriva till pinnar som är ingångar, men notera
att exemplet inte var så bra, eftersom det *bara* fungerar i just det fallet
där samtliga pinnar som senare ska switchas til utgångar ska sättas = "0"
och när alla andra pinnar ska vara utgångar.

Detta är lite med generellt (portb_tmp är ett tidigare definierat register) :

Kod: Markera allt

   bcf     portb_tmp, 7   ; eller bsf...
   bcf     portb_tmp, 6   ; eller bsf...
   movf    portb_tmp, w   ; flytta portb_tmp -> portb
   movwf   portb          ;  -"-
   movlw   h'3F'          ; 0011 1111
   movwf   trisb          ; och sätt pinne 6 och 7 som utgångar...
Skriv svar