schuifregister aansturen met data uit tabel

hallo,

ik ben bezig met een led kubus van 5*5*5.
ik kan hem wel aansturen maar de manier die ik nu gebruik is niet er efficiënt en wil daarom een andere methode gebruiken. ik wil dat de data uit een tabel wordt gehaald en dat regel voor regel ( elke regel 8 bit )

dit is het idee ( maar wil nog niet lukken )

;01234567
%10000000
%01000000
%00100000

ik wil dus dat hij stap voor stap door een tabel heen loop maar krijg het niet voor elkaar. zou iemand weten hoe ik het kan doen? ik heb het al met een for loop geprobeerd maar hij wil nog steeds niet door de tabel heen lopen.

alvast bedankt

wat heb je nu?
Welke programmeer taal?

sorry voor de onvolledige uitleg.
ik programmeer in proton IDE.

dit is wat ik op het moment heb:

pic basic code:

Device 16F887
Config1 INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital true 

Symbol datapin = PORTA.0
Symbol clockpin = PORTA.1
Symbol latchpin = PORTA.2
Dim waarde1 As Byte

;        76543210
TRISA = %00000000
PORTA = %00000000

Clear

; hoofdprogramma

While 1 = 1

SHOut datapin, clockpin, LsbFirst, [waarde1]
High latchpin
DelayMS 5000
Low latchpin 

Wend
 

End                  
Arco

Special Member

Zoiets?: (weet niet of de syntax klopt, ben Mikrobasic gewend...)

pic basic code:


Device 16F887
Config1 INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital true 
 
Symbol datapin = PORTA.0
Symbol clockpin = PORTA.1
Symbol latchpin = PORTA.2
Const data As Byte[4] = (%00000001, %00000010, %00000100, %00001000) 
Dim waarde1 As Byte
 
;        76543210
TRISA = %00000000
PORTA = %00000000
 
Clear
 
; hoofdprogramma
 
While 1 = 1
  For waarde1 = 0 to 3
    SHOut datapin, clockpin, LsbFirst, data[waarde1]
    High latchpin
    DelayMS 5000
    Low latchpin 
  Next waarde1 
Wend
 
 
End 
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik zie geen tabel in de source van TS, wel in die van Arco (uiteraard).

@Arco: die delay van 5000 ms lijkt mij wat lang, maar ja, wie ben ik?
Overigens voor iemand die MEBasic gewend is doe je het lang niet slecht met PicBasic ;-)

[Bericht gewijzigd door hadv op vrijdag 21 maart 2014 03:09:00 (24%)

Just find out what you like and let it kill you

hallo,

ben er even tussenuit geweest maar kan nu weer verder met de software.
het volgende heb ik nu:

pic basic code:

Device 16F887
Config1 INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
All_Digital true

Symbol datapin = PORTA.0
Symbol clockpin = PORTA.1
Symbol latchpin = PORTA.2
Dim array1[8] As Byte ; array van 8 elementen

;        76543210
TRISA = %00000000
PORTA = %00000000

Clear                     

; hoofdprogramma 

Repeat  ; herhalen 
array1[0] = %00000001    ;element 1
array1[1] = %00000011    ;element 2
array1[2] = %00000111    ;element 3
array1[3] = %00001111    ;element 4
array1[4] = %00011111    ;element 5
array1[5] = %00111111    ;element 6
array1[6] = %01111111    ;element 7
array1[7] = %11111111    ;element 8
SHOut datapin, clockpin, LsbFirst, [Str array1]  ; data van array uitsturen
High latchpin   ; latchpin hoog
DelayMS 5000    ; 5000ms vertraging ( lekker duidelijk zichtbaar )
Low latchpin    ; latchpin laag
Inc array1[0]   ; array index +1                                       
Until array1[0] = array1[7] ; tot array1[0] de waarde array[7] heeft 

End

ik kon volgens de compiler geen for loop gebruiken met een array als beginwaarde, hij gaf aan dat ik een repeat-until functie moest gebruiken.
daar ben ik dus mee bezig, alleen de documentatie kan mij niet duidelijk maken hoe ik de functie door de array index kan laten lopen zodat hij telkens de volgende byte op de uitgang zet voor de 74hc595.

het bovenstaande werkt trouwens niet aangezien hij meteen de waarde van array[7] op de uitgang zet en niet bij het begin wil starten
kan iemand mij hierbij helpen?

alvast bedankt.

Arco

Special Member

Waarom wil je een variable array gebruiken? Een constants array is makkelijker en kost geen ram geheugen.
(Ik neem aan dat de data toch niet dynamisch verandert?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

het is inderdaad constante data die ik gebruik. dit gaat uiteindelijk gebruikt worden om een RGB led kubus aan te sturen. maar ben nu eerst aan het testen en oefenen met een 5*5*5 enkele kleur kubus.

Ten eerste moet je de initialisatie van array1 niet in een repeat until loop zetten, maar daar voor.
Dat je het laatste element krijgt is logisch, de andere gillen er zo snel doorheen dat je ze niet ziet. "Str array1" verstuurt namelijk 8 bytes/64 bits achter elkaar. Door de 5 seconden pause zie je alleen de laatste byte/8 bits: array index 7
De vergelijking "Until array1[0] = array1[7]" is niet erg zinnig, je wilt toch niet continu je array overschrijven?
Dus doe het als volgt

pic basic code:


dim index as byte
...
Init:

array1[0] = 1
...
array1[7] = 255
index = 0
repeat
SHOut datapin, clockpin, LsbFirst, [array1[index]]
High latchpin   ; latchpin hoog
DelayMS 5000    ; 5000ms vertraging ( lekker duidelijk zichtbaar )
Low latchpin    ; latchpin laag
inc index
until index = 8

Voor de goede orde, de bitpatronen die je straks wilt tonen haal je uit een tabel, die staat vast ergens in je uC. Daar banjer je doorheen met behulp van één of meerdere indexen en de waarde die je daar opvist stuur je naar de ledmatrices.
De 'Str' modifier is hier totaal niet zinvol.
Als je straks telkens 5 bits uit een tabel wilt halen zul je, vanwege de eenvoud van het programma, waarschijnlijk telkens bytes gebruiken waarvan je slechts 5 bits gebruikt. Er is geen enkele reden om een byte naar een string om te zetten, shout werkt prima met bytes.
Voor 5*5*5 heb je dan 8x8x8 = 512 bytes nodig, voor RGB kun je dat nog eens met 3 vermenigvuldigen, hoewel je dan wellicht het geheugen wat 'zuiniger' kunt indelen.
Wat Arco al zegt: gebruik constanten en geen variabelen want dan gaat het echt niet lukken met een 16F877 (368 byte RAM). Die heeft wel voldoende code-geheugen om een tabel in op te slaan.

Just find out what you like and let it kill you

hallo,

ik heb eens even gestoeid met het voorbeeld dat je me gaf en heb nog wat uitgezocht en het werkt. maar mooier is toch dat ik nu snap hoe het precies werkt :P

alleen hoe kan ik het met constanten doen?
ik wil geen kant en klaar stukje code hebben dat ik simpelweg over kan nemen, maar kunt u me in een richting sturen, wat voor commando's er nodig zijn, hoe die commando's werken probeer ik zelf uit te zoeken zodat ik ook onthoud en snap wat ik doe.

alvast bedankt.

[Bericht gewijzigd door mister-f-j op woensdag 23 april 2014 21:26:58 (49%)

PIC's die in hun programma geheugen kunnen lezen en schrijven, zoals de 16F887, kunnen constanten in dat geheugen plaatsen.
Zoek eens in het manual naar 'CData' en 'Dim ... as Code'.
In het programmageheugen schrijven wordt afgeraden, maar dus ideaal voor (tabellen met) constanten.

[Bericht gewijzigd door hadv op woensdag 23 april 2014 23:01:59 (22%)

Just find out what you like and let it kill you