Sida 2 av 4
Re: PICking PICling
Postat: 30 juni 2015, 17:30:31
av Erik M
OK, nu kommer en av de "jobbiga"...
Om man nu som standard inkluderar PICxxNxxx.inc, som gör diverse #define för SFR, varför då inte göra bra och fungerande sådana?
Att skriva om 0x15,0x5 till CCPR1L,DC1B1 hjälper ju inte egentligen så mycket.
Om det istället blev DC1B1 direkt, inklusive rätt Bank, då vore ju en hel del vunnet.
Typ, om jag greppat macron rätt...
Kod: Markera allt
set_DC1B1 MACRO
BCF STATUS,RP0 ; egentligen 0x3,0x3
BSF CCPR1L,DC1B1 ; respektive 0x15,0x5
ENDM
Re: PICking PICling
Postat: 30 juni 2015, 19:49:00
av sodjan
Det är mycket vunnet med att kunna läsa register och bit direkt i koden.
Det är lite som att tomaterna skulle vara märkta "PLU:1234" istället för
just "tomater". Om det bara står 0x15,0x5 så får man antingen ha väldigt
bra minne eller konstant leta fram och tillbaka i databladet.
> inklusive rätt Bank
Det går inte eftersom banken inte har något direkt att göra med
adressen som ska in i själva instruktionen. Dessutom vill man kanske
inte alltid att det ska kodas "onödiga" kommandon för att byta bank
i de fall att man redan vet att det inte behövs.
Ditt macro exempel är i och för sig korrekt som det är skrivet, men
det fungerar nog inte som du tror efter en "skip" instruktion. T.ex en
BTFSC kommer att "skippa" BCF på STATUS och hoppa direkt till
BSF instruktionen. Du vill sannolikt att den ska helt hoppa över
macrot, eller hur? Men processorn vet inte vad macron är, det
är enbart en finess i assamblern. Tänk dig att du hade skrivit in de
två instruktionerns direkt i koden istället, det är exakt det som
macrot gör (åt dig).
Re: PICking PICling
Postat: 30 juni 2015, 20:56:23
av Erik M
Givetvis underlättar det med, någorlunda, beskrivande benämningar.
Det är mest det där med att sprida SFR på bredden och att inte kunna plocka adressen direkt, trots att den är unik.
Men låt oss lämna just det ämnet...
OK, då är jag med.
Och om man inte håller reda på vad Macro't ska göra kan det du beskriver onekligen ställa till det.
Har jag mer än en sak som ska göras så går jag vidare - om det inte ska göras.
Och tack vare din påminnelse, vilket jag oxå noterat vid kontroll av vad för kod som "egentligen gått igenom" i (?) assembly listing view, så blir det inte att jag kommer göra det misstaget. Tack!

