hallo,

bij mijn led array laad ik elke keer een byte naar een rgeel toe. en ga zo elke regel af op mijn led array, nu gebruik ik elke keer een variabele. nu is mijn vraag of het akkelijker kan zoiets als een array. zodat ik elke keer een byte uit deze array kan halen. heeft iemand mischien een voorbeeld, of een goede site waar ik dat kan leren. alvast bedankt voor jullie reacties.

Blijkbaar wil je alleen antwoord van helderzienden die in hun kristallen bol hebben gezien welke processor jij gebruikt?

Bij de meeste microcontrollers die in C geprogrammeerd kunnen worden kan je gewoon arrays gebruiken. deze declareer je dan op de volgende manier: variabele[3]={waarde1,waarde2,waarde3};

Je gebruikt de array dan vaak op de volgende manier variabele[teller], waarbij je dan met de teller de array kan doorlopen.

[Bericht gewijzigd door spectral op (26%)]

Voor zover ik weet kun je in asm geen array declareren, omdat je direct in het geheugen aan het schrijven bent.

Dmv een pointer moet je bij houden hoever je bent met wegschrijven. Dat is in feitte alles.

Ik zou, als ik jou was, overschakelen op C. Gebruik van array's is dan veel makkelijker.

[Bericht gewijzigd door Anoniem op (18%)]

uC onafhankelijk antwoord: Een array kun je maken door een serie bytes in je geheugen te reserveren. Met een pointer wijs je dan naar dat array. Door de pointer telkens op te hogen ga je telkens een verder in het array. Dit in het geval je het hele array telkens af wilt lopen, een ander patroon kan natuurlijk ook. In de meeste architecturen heb je wel een (stel) index registers waarmee dat makkelijk kan.
[edit] oh, iemand was me voor :-)
@ spectral: het gaat over asm, niet over C. Anders was het natuurlijk geen probleem geweest want C kent gewoon arrays. Overigens, geen enkele uC kan in C geprogrammeerd worden, altijd in bin.

[Bericht gewijzigd door flipflop op (22%)]

hallo en bedankt voor jullie reacties,

ik programmeer inderdaad in asm. ik kan op geen gemakkelijke manier een array maken. ik weet dat ik een soort van array kn maken met de program counter of iets dergelijks. maar weet niet waar ik moet beginnen en wat de beste manier is. nu is mijn code elke keer dit:

movlw b'10001000'
movwf regel1

zo acht keer herhalen. en dan nog eens zoveel maal per letter/plaatje. zo is mijn code mischien wel 1000 regels lang.\

maar om terug te komen op jouw pointers hoe gebruik ik deze dan?

Als je eerst eens verteld welke controller (uC) je gebruik, dat praat een stuk makkelijker.

Zoals ik in m'n post hierboven al zei, meestal zijn er index registers. Dat zijn eigenlijk pointers naar een adreslocatie. Daarmee "wijs" je dus naar een bepaalde locatie in het geheugen. Door die pointers (bv) de incrementen kun je makkelijk in een loop-je door het array lopen. Kijk in de instructie tabel en gij zult vinden.

bedankt voor je reactie.
ik maak gebruik van de pic16f690. ik zal gelijk eens kijken bij de index registers. bedankt voor je uitleg

ik ben al een stukje verder, de fsr register verwijst naar de adres locatie.

[Bericht gewijzigd door rgbledje op (23%)]

