Hallo,

voor het besturen van een ledreeks in picbasic loop ik tegen een probleem aan.
even wat uitleg:

ik wil op poort b een binaire waarde weergeven. dit is niet zo moelijk maar nu wil ik dat die waarde eerst in een variabele staat.
dus dan word het:
var1= %00100000
disp portb, var1

maar als er op een knop word gedrukt bijv porta1 dan moet die waarde 1 naar links worden geschoven(geshift).
nu weet ik dat dat in asm kan met shl,1 maar in basic kan ik dat niet vinden.
kan iemand mij de goede kant opsturen?

dit word nog uitgebreid naar rechts, een matrix en hopelijk een kubus maar laten we klein beginnen :)

je kan ik pic basic ook toch een regel in asm doen ?

moet je asm cmd openen
shift binair
daarna asm afsluiten

verder met je code

Binair shiften komt overeen met de decimale verminigvuldiging/deling met 2.

Naar links is vermeningvuldigen; naar rechts is delen.

Je zou het dus op deze manier kunnen oplossen.

In asm heb je wel ook de mogelijkheid om de bits via een buffer bit naar buiten te shiften. (ik denk dat het de Z-bit was, maar ben niet zeker want dit is al wel ff geleden.) Op die manier kan je dan elke bit die je uitshift bij een volgende shift terug langs de andere kant binnenshiften.

Weet niet hoe je dit in basic kan oplossen als je dit zou willen. Denk dat je dan een algoritme gaat moeten schrijven op basis van het aantal leds en wat je juist wil laten zien.

dan het zou dus kunnen worden iets als

asm
shl var1,1
endasm (?)

maar ik weet niet of je de variabelen zomaar in asm mag gebruiken of dat asm aparte variabelen heeft.
en wat dan ook lastig gaat worden is als hij eruit shift.

dan zou het dus uitgebreider moeten worden.
asm
shl var1,1
JC @loop
endasm

@loop
var1 shr var1,1 ;schuif de bit van het carry weer in het register terug op de laatste plaats.
endasm

@cyberj: bedoel je ror en rol?

en als ik dan wil delen/vermenigvuldigen met 2 gebruik ik dus een decimale waarde in basic. kan ik zomaar een decimale waarde op poortb zetten en dat hij daar dan een binaire waarde van maakt? en ik weet niet wat hij doet als je hem eruit shift

[Bericht gewijzigd door MAH op ]

Bitwise shiften in PICBasic:
<< en >>

voorbeeld:
DIM getal1 AS WORD
DIM getal2 AS WORD
getal1 = %0000000000000001
getal2 = getal1 >> 2
'bitjes in getal2 2 plaatsen opschuiven

Staat gewoon in de manual in het hoofdstuk "Boolean logic operators"

hm, zo te zien was ik er gisteren niet helemaal bij.
als ik een variabele heb ik basic en die word dus 1 wat gebeurt er dan als ik hem nog eens deel door 2?
en als ik wil dat de bit er niet uitschuift kan dat dan met:
if porta0 then if var1 = 1 (of %10000000)then var1= 1 else var1<<1 ?
en voor rechts:
if porta1 then if var1=128 then var1=128 else var1>>1

alleen heb ik het nu ook gevonden in de help en zie ik dit staan: 'Bitwise operations are not permissible with floating point values or variables' hoe kan je nou iets wijzigen als het geen variabele is?

Op 18 april 2006 13:26:04 schreef MAH:
alleen heb ik het nu ook gevonden in de help en zie ik dit staan: 'Bitwise operations are not permissible with floating point values or variables' hoe kan je nou iets wijzigen als het geen variabele is?

Gaat dit niet over floating point values en floating point variabelen. ?? Dus dat het wel mag op integer variabelen. FP getallen gebruiken een andere notatie (met mantissa en exponent)

Op 18 april 2006 13:26:04 schreef MAH:
...
alleen heb ik het nu ook gevonden in de help en zie ik dit staan: 'Bitwise operations are not permissible with floating point values or variables' hoe kan je nou iets wijzigen als het geen variabele is?

Als het geen variabele is, en geen floating point waarde, dan mag je die bitwise operators gewoon gebruiken (lees ik in wat je quote uit de help).
Variabelen en fl.pt kan je gewoon delen door 2 of maal 2 doen.
Ik geloof JoWi, tzal alleen voor fl.pt zijn ws.

Als je waarde 1 deelt door 2, is dat hetzelfde als hem 1 naar rechts te schuiven: '0000.0001' wordt '0000.0000' (0.5 is te klein om voor te stellen in een gewone byte).

Binair shiften in BASIC ?????

Ja ehhh sorry hoor

