Skriva till portregistret på en PIC
- 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
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!
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!
Re: Skriva till portregistret på en PIC
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
//Frank
//Edit. Blev inte så utförligt, sitter med mobilen
- 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
Om du läser databladet fig 4-11 ser du att det bara är att skriva till portregistret.
Skriva till portregistret på en PIC
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
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.
- 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
Jag tror BESTÄMT att det är fel metod baserat på databladet. Men det kan ju fungera ändå.
Re: Skriva till portregistret på en PIC
Du kan ha rätt @lillahuset. Det jag skrev tog jag från minnet. Minnet är ofta fel.
Sent using Tapatalk
Sent using Tapatalk
Re: Skriva till portregistret på en PIC
Man brukar väl i asm skriva till LAT och läsa från PORT.
Kör man C så löser kompilatorn det.
Kör man C så löser kompilatorn det.
- 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
Databladet för PIC16F631/677/685/687/689/690 har ingen LAT. Gissar att den är omdöpt till PORT.
Re: Skriva till portregistret på en PIC
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.
Re: Skriva till portregistret på en PIC
Jag tror mer på den nedan. ! inverterar det logiskt så något annat än 0 blir 0 och 0 blir 1 ?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
PORTC &= ~(0b01110111); // nollar bittar
- 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
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. 

Re: Skriva till portregistret på en PIC
> 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.
Du kan inte påverka ingångarna genom att skriva till PORT registret.
- 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
Just det, framgår av databladet. Men det är väl för jobbigt att läsa.
Re: Skriva till portregistret på en PIC
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.
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.
- 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
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!
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!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.