PIC kommandon

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

PIC kommandon

Inlägg av squiz3r »

Hej, jag för söker få en PIC att "PORTB,0 = databit1" Hur gör man det? Jag försökte med:

RAD80 movfw databit1
RAD81 movwf PORTB,0

Men då säger den bara "81 illegal charekter (,)"

Så hur ska man då göra om man inte kan använda det komandot för bara en bit?

//Daniel A
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> movwf PORTB,0
> Men då säger den bara "81 illegal charekter (,)"

RTFM. I detta fall beskrivningen av MOVWF i databladet...

Sen, varför vill du skriva ett helt register till en enda bit ?
Det hela verkar lite konstigt...
Vad är igentligen "databit1" ???
Vad är det du försöker göra ?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Jag skulle beskrivit lite mer bättre. Men jag vill at om databit1 som är en bit, (1 eller 0) är 0 (Edit: Jag menar så klart 1!!!) så skall utgången bli hög. Om den är 0 så skall utgången bli låg. Dvs. Det är inga register jag ska flytta utan det är bara bitar. Något mer jag var otydlig med?

Tack!
//Daniel A
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

databit1 är förmodligen 0 eller 1, dvs dom binära signalerna... och han försöker förmodligen lägga ut en 1:a eller 0:a på RB0...

squiz3r: om "databit1" är känd vid kompilering (dvs har ett fast värde) är det bättre om du sätter/nollar biten med "BSF PORTB,0", "BCF PORTB,0" respektive. Om du vill toggla (dvs ändra från 0 -> 1 och 1 -> 0) kan du använda:

Kod: Markera allt

MOVLW 0b00000001 ;ladda W med XOR-mask
XORWF PORTB, 1      ;kör XOR-mask med PORTB och spara i PORTB 
(var länge sedan jag skrev PIC asm så ovanstående kan innehålla fel men jag hoppas att du förstår principen)

Om variabeln inte är känd så får du använda BTFSC, BTFSS, BSF, BCF...

Du ska inte ha med "RAD80" och "RAD81" i koden eftersom assemblatorn inte förstår det.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Seven11: "RAD80" och "RAD81" skrev jag bara här för att ni skulle se vilken rad felmedelandet syftade på. Min "databit1" är inte ett fast värde utan den beror på vad ingångarna har för värde. Men om jag använder "BTFSS" komandona, så får jag väll göra så här:

Kod: Markera allt

...
btfss   databit1
bcf      PORTB,0
btfsc   databit1
bsf      PORTB,0
....
Edit: OBS! databit1 är inte en variabel, utan det är en ingång på PIC'en.

//Daniel A
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK.
Använd BTFSC/BTFSS i lämplig kombination med BSF/BCF
för att få den funktion du vill ha.

> Du ska inte ha med "RAD80" och "RAD81" i koden eftersom assemblatorn inte förstår det.

De kommer att tolkas som "labels", kanske onödigt men inte fel...
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

squiz3r: assemblatorn behöver veta vilken bit du vill testa också, dvs

Kod: Markera allt

btfss   databit1,0
bcf      PORTB,0
btfsc   databit1,0
bsf      PORTB,0 
DÅ kommer PORTB0 att sättas om bit 0 i databit1 är 1 och nollas annars.

EDIT: anledningen till ditt felmeddelande förut är pga att MOVWF inte har någon andra operator (MOVWF = "MOVe W to F"), det är MOVF som har.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Nu funkar det för mig :) Men jag skriver bara "btfss databit1", och inte "btfss databit1,X" eftersom databit1 bara är en bit :wink:

//Daniel A
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

squiz3r: så sant (glömde det!) :wink:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, så "databit1" är alltså en #DEFINE som innehåller både register och bitnummer.
Ja, då fungerar det naturligtsvis utan att ange ett "extra" bitnummer i BTFSx instruktionerna.
Det kanske skulle ha framgått av det första inlägget...
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Ja, men jag tänkte fel i början :oops: Men nu va detta problemet löst i alla fall :)

Tack alla för all hjälp!!
//Daniel A
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

sodjan skrev:OK, så "databit1" är alltså en #DEFINE som innehåller både register och bitnummer.
Sen kan man nog diskutera huruvida det är en bra eller dålig praxis att göra på det viset.

Hos mig ringer det dåliga klockor vid bruk av den typen av abstraktion.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vad skulle problemet vara ?
Det är väldigt praktiskt.

*Däremot* är det helt förkastligt att använda det i kodexempel
t.ex här i forumet och inte ens visa defintionen !!
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

sodjan skrev:Vad skulle problemet vara ?
Du svarade på din egen fråga.

Det är av den anledningen jag är rätt försiktig med macros och liknande, om det skulle till sig att jag behöver kodhjälp från någon annan. Det är lätt hänt att glömma skicka med en eller ett par #define, och förvirringen blir då ganska stor.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Men *om* man har problem, så är en sak man ska göra *innan*
man postar kod här, att först skriva om det i ett litet "test-case"
utan macros, defines o.s.v. Bara för att kolla att man inte själv
har gjort en tabbe.

D.v.s om det inte är just macros och defines man vill ha hjälp
med, så klart...
Skriv svar