Bij Microchip heet dat "indirect addressing" (da's zo ongeveer de algemene term ook), en gaat via het INDF register.

zo ver was ik al gekomen:P
nu moet ik nog iets vinden zodat ik het toe kan passen.

als ik het goed begrijp werkt het zo.


MOVLW 0x20 ;geef adres waarde
MOVWF FSR ; kopieer deze naar pointer register

en dan lees ik het uit d.m.v.


movf INDF,w

[Bericht gewijzigd door rgbledje op (18%)]

Klopt. Je maakt dan dus een lus, die elke keer een byte van INDF naar je uitgang kopieert, en dan de FSR 1 ophoogt. Dat net zolang tot je je buffer helemaal gehad hebt.

Klopt, je kunt zo bijv. 0x20 tot 0x3F weergeven:


buff_start      equ     0x20
buff_end        equ     0x3F

                movlw   buff_start
                movwf   fsr
loop            movf    indf,w
                call    display_wat
                incf    fsr,f
                movf    fsr,w
                sublw   buff_end
                btfsc   status,c
                goto    loop
                ..
                ..
  

bedankt jongens,

zo is het helemaal duidelijk. nu kan ik dus in het begin bij



	cblock	0x20

        endc
        org0

de data opslaan. maar nu krijg ik nog de vraag.
ik kan in dit blok een variabele een naam geven. kan ik hier ook gelijk vanaf het begin een waarde inladen of moet ik deze alsnog met de instructies movlw en movwf laden?

echt bedankt.

Als het geen variabelen zijn, maar constanten, dan kun je ze ook wegzetten in een tabel in het programmageheugen.

het moeten gewoon constanten zijn. dit worden letters/smiley's ofzo. deze data verandert niet en blijt hetzelfde. dit zou dan moeten gebeuren met de functie retlw en zo een tabel maken?
hoe kan ik deze maken en hoe lees ik deze weer uit?

bedankt.

Voorbeeldje met codes voor een 7 segm display

; LOOKUP index (in w), table
; Finds the table entry corresponding to index (in w) and 
; returns it in w. This demonstration uses a table to map the 
; numbers 0 through F hex to patterns on a seven-segment LED
; display. It assumes that the display is connected with segment
; a to rc5, b to rc4,  c to rc2,  d to rc1,  e to rc0,  f to rc6,  g to rc7 through
; current-limiting resistors of 1k5. 	

 ORG 0x400 ; start at beginning of page
	
Lookup	
BANKSEL	PCLATH
movlw	HIGH segm_codetable  ; get high byte of  table data address
movwf	PCLATH	; and save in PCLATH register
movf	DISPL_VALUE,w
					
segm_codetable
addwf	PCL,F		; compute goto
RETLW d'190'            ; 0  a+b+c+d+e+f   16+4+2+32+8+128     = 190
RETLW d'6' 				; 1  b+c 4+2                 = 6
RETLW d'124'				; 2  a+b+g+e+d     16+4+64+8+32        = 124
RETLW d'118'				; 3  a+b+g+c+d     16+4+64+2+32        = 118
RETLW  .198                ; 4  f+g+b+c       128+64+4+2          = 198
RETLW d'242' 				; 5  a+f+g+c+d     16+128+64+2+32      = 242
RETLW d'250'				; 6  a+f+e+d+c+g   16+128+8+32+2+64    = 250
RETLW d'22'                ; 7  a+b+c         16+4+2              = 22
RETLW d'254'				; 8  a+b+c+d+e+f+g 16+4+2+32+8+128+64  = 254
RETLW d'246'				; 9  a+b+c+d+f+g   16+4+2+32+128+64    = 246
RETLW d'119'                            ; A, B, C
RETLW d'124'
RETLW d'57'
RETLW d'94'                ; D, E, F
RETLW d'121'
RETLW d'113'

In je main routine zet je de gewenste sprongwaarde in "DISPL_VALUE", geeft een "call Lookup" en hij komt terug met de bijbehorende tabelwaarde in w.

bedankt dit help me zeker een stuk vooruit maar. nu zeg je egenlijk dat ik het zo moet doen toch?


movlw 1   ;  geef tabel nr 1 terug
call lookup


maar als ik dan bij lookup ga kijken zet hij gelijk weer een waarde in het w register. dan is de variabele och kwijt die ik in het w register zet?

bedankt

[Bericht gewijzigd door rgbledje op (76%)]

Ik gebruik meestal zoiets: (count en temp zijn GPR, 0x00 geeft eind tabel aan)


                clrf    count 
loop            movlw   high tabel
                movwf   pclath
                movlw   low tabel 
                addwf   count,w
                btfsc   status,c
                incf    pclath
                call    tabel  
                movwf   temp
                movf    temp,f
                btfsc   status,z
                goto    done
                incf    count  
                call    display_wat
                goto    loop
done            ..
                ..

tabel:          addwf   pcl,f
                dt      'hello\x00'  

bedankt voor de info maar nu wordt het wel een beetje onduidelijker voor mij. de eerste die gegeven werdleek mij het makkelijkste. ik weet niet bij de twede waar ik moet beginnen.

maar iig bedankt voor jullie reacties.

bedankt voor jullie hulp. ik heb een goede tutorial op internet gevonden. deze ga ik goed doorlezen en leren. hartelijk dank voor jullie hulp

[Bericht gewijzigd door rgbledje op (25%)]

Als je maar 1 character tegelijk wilt sturen, kan het ook eenvoudiger. Gewoon 0,1,2,3 of 4 in w zetten, en je krijgt resp. h,e,l,l of o terug...


                movwf   count         ;Save W
                movlw   high tabel    ;Hi/low adress tabel
                movwf   pclath
                movlw   low tabel 
                addwf   count,w       ;> 0xFF?, incr pclath  
                btfsc   status,c
                incf    pclath
                call    tabel  
                call    display_wat
                ..
                ..
 
tabel:          addwf   pcl,f
                dt      'hello'

even nog een vraagje tussendoor, zit ik nu niet met een limiet van aantal constanten die ik kan gebruiken? nu heb ik namelijk 16 constanten gebruikt en bij de 8 die daar op volgen pakt hij niet meer. hier springt hij weer terug in de eerste 16.

bedankt

[Bericht gewijzigd door rgbledje op (41%)]

Er is wel een limiet; 255. (Een grotere offset kun je niet kwijt in een byte...)

oke maar dan heb ik dus iets in mijn software fout gemaakt of moet ik dus gebruik gaan maken van de pclath geloof ik? ik heb er nog lang geen 255.

bedankt

PCLATH hoeft niet, als je maar geen 256 byte 'page roll-over' krijgt... (PCL gaat van 0xFF -> 0x00)
Dus als je aan het begin van een page start dan is de kans daarop het kleinst. (bijv. 0x100, 0x200....)

M.a.w ik mag ondertussen zeg maar niet van bank wisselen. ik zou bij wijze van een twede lookup table kunnen maken in bank 2 bijvoorbeeld.