Sida 1 av 1
smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 13:19:11
av *L.R*
Hör följer ett kodexempel för att skriva ut siffror på 7seg-disp genom att hämta given kod i en vektor.
Kod: Markera allt
#define start 0xOF
movlw 0x10 ;startadress för vektor
movwf start
movlw 0x3F
movwf 0x10 ;implementera binärkod för att tända nolla på disp
movlw 0x06
movwf 0x11 ;implementera binärkod fö ratt tända etta på displayen
movlw 0x5B
movwf 0x12 ;implementera binärkod för att tända tvåa på disp
movlw 0x4F
movwf 0x13 ;implementera binärkod för att tända trea på disp
Kod: Markera allt
;________Anrop i mainloop__
movf counter,0 ;counter till W
call skriv_7seg
;___SUBRUTINER_____
;
;***skriv_7seg***
skriv_7seg:
addwf start,0 ;adderar start med W (som innehåller räknare) och lägger i W
movwf 0x04 ;skriver in adress påFSR,
movf 0x00,0 ;hämtar binärkod via register för indirekt adressering och lägger värde i W
movwf portb ;Uppdaterar disp
return
Hur kan jag göra själva vektorn på ett smidigare sätt. Att kunna skriva den på en rad?
När jag googlt får jag upp
lookup tabel, med manipuliering av
PCL följt av ett antal rader med
retlw. Men jag söker något universellt sätt för att kunna ange strängar eller en vektor av tal för att skicka ASCII-tecken eller som i exemplet styra en display.
Eller har jag inne på fel tänk?
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 13:26:50
av sodjan
> Eller har jag inne på fel tänk?
Nejdå, du har ju redan hittat lookup-tables.
Det kan finnas alternativ men eftersom du hemlighåller vilken
processor du använder så går det inte att säga mer om det.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 13:43:03
av TomasL
I vanliga fall brukar man väl använda RETLW med lookup-tables.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 13:45:44
av *L.R*
Just nu är det den förhatliga P16F84A.
GÅr det att säga något generellt om baseline-serien?
Men lookup-tabel är att föredra framför min variant?
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 13:46:56
av TomasL
Inte mer än att de är krångliga jämfört med 18-serien.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 14:07:35
av TomasL
Så här använder du RETLW
Kod: Markera allt
MOVFW TABLEOFFSET
CALL TABLE ;W contains table
;offset value
;W now has table value
•
•
•
TABLE
ADDWF PC ;W = offset
RETLW k1 ;Begin table
RETLW k2 ;
•
•
•
RETLW kn ; End of table
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 14:52:41
av *L.R*
Såg exempel på det på från google.
Men i det fallet man ska sända strängar vore det smidigt att kunna skriva in hela strängen i ett svep.
Det finns två aspekter i min fråga.
1. Att kunna göra program med bra struktur
2. Att bekvämt kunna skriva in vektorer.
Vore trevligt att kunna ange en hel vektor på en rad. i stil med 3F,06,5b,4F,0
eller om det är sträng med ascii "TECKEN SOM SKALL SÄNDAS",0
Så ligger värdena på ökande adress i minnet.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 15:15:52
av TomasL
Visst i C kan du göra det, men ASM-koden blir ändå en bunt med RETLW i slutändan.
ASM är samma sak som maskinkod, och eftersom processorn bara kan hantera en byte i stöten, så blir resultatet oavsett hur du än gör en bunt med RETLW instruktioner.
Sedan kan naturligtvis IDE'n ha en massa "macron" som "förenklar" det hela.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 15:46:42
av Marta
Du kan ha en tabell med teckengenerator. Sedan skriver Du texten som läsbara nollterminerade teckensträngar i egna tabeller. Gör sedan en subrutin för att skriva ut dessa. Nackdelen är att eftersom såväl teckengenerator som text tar upp en byte per tecken så är teckengeneratorn förlorad plats om det bara är konstanter som skall skrivas ut.
Det stökigaste är när en tabell går över en jämn 256-byte adress. Först krävs det kod som tar hänsyn till detta och sätter PCLATH till rätt värde. En enkel sak, men ett vanligt nybörjarfel. Sedan blir adressen för stor för 8-bit så det blir mycket knöligare att skriva ut strängarna när de inte ligger inom samma page.
I PIC18 finns det speciella instruktioner för att läsa från tabeller, men det är lite småstökigt ändå. Däremot utnyttjas minnet bättre med två tecken i varje 16-bit programsteg mot 1 tecken per 14-bit programsteg i PIC-16.
Finns vissa PIC-16 som har möjlighet att läsa programminnet och då kan det läggas två 7-bit tecken per programsteg. En aning mera kod för att läsa, maska och shifta, men tabellerna i sig blir dubbelt så effektiva förutsatt att 7 bits räcker.
Hur som helst, lägg inte konstanter i RAM med en massa initieringskod. RAM är en snål resurs i dessa processorer som behövs till mycket bättre ändamål.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 16:21:54
av TomasL
*L.R* skrev:Såg exempel på det på från google.
Men i det fallet man ska sända strängar vore det smidigt att kunna skriva in hela strängen i ett svep.
Det finns två aspekter i min fråga.
1. Att kunna göra program med bra struktur
2. Att bekvämt kunna skriva in vektorer.
Vore trevligt att kunna ange en hel vektor på en rad. i stil med 3F,06,5b,4F,0
eller om det är sträng med ascii "TECKEN SOM SKALL SÄNDAS",0
Så ligger värdena på ökande adress i minnet.
Du kan ju alltid göra nånting liknande detta
Kod: Markera allt
MOVFW TABLEOFFSET
CALL TABLE ;W contains table
;offset value
;W now has table value
•
•
•
TABLE
ADDWF PC ;W = offset
RETLW 'T' ;Begin table
RETLW 'E' ;
RETLW 'C' ;
RETLW 'K' ;
RETLW 'E' ;
RETLW 'N' ;
•
•
•
RETLW kn ; End of table
Oavsett hur du vänder och vrider på det, en teckensträng, tabell kalla det vad du vill resulterar alltid i RETLW konstruktionen.
OBS gäller konstanter i ROM.
Du programmerar i Maskinkod, vilket gör att du inte har intelligensen som ligger bakom en C-kompilator till stöd.
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 16:43:05
av *L.R*
Nu gjorde jag så här.
Kod: Markera allt
;;;;;;;;;;;;;;;;;;;;;;;;
;_____subrut____
;;;;;;;;;;;;;;;;;;;;;;;;
get_char:
addwf 0x02,1 ;korrigerar programräkanren för att hämta tecken
dt "TEXT TO SEND",.13,.10,0 ;skapar återhopp med en ascii-kod i w (motsv retlw)
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 16:45:50
av TomasL
DT är just ett macro i MPASM, dock ingen PIC-instruktion
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 17:55:35
av sodjan
> vore det smidigt att kunna skriva in hela strängen i ett svep.
Ja, du har ju redan hittat DT ser jag i ett senare inlägg.
Så då är väll allt OK ?
I en lite modernare PIC så kan man även läsa programminnet
direkt via index registren (eller om det är EEPROM registren,
minns inte, men det är bara att slå upp...).
Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?
Postat: 3 oktober 2010, 18:14:43
av *L.R*
Jo, denna metod kändes snygg och smidig.
google har gått varmt här.
får tacka för alla inputs!
