PORTA, PORTB, läsa, skriva, shadow registers, hur gör man?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

PORTA, PORTB, läsa, skriva, shadow registers, hur gör man?

Inlägg av netz »

Hej!

Har precis börjat med att programmera en pic 16F628A och har problem/fattar inte hur man undviker read-modify-write- problemet.

Ska man använda shadow registers i både läs och skriv och hur gör man i de båda fallen i C?

Programmerar i MPLAB och CC5X.

Tex så här:

TRISA = 0b11111111;
TRISB = 0b00000000;

mask= 0b0000.1111;

while (1)
{
W = PORTA & mask;
PORTB = W; // Dioderna på PORTB ska lysa motsvarande ingången
// på PORTA. (Funkar inte alls. Noll hela tiden.)
delay10(25);

PORTB = 0b0000.1111; // PORTB lyser (4dioder) Funkar som det ska.
delay10(25);

PORTB=0b0000.0000; // PORTB släckt (4dioder) Funkar som det ska.
delay10(25);
}

Jättetacksam om någon skulle vara så snäll o modifiera snutten ovan så att det skulle funka så jag kommer igång... ;-)

Det som är inkopplat till PORTA är en annan krets som ger en siffra mellan 0 och 16. Så pinnarna flyter inte.


Tack i förhand!

Netz
Senast redigerad av netz 27 april 2006, 15:42:08, redigerad totalt 2 gånger.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Öhhh: mask= 0b0000.1111;
ska väl vara: mask= 0b00001111; ???

Steg 1A: Använd ALDRIG registre i högnivåspråk!!!!!!

W = PORTA & mask;
PORTB = W; // Dioderna på PORTB ska lysa motsvarande ingången

ska vara

PORTB = PORTA & mask; // Dioderna på PORTB ska lysa motsvarande ingången
och inget annat! ;-)

Vid att använda W lägger du beslag på det enda register den kan räkna i och det är väl inte meningen eller hur?

Edit: Oj oj oj, hade inte tagit bort dummingen...fixat nu.
Senast redigerad av Icecap 21 april 2006, 17:40:57, redigerad totalt 1 gång.
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

0b0000.1111 borde vara det samma som 0b00001111 i CC5X, eller? Bara för att det skulle vara lättare att se när man programmerar.

Tack för svaret men det fungerade inte... :(

Dessutom påverkar PICen min andra krets på nåt konstigt oregelbundet sätt men det borde ju vara omöjligt för kopplingen är från den andra kretsens utgångar (0-5V) till PORTA (0-3) på PICen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> W = PORTA & mask;
> PORTB = W; // Dioderna på PORTB ska lysa motsvarande ingången

Använd ett "eget" register här istället.
Du har dålig koll (eftersom du dumt nog kör C) på vad som händer
med W mellan de två instruktionera.

Eller som Icecap föreslog.

RMW är bara rellevant vid bit instruktioner BCF/BSF

Var stänger du av de analoga funktionera på PORTA ?
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Kompilatorn CC5X är lite speciell. Det är "lågnivå-C" eller vad man ska säga. Varje instruktion har en C-motsvarighet. Man kan alltså i princip koda assembler med C-syntax om man vill. Man kan också säga ett den inte har något "fuffens" för sig (väldigt skönt). Alltså, den håller inte på och ändrar W utan att du ber den.

Väldigt bra på så sätt att du kan göra tight kod i interrupten och annat som måste gå fort. Sen kan du programmera C som vanligt när du ska göra sånt som inte behöver gå fort - vilket då går snabbare att koda än om du skulle kodat motsvarande i assembler.

Exempel:

Kod: Markera allt

W=PORTA;			//MOVF  PORTA,W
W&=0b0000.1111;	//ANDLW .15
PORTB=W;			//MOVWF PORTB

//Eller:
PORTB=PORTA&0b0000.1111;
//	MOVLW .15
//	ANDWF PORTA,W
//	MOVWF PORTB
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

Ja det verkar vara komparatorkonfigurationen som inte fungerar, tack för påpekandet.

#pragma config |= 0x3ff0
#pragma CMCON |= 7

Kompilatorn (MPLAB med CC5X) säger att den inte känner igen CMCON och ignorerar detta. Hur ska jag göra istället?

Unrecognized pragma directive 'CMCON'
(The #pragma directive is not recognized and therefore ignored)

Att jag anväder C beror på att det kan jag lite, assembler inte alls...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> #pragma CMCON |= 7 ...... Hur ska jag göra istället?

Antagligen bara "CMCON=7;" Varför pragma ?? CMCON är ett vanligt register...


> Att jag anväder C beror på att det kan jag lite, assembler inte alls...

Då skulle du ju lära dig mer om du körde asm... :-)
Du skulle antagligen också lära dig PIC arkitekturen snabbare.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

(Ett tips.) Om masken inte ska ändras under programmets gång kan du definiera den som en konstant istället. (Så sparar du en byte i minnet.)

#define MASK 0b0000.1111
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

Det var CMCON=7; som fattades!

Tack så mycket!


Ett annat problem är att PICen stör min andra krets som sänder signalen till PICen men det kanske inte hör till denna tråd...

Ja, får börja med assembler också då så jag lär mig mer ;-)
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

> #define MASK 0b0000.1111

Tack för tipset!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Ett annat problem är att PICen stör min andra krets som sänder signalen till PICen

Vad menar du med "stör" ? Och hur "syns" det ?
Avkopplingskondingar ?

> Ja, får börja med assembler också då så jag lär mig mer

Det är kanske inte alltid nödvändigt att programmera i assembler, men
att kunna det kan underlätta i förståelsen om vad kompilatorn har för sig...
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

Det syns så här: den andra kretsen gör så att en lysdiod lyser medans den skickar ut en signal (0-16 decimalt eller en 4 bitars siffra). När picen är ihopkopplad med denna krets så blinkar denna lysdiod oregelbundet, när den istället borde lysa kontinuerligt.

Vet inte riktigt vad avkopplingskondingar betyder eller mellan vad man ska koppla in dom. Har några kondingar för att avstöra men kanske inte tillräckligt många då...
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Menar du att de fyra ledningarna är kopplade till pinnar på PIC-kretsen?
Kolla så de pinnarna verkligen är inställda som ingångar och att de är kopplade rätt.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Avkopplingskondensatorer används mellan VCC och GND (eller '+' och '-') för att skydda mot störningar på matningen, något som gärna vill ske med digitala kretsar. Lämplig storlek är 100nF, gärna keramiska.

Jag har som regel att ha minst 100nF/krets.
netz
Inlägg: 8
Blev medlem: 21 april 2006, 16:07:54
Ort: Uppsala

Inlägg av netz »

>Jag har som regel att ha minst 100nF/krets.

Jag ska testa med fler såna som du rekommenderar. Tackar! Ska skriva här sen om det funkade. Blir nån annan dag för jag måste köpa såna först.

>Menar du att de fyra ledningarna är kopplade till pinnar på PIC-kretsen?
Kolla så de pinnarna verkligen är inställda som ingångar och att de är kopplade rätt.

Ja, utgången på den andra kretsen är kopplad (parallellt, 4 pinnar till 4 pinnar) till ingången på PICen.

De är kopplade rätt för det blir ju rätt siffra PICen ger ut (samma som kommer in från den andra kretsen alltså).
Skriv svar