Skriva till portregistret på en PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Skriva till portregistret på en PIC

Inlägg av Magnus_K »

Hej,

Tänker antagligen i helt fel banor här men mitt problem är som följer:

Sitter nu med en PIC16F690 och vad jag förstår har man där inte möjligheten att skriva till något LATx-register utan man skriver (och läser) direkt till portregistret.
Jag har konfigurerat TRISC till 6 st utgångar och 2 st ingång, så här TRISC = 0b10001000;

Om jag nu vill skriva till utgångarna med en hel byte, men ej påverka ingångarna, hur gör jag då?
Om jag tänker rätt så ifall jag AND:ar (&=) in en hel byte genom att PORTC &= 0b01110111; så kommer väl ingångarna tillfälligt bli låga, om dom "utifrån" var höga precis innan ja skrev va?

Om jag istället OR:ar genom PORTC |= 0b01110111; så blir det tokigt på utgångarna istället då jag aldrig kan ställa en utgång till låg?

Antagligen är det lättlöst men jag vet inte bättre. Tack på förhand!
Frank
Inlägg: 26
Blev medlem: 6 november 2010, 00:25:41

Re: Skriva till portregistret på en PIC

Inlägg av Frank »

Jag skulle nog köra med OR när du vill sätta dem höga och AND när du vill sätta dem låga.

//Frank

//Edit. Blev inte så utförligt, sitter med mobilen
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Skriva till portregistret på en PIC

Inlägg av lillahuset »

Om du läser databladet fig 4-11 ser du att det bara är att skriva till portregistret.
Användarvisningsbild
ecenier
Inlägg: 1146
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Skriva till portregistret på en PIC

Inlägg av ecenier »

Brukar skriva följande
Sätta bittar
Portc |= (1<<out_pin1 | 1<<out_pin2);

Nolla bittar
Portc &= !(1<<out_pin1 | 1<<out_pin2);

Edit:
Med ditt exempel blir det
PORTC |= (0b01110111); // sätter bittar
PORTC &= !(0b01110111); // nollar bittar


Sent using Tapatalk
Senast redigerad av ecenier 29 september 2016, 20:16:28, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Skriva till portregistret på en PIC

Inlägg av lillahuset »

Jag tror BESTÄMT att det är fel metod baserat på databladet. Men det kan ju fungera ändå.
Användarvisningsbild
ecenier
Inlägg: 1146
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: Skriva till portregistret på en PIC

Inlägg av ecenier »

Du kan ha rätt @lillahuset. Det jag skrev tog jag från minnet. Minnet är ofta fel.


Sent using Tapatalk
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46816
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Skriva till portregistret på en PIC

Inlägg av TomasL »

Man brukar väl i asm skriva till LAT och läsa från PORT.
Kör man C så löser kompilatorn det.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Skriva till portregistret på en PIC

Inlägg av lillahuset »

Databladet för PIC16F631/677/685/687/689/690 har ingen LAT. Gissar att den är omdöpt till PORT.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46816
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Skriva till portregistret på en PIC

Inlägg av TomasL »

LAT är väl egentligen från den tiden då RMW var ett problem, då skrev man till LAT för att undvika detta har jag för mig.
Användarvisningsbild
adent
Inlägg: 4234
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Skriva till portregistret på en PIC

Inlägg av adent »

ecenier skrev:Brukar skriva följande
Sätta bittar
Portc |= (1<<out_pin1 | 1<<out_pin2);

Nolla bittar
Portc &= !(1<<out_pin1 | 1<<out_pin2);

Edit:
Med ditt exempel blir det
PORTC |= (0b01110111); // sätter bittar
PORTC &= !(0b01110111); // nollar bittar
Jag tror mer på den nedan. ! inverterar det logiskt så något annat än 0 blir 0 och 0 blir 1 ?

PORTC &= ~(0b01110111); // nollar bittar
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Skriva till portregistret på en PIC

Inlägg av lillahuset »

Och jag har gudskelov glömt det mesta med PIC. Det var kul med 16C52 (tror jag den hette) och ett tag till. Sedan blev det en jävla röra. Med 18-familjen bestämde jag mig för att dumpa smörjan. Livet är för kort. :D
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Skriva till portregistret på en PIC

Inlägg av sodjan »

> Om jag nu vill skriva till utgångarna med en hel byte, men ej påverka ingångarna, hur gör jag då?

Du kan inte påverka ingångarna genom att skriva till PORT registret.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Skriva till portregistret på en PIC

Inlägg av lillahuset »

Just det, framgår av databladet. Men det är väl för jobbigt att läsa.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Skriva till portregistret på en PIC

Inlägg av sodjan »

Nyckeln är att en läsning av PORT registret alltid läser nivån
på själva pinnen ("benet") på kretsen. Och för en ingång så
är det inte PORT registret som styr över pinnen, utan vad
som finns "utanför" processorn.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Skriva till portregistret på en PIC

Inlägg av Magnus_K »

Oj, tack för alla svar!

Blir lite rörigt att svara er individuellt så det får bli öppet.

Den egentliga lösningen är troligen det fler av er skriver; att jag inte kan påverka "pinnen" genom att skriva till portregistret, om den konfigurerad som ingång. Lösningen tycks finnas i fig 4-11 (se nedan) men hänger inte riktigt med i schemat.
Fungerar kretsen så att om TRISC är ställt som 1 (ingång) så slås buffern av och man kan enbart läsa nivån på benet genom den där AND-gaten med en våg i?

Pga ovan så kanske jag inte är i behov att mecka med koden längre men jag vill för framtida användning ändå förstå den bit-hantering som föreslås.
PORTC &= ~(0b01110111);, är inte det här exakt samma sak som att direkt skriva PORTC &= 0b10001000);, dvs man inverterar samtliga bitar?
Sen tycker jag det här var klurigt: PORTC &= !(0b01110111);. Hur blir det egentligen? Blir det inte logiskt samma som ovan? Dvs man inverterar alla bitar? Väldigt intressant det här!

PORTC.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar