Ik had tot voor kort de anodes van een 7 segments display
allemaal op dezelfde poort van mijn AVR aangesloten.
Dat is makkelijk, want zo kun je in Bascom met 1 opdracht
direct de benodigde informatie op die poort zetten:
bv.
porta = &B1001_0000 (vormt cijfer "6" op display)

Om layout technische redenen heb ik nu echter die
7 anodes over 3 poorten verdeelt:
Segment A B C D E F G
Bit: D5 D4 D3 B0 D7 D6 C1

Wat is nu de meest effectieve manier om de juiste bits
aan te sturen zonder de andere bits te veranderen?
Moet ik elke keer elk bit individueel setten/resetten?
Of kent iemand een effectievere methode?

Groets,

Peter.

Look-up table, met een schrijfroutine/macro voor elke waarde die je uit wilt sturen. Je moet op zijn minst drie keer schrijven, en dan ook nog oppassen dat je de andere waardes niet overschrijft. D-register lezen, D0,D1 en D2 ergens tijdelijk opslaan, waarde inlezen in register, AND met D0,D1 en D2, en weer terug schrijven. B0 en C1 met een bit set/bit clear maken. Als je die nu in de hoofste bit waarde zet, kun je dat met een rotate/carry snel eruit schuiven.


DIM 7_Segment as byte
PORT.D5 = 7_Segment.1
PORT.D4 = 7_Segment.2
PORT.D3 = 7_Segment.3
PORT.B0 = 7_Segment.4
PORT.D7 = 7_Segment.5
PORT.D6 = 7_Segment.6
PORT.C1 = 7_Segment.7

 7_Segment = &B1001_0000 (vormt cijfer "6" op display)

Ben benieuwd of dat werkt. En zo ja... Hoe smerig is de assembly die de compiler ervan maakt? Hoop niet dat je het gemultiplexed hebt :)

Die laatste is idd wel erg creatief, en kon nog wel eens de meest efficiente zijn.
Ik zal het binnenkort eens testen.
Display is wel gemultiplext.

Op 20 september 2006 16:54:54 schreef LaStei:
Look-up table, met een schrijfroutine/macro voor elke waarde die je uit wilt sturen. Je moet op zijn minst drie keer schrijven, en dan ook nog oppassen dat je de andere waardes niet overschrijft. D-register lezen, D0,D1 en D2 ergens tijdelijk opslaan, waarde inlezen in register, AND met D0,D1 en D2, en weer terug schrijven. B0 en C1 met een bit set/bit clear maken. Als je die nu in de hoofste bit waarde zet, kun je dat met een rotate/carry snel eruit schuiven.

eerlijk gezegd snap ik niet eens wat hier staat.
Smerige assembler? was da?
instructies zijn instructies toch?

Smerige assembler? was da?
instructies zijn instructies toch?

En zo zijn we aan winshit gekomen. Zucht...

nou laat jij ff die oplossing zien dan? :P

Geen oplossing, maar een tip: vermits er gemiddeld bijna 5 van de 7 segmenten oplichten, kost het minder processortijd om uit te vissen welke segmenten er bij een bepaald cijfer niet moeten oplichten dan andersom.

Nou, gewoon bitwise setten. Maak er een simpel routinetje voor wat aan de hand van de input in een lookup table kijkt welke bit patterns er gezet moeten worden. Die oplossing is toch al aangedragen? Bedoel... Hoe je het ook wendt of keert, daar gaat het toch op neer komen. Moet dat nou nog uitgeschreven worden ook?

De code van Martijn werkt wel degelijk, knap gezien.
( getest in simulator van Bascom IDE)

PORT.D5 = 7_Segment.1

moet zijn

PORTD.5 = 7_Segment.1


[quote][message=484695,quote][b]Op 22 september 2006 03:20:43 schreef Martijn v[/b][/message]:
[code]
DIM 7_Segment as byte
PORTD.5 = 7_Segment.1
PORTD.4 = 7_Segment.2
PORTD.3 = 7_Segment.3
PORTB.0 = 7_Segment.4
PORTD.7 = 7_Segment.5
PORTD.6 = 7_Segment.6
PORTC.1 = 7_Segment.7

 7_Segment = &B1001_0000 (vormt cijfer "6" op display)

[Bericht gewijzigd door elektron_ op ]

Het probleem was (dacht ik) niet de vraag of het werkte, maar welke assembler-code er uit de bus rolt. Om aan te tonen wat ik bedoel: plaats ergens in een kort en simpel programma 1 floating-point berekening, en stel met verbazing vast, dat het eindresultaat --wat code-omvang betreft-- verdubbeld of verdrievoudigd is.
Voor het statisch aansturen van 1 7-segments display maakt het weinig uit. Maar als je gaat multiplexen, en als daarbij de hoofdtaak zo min mogelijk moet gestoord worden om het display aan te sturen, wil je een korte routine.

Op 23 september 2006 20:04:48 schreef pros:
Het probleem was (dacht ik) niet de vraag of het werkte, maar welke assembler-code er uit de bus rolt. Om aan te tonen wat ik bedoel: plaats ergens in een kort en simpel programma 1

Te diep in het glas gekeken ?

De vragen van TD staan hieronder, deze vraagt volgens mij een effectieve manier om in zijn Bascom programma de 7-segment te sturen.
Floating point ? Natuurlijk genereert dit veel code, maar dit heeft niets te maken met de vraag.
[/quote]

Op 20 september 2006 14:33:40 schreef peterrr:

Wat is nu de meest effectieve manier om de juiste bits
aan te sturen zonder de andere bits te veranderen?
Moet ik elke keer elk bit individueel setten/resetten?
Of kent iemand een effectievere methode?

