PIC IO ?
>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..
>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..
> 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 ?
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 ?
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.
> 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.
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.
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).
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).
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
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.
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
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) :
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...