wat dacht je van
A=A*2 voor een shift naar links

en A=A/2 voor een shift naar rechts.

je weet toch wel wat binair rekenen is ?

dank je capt. dat kan idd wel zolang je maar 1 bit hebt. maar als je meerdere bits hebt en die gaat delen komt er heel wat anders uit. maar ik heb het nu zo gedaan:
var1= 1
if links then if var1 = 1 then var1= 1 else var1<<1 ; verschuif de bit 1 naar links (links is porta0

if rechts then if var1 = 128 then var1= 128 else var1 >> 1 ; verschuif de bit 1 naar rechts (rechts is porta1)

kan ik nu gewoon de waarde op portb zetten?

ik heb voor mijn opleiding als indurstrieel ingenieur in asm moeten programmeren. Gewoon omdat je dan eigenlijk veel meer controle hebt over wat er juist in de pic gebeurt.

Het zou niet slecht zijn als je kan achterhalen in welk register de variabele wordt geplaatst om dan gewoon achteraf in assembler te shiften. (Het commando hangt trouwens af van de pic die je gebruikt)Als dit kan lijkt me dit toch de makkelijkste oplossing.

Wil je toch in basic blijven werken is delen en vermenigvuldigen volgens mij toch de makkelijkste oplossing. Zolang een variabele in één byte staat kan je perfect eender welk getal tot 255 vermenigvuldigen en delen door 2.

Wij moesten voor het examen vermenigvuldigen of delen met getallen zodat je meerdere variabele moest gaan gebruiken en een commagetal overhield. Dit is perfect mogelijk in asm; het vraagt alleen wat logisch denkwerk.

MAH

ik weet niet in hoeverre je BASIC de C notatie ondersteund,
uit jou voorbeeld leid ik af dat dat wel goed zit.

doe het dan als volgt

linksom
if(!(A & 0x01)) then A<<1;

rechtsom
if(!(A & 0x80) then A>>1;

Er staat hierboven :
indien NIET (A bitwijs 00000001) dan shift

Je hoeft A niet meer aan te passen als de waarde al goed is.

In jouw voorbeeldje ben je nl dubbelop bezig
je zegt n.l. "if( A=1) then A=1" (zoiets kom je aleen maar
tegen in de luchtvaart waar het niet belangrijk is of software naar behoren werkt)

je kunt die waarde gewoon op de lpt poort zetten
maar je moet wel zelf onthouden wat de waarde is.
n.l.
de waarde die je van de poort terugleest is de input waarde, niet de laatst geschreven waarde.

Ik kan je vervolgens adviseren eens op mijn site te kijken
bij software->lptdrv.tgz
dat is een printerpoort driver voor linux met wat test programmaatjes.

Als je de code een beetje bestudeerd dat begrijp je wel hoe e.a. in elkaar zit.

Sucses

ik programeer in picbasic. (van proton).
doordat hij die opdracht niet uitvoert blijft de laatste led dan dus branden.

het kan mss ook met:
if porta0 then for var1 = 1 to 128 do var1<<1 else var1=var1

het gaat trouwens niet om een ltp poort maar portB in een pic.

en wat is je site? staat niet in je profiel.

http://pascal.nedlinux.nl

het maakt in princype niet uit
om wat voor poort het gaat.
het is gewoon het schuiven van bits
Maar als je met een pic werkt,
is pic assembly een stuk gemakkelijker denk ik.

shiften gaat daar gewoon met 1 instructie
linksom: rlf PORT_B
rechtsom: rrf PORT_B

conditioneel word het dan
linksom: skpz PORT_B,7
rlf PORT_B

rechtsom: skpz PORT_B,0
rrf PORT_B

Ook over PICs heb ik wat op mijn site staan,
maar dat nogal summier, te weinig tijd om dat ook nog bij te werken ;(

[Bericht gewijzigd door Capt501 op ]

okee, dat kan idd wel maar je moet dan niet vergeten om bijtevoegen dat als hij eruit shift(de carry in dus) hij de shift terug draaid. heb ik boven ook al geschreven.
en je moet niet vergeten om erbij te zetten hoevaak hij moet shiften toch?
en shiften is toch shr en shl?
dus
asm
shl var1, 1 ;verschuif bit 1 plaats naar links
JC @loop ; als hij in carry geshift is spring dan naar @loop
@end

@loop:
shr var1,1
goto @end

@end:
endasm

zo kan het ook denk ik. voor een stukje als dit is asm inderdaad wel makkelijker maar als ik moet gaat initen met asm loop ik een beetje vast. net als een deling uitschrijven is asm laat ik toch graag aan de pc zelf over als ik intyp var1/var2 (16bits)

edit: die popupbox van jou... :P