smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
*L.R*
Inlägg: 61
Blev medlem: 30 mars 2008, 13:39:15
Ort: Norra sthlm

smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg av TomasL »

I vanliga fall brukar man väl använda RETLW med lookup-tables.
*L.R*
Inlägg: 61
Blev medlem: 30 mars 2008, 13:39:15
Ort: Norra sthlm

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg av TomasL »

Inte mer än att de är krångliga jämfört med 18-serien.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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
*L.R*
Inlägg: 61
Blev medlem: 30 mars 2008, 13:39:15
Ort: Norra sthlm

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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.
*L.R*
Inlägg: 61
Blev medlem: 30 mars 2008, 13:39:15
Ort: Norra sthlm

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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)


Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47002
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg av TomasL »

DT är just ett macro i MPASM, dock ingen PIC-instruktion
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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...).
*L.R*
Inlägg: 61
Blev medlem: 30 mars 2008, 13:39:15
Ort: Norra sthlm

Re: smidigt sätt att skapa vektor i PIC.assembler (MPLAB)?

Inlägg 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! :tumupp:
Skriv svar