Sida 1 av 1
PIC kommandon
Postat: 4 april 2007, 14:40:01
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
Postat: 4 april 2007, 15:05:37
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 ?
Postat: 4 april 2007, 15:20:08
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
Postat: 4 april 2007, 15:37:11
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.
Postat: 4 april 2007, 15:44:02
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
Postat: 4 april 2007, 15:45:17
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...
Postat: 4 april 2007, 16:06:16
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.
Postat: 4 april 2007, 16:51:55
av squiz3r
Nu funkar det för mig

Men jag skriver bara "btfss databit1", och inte "btfss databit1,X" eftersom data
bit1 bara är en bit
//Daniel A
Postat: 4 april 2007, 17:56:21
av Seven11
squiz3r: så sant (glömde det!)

Postat: 4 april 2007, 19:10:09
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...
Postat: 4 april 2007, 19:57:56
av squiz3r
Ja, men jag tänkte fel i början

Men nu va detta problemet löst i alla fall
Tack alla för all hjälp!!
//Daniel A
Postat: 27 april 2007, 03:30:06
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.
Postat: 27 april 2007, 08:48:32
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 !!
Postat: 27 april 2007, 15:14:07
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.
Postat: 27 april 2007, 19:25:03
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...