En dit is het antwoord:
7_Segment = &B1001_0000 (vormt cijfer "6" op display)

[Bericht gewijzigd door elektron_ op ]

Op 23 september 2006 20:24:09 schreef elektron_:
[...]
Te diep in het glas gekeken ?

Kan niet. Ik drink enkel Trappist uit de fles!

De vragen van TD staan hieronder, deze vraagt volgens mij een effectieve manier om in zijn Bascom programma de 7-segment te sturen.

Dat is duidelijk. Nu nog bepalen hoe het woord "effectief" begrepen moet worden. Is het volume van de assembler-code bepalend? Is het de snelheid waarmee eea. moet uitgevoerd worden? Zijn er nog andere parameters die belangrijk zijn? Ik denk hier aan de hoeveelheid RAM die de routine in beslag neemt.

Met effectief bedoelde eigenlijk niet te veel tijd,
zodat er buiten het aansturen van de display nog meer
taken vervuld kunnen worden.

Op 23 september 2006 19:35:38 schreef elektron_:
De code van Martijn werkt wel degelijk, knap gezien.
thanks mate


[quote][message=484695,quote][b]Op 22 september 2006 03:20:43 schreef Martijn v[/b][/message]:
[code]
DIM 7_Segment as byte
PORTD.5 = 7_Segment.1
PORTD.4 = 7_Segment.2
PORTD.3 = 7_Segment.3
PORTB.0 = 7_Segment.4
PORTD.7 = 7_Segment.5
PORTD.6 = 7_Segment.6
PORTC.1 = 7_Segment.7

 7_Segment = &B1001_0000 '(vormt cijfer "6" op display)

werkt dit eigenlijk wel?
ik bedoel, ondersteund Bascom aliasen met Byte.bitnum ?
Ik werk nm met Picbasic...
daar zou het zijn:

7_segment = %10010000 '(vormt cijfer "6" op display)

Ach en als je nou toch in binair bezig bent, waarom zo moeilijk:

7_segment = 6 '(vormt cijfer "6" op display)

kiss...

Krijg jij wel genoeg slaap Martijn ;-)

"Gepost zondag 24 september 2006 03:53:35"

Vermits de meeste segmenten via PORTD aangestuurd worden, zou ik voor deze alvast een lookup-table gebruiken. De overige 2 segmenten kan je wellicht het eenvoudigste oplossen met een of andere if-then-else constructie. PORTC1 moet enkel inactief zijn bij '0' en '1', terwijl PORTB0 enkel inactief moet zijn bij '1' en '4'. Dat kan toch niet te veel tijd in beslag nemen?

Kan niet. Ik drink enkel Trappist uit de fles!

En waar is die fles dan van gemaakt??

Overigens... Afgezien van dat het er in basic leuk uit ziet eea. in assembly waarschijnlijk een draak van een stuk code oplevert... Waar blijft die laatste bit? Je definieert een byte, daar definieer je 7 bits van en je set er 8? Of is dat weer zo'n basic iets: dat gaat wel ergens (per ongeluk?) goed?

Op 24 september 2006 12:20:32 schreef Marco69:
[...]
Je definieert een byte, daar definieer je 7 bits van en je set er 8? Of is dat weer zo'n basic iets: dat gaat wel ergens (per ongeluk?) goed?

DIM 7_Segment as byte
7_Segment = 6

Wat is er mis mee ?

De rest is maar de waarde van een bit "toekennen" aan een poort.
Ik zie het probleem echt niet

Op 24 september 2006 12:20:32 schreef Marco69:
[...]
Overigens... Afgezien van dat het er in basic leuk uit ziet eea. in assembly waarschijnlijk een draak van een stuk code oplevert...

De discussie gaat niet over Assembly of Basic

[Bericht gewijzigd door elektron_ op ]

Bascom ondersteunt bit bewerkingen op bytes en words, geen enkel probleem met dat!

dim a as byte
dim x as bit

a = 2
x = a.1

set a.2
reset a
set a.0

print bin(a)

a.6 = not a.7

enzovoort...allemaal bit bewerkingen die mogelijk zijn.

zelfs arrays zijn mogelijk

dim tabel(20)

tabel(5).0 = 1

zet de LSB van byte 5 in de tabel

dus waarom zou die code niet werken! het is de mooiste oplossing gegeven en is asm zal het zeker ook mooi zijn.
het is nl op bit nivo en lager kan men niet gaan.
thumbs up!

Met effectief bedoelde eigenlijk niet te veel tijd

Wel over tijd. En draken performen doorgaans niet... Dus per saldo... Ach, laat ook maar. Onverbeterlijke Basic fanaat...

perl zou een betere keuze zijn... :-)
Maar met je mening over basic ben ik het eens. Wie zich absoluut niet met assembler wil bezighouden, kan nog altijd c in overweging nemen. Niet 100% ideaal, maar toch stukken beter dan basic.

ach ik ken ze allemaal, asm, c, basic en andere en vind Bascom eigenlijk nog niet slecht. al is kennis van asm soms wel mooi meegenomen.

als je echt eens iets exotisch wilt neem dan deze eens onder handen:

http://www.forth.hccnet.nl/pr-bytef.htm

vroeger nog forth gehad op hoge school en dan begint een mens zich af te vragen waarom ie leeft:-)

[Bericht gewijzigd door shortcircuit op ]

Van forth weet ik, dat het voor de ZX81 beschikbaar was. Nu was basic op dat ding een echte ramp, en forth zou stukken sneller geweest zijn. Na enig twijfelen ben toch maar op Z80-assembler overgestapt...