Re: PICking PICling
Postat: 30 juni 2015, 23:20:11
av sodjan
Det finns metoder att komma runt macro-problemet:
Kod: Markera allt
set_DC1B1 MACRO
GOTO run_macro
GOTO exit_macro
run_macro
BCF STATUS,RP0 ; egentligen 0x3,0x3
BSF CCPR1L,DC1B1 ; respektive 0x15,0x5
exit_macro
ENDM
Detta fungerar även efter en "skip" instruktion, men det blir
lite extra kod (som dock bara behöver skrivas en gång).
Re: PICking PICling
Postat: 1 juli 2015, 09:43:19
av Erik M
Jo, det är så man får skriva.
Dock...!
Kod: Markera allt
set_DC1B1 MACRO
GOTO run_set_DC1B1
GOTO exit_set_DC1B1
run_set_DC1B1
BCF STATUS,RP0
BSF CCPR1L,DC1B1
exit_set_DC1B1
ENDM
...annars blir det jobbigt när clear_DC1B1 kommer. Etc.
Re: PICking PICling
Postat: 1 juli 2015, 11:33:26
av sodjan
Nja, jag har för mig att labels är "lokala" inom macron.
Flera macron kan alltså ha samma label. Annars blir det
ju väldigt jobbigt att ha fler än 1 "set_DC1B1" också...
Re: PICking PICling
Postat: 1 juli 2015, 12:56:55
av Erik M
Ah, givetvis måste det vara så!
När vi ändå är inne på det...
Man kan rada upp config words på en lång rad - hur är det med övriga instruktioner?
Förresten...!
Man har ju gjort ihopslagning med dem.
__config _INTOSCIO & _WDT_OFF & _PWRTE_ON & _IESO_OFF & _FCMEN_OFF & _MCLRE_OFF
Så varför inte samma med SFR...?
NOT_GPPU_ON
AN0_ON
TRISIO5_OFF
...etc.
Vilket påminner mig om att BANKSEL verkar lite oanpassad.
På 12F683 finns bara bankerna 0 & 1.
Så det borde räcka med endera av BCF/BSF STATUS,RP0?
Inte behövs väl även BSF/BCF STATUS,RP1...?
Och är det mer än fyra banker räcker inte dessa två...
...men här och nu inte aktuellt.
Så fortsatt bygge av macro blir...
Kod: Markera allt
set_DC1B1 MACRO
jump_right
run
BCF STATUS,RP0
BSF CCPR1L,DC1B1
exit
ENDM
jump_right MACRO
GOTO run
GOTO exit
ENDM
...?
Eller blir det för kapslat med att jump_right letar efter run/exit inne i sig själv?
Re: PICking PICling
Postat: 1 juli 2015, 17:35:36
av sodjan
BANKSEL genererar de instruktioner som behövs oavsett antal banker.
Och på de nyare PIC16F1xxx blir det alltid ett kommando även fast
det finns 32 banker, det finns en speciell instruktion för det.
Osäker på om ditt macro fungerar men det är väldigt lätt att tästa!
Re: PICking PICling
Postat: 2 juli 2015, 10:59:37
av Erik M
Det är just varför jag protesterade mot BANKSEL för P12F683.
BANKSEL ger både STATUS,5 och STATUS,6 när bara STATUS,5 behöver växlas.
Re: PICking PICling
Postat: 2 juli 2015, 11:34:30
av sodjan
Ah, OK, det trode jag inte. Har du verifierat med list filen?
Re: PICking PICling
Postat: 2 juli 2015, 11:43:26
av Erik M
Annars hade jag inte sett det.
Men nog om det.
Re: PICking PICling
Postat: 2 juli 2015, 12:43:18
av sodjan
Jag har testkört med MPLABX och för 12F683 så genererar
BANKSEL enbart *en* BCF eler BSF instruktion, inte två.
Re: PICking PICling
Postat: 2 juli 2015, 16:47:09
av TomasL
Erik M skrev:Det är just varför jag protesterade mot BANKSEL för P12F683.
BANKSEL ger både STATUS,5 och STATUS,6 när bara STATUS,5 behöver växlas.
Vad menar du?
Hur gör du med BANKSEL, vad skriver du?
Kod: Markera allt
list p=12f683
#include p12f683.inc
BANKSEL PIE1
bcf PIE1,ADIE
BANKSEL STATUS
BCF STATUS,C
bsf STATUS,DC
end
Ger
Kod: Markera allt
--- E:\Tomas\Dokument\MPASMTEST\test.asm -------------------------------------------------------
1: list p=12f683
2: #include p12f683.inc
000 1683 BSF 0x3, 0x5 3: BANKSEL PIE1
001 130C BCF 0xc, 0x6 4: bcf PIE1,ADIE
002 1283 BCF 0x3, 0x5 5: BANKSEL STATUS
003 1003 BCF 0x3, 0 6: BCF STATUS,C
004 1483 BSF 0x3, 0x1 7: bsf STATUS,DC
Så jag förstår inte riktigt var du fått det ifrån.
MPLAB 8.92
Re: PICking PICling
Postat: 2 juli 2015, 23:24:55
av Erik M
Kan man skriva BANKSEL på mer än ett sätt...?
Kod: Markera allt
059 BCF STATUS, 0x5
91 1303 05A BCF STATUS, 0x6
92 0185 05B CLRF GPIO
93 1283 05C BCF STATUS, 0x5
94 1303 05D BCF STATUS, 0x6
95 138B 05E BCF INTCON, 0x7
96 1683 05F BSF STATUS, 0x5
97 1303 060 BCF STATUS, 0x6
98 3071 061 MOVLW 0x71
99 008F 062 MOVWF TMR1H
100 1283 063 BCF STATUS, 0x5
101 1303 064 BCF STATUS, 0x6
102 3007 065 MOVLW 0x7
103 0099 066 MOVWF CMCON0
104 1683 067 BSF STATUS, 0x5
105 1303 068 BCF STATUS, 0x6
106 019F 069 CLRF ADCON0
107 1683 06A BSF STATUS, 0x5
108 1303 06B BCF STATUS, 0x6
109 3039 06C MOVLW 0x39
110 0085 06D MOVWF GPIO
111 1683 06E BSF STATUS, 0x5
112 1303 06F BCF STATUS, 0x6
113 3071 070 MOVLW 0x71
114 009F 071 MOVWF ADCON0
Re: PICking PICling
Postat: 2 juli 2015, 23:35:03
av sodjan
Det där säger inte ett smack om hur din källkod ser ut eller hur det är assemblerat!
Om du vill visa en kod som uppför sig på något visst sätt så får du väll göra
det, inte visa något helt meningslöst...
Även jag har inga problem att generera en kod med dubbla BxF instruktioner,
det är bara att välja en processor med 4 banker...