Archief - [PROG][assambler/basic] microcontroller

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Lama`NiFkE

Legacy Member
Beste,

Ik zit met een klein probleemke.
'k moet voor een werkske een microcontroller gebruiken waar mee ik een spanning moet inlezen en weer een nieuwe spanning uitzenden in de vorm van een blokgolf (blokgolf is dus een laag en dan weer hoog en herhalen).

Als de ingangsspanning veranderd dan moet ook weer een nieuwe blokgolf worden uitgezonden.

Maar eerst ging ik dit in basic doen met het inlezen van de spanning en dan een subroutine te maken voor de blokgolf met de ingelezen waarden.
Wegens enkele technische redens kan ik basic niet gebruiken omdat de periode van de blokgolf een te hoge frequentie nodig heeft en basic dient het geschreven programma eerst nog te 'omvormen/vertalen naar machinetaal' wat voor een traagheid zorgt dat we onze gewenste frequentie niet halen.

Vandaar dat we alles in assambler moeten doen omdat deze dichter bij de 'machinetaal' staat. Maar help ik versta er niets van :/
MOV langs hier MOV langs daar dan nog zo'n dingen... HELP
Zou er iemand mij persoonlijke via msn ofzo willen helpen met het maken van dit programma ? (is wat dringend :x)


sorry voor den lange tekst ma kweetnie goe hoe ik het moet verwoorden :x

forloRn_

Legacy Member
Het zou gemakkelijker zijn voor ons als je het type van de microcontroller eens wilde posten.

forloRn_

Legacy Member
Kan ik je niet mee helpen aangezien ik een PIC-microcontroller gebruik. Wat ik behoorlijk vreemd vind is dat de frequentie van je blokgolf afhankelijk zou zijn van het aantal instructies dat je gebruikt. Heeft je microcontroller geen PWM-module aan boord om blokgolven mee uit te sturen?

Lama`NiFkE

Legacy Member
we moeten dus spanning inlezen en dan een nieuwe spanning in de vorm van blokgolf uitsturen en die gaat naar een servo motor.
De servomotor heeft een blokgolfsignaal met periode van 2 µsec dacht ik en met basic halen we maximum 8µsec dus dit gaat niet... waardoor we met assambler het wel zullen halen maar help ik kan geen assabler dat is mijn grootste probleem :( en heb daar help bij nodig

Suicide Monkey

Legacy Member
Ik heb vroeger op school met assembler gewerkt maar voor de x86. Je zou eerst eens moeten kijken of je nergens een overzicht kan vinden met alle instructies, registers, .... zodat je weet welke je zoal kunt gebruiken. Bij assembler vertel je de µcontroller direct wat die moet doen wat het programmeren een stuk minder gemakkelijk maakt.

Krueger

Legacy Member
Ben je er zeker van dat je met assembler hogere frequenties zal halen? Uiteindelijk wordt die basic toch ook omgezet naar assembler, dus veel verschil is er niet. Misschien dat je er in slaagt om effeciëntere assembler code te schrijven dan de compiler er genereert, maar met de huidige compilers valt dat nog te betwijfelen.

forloRn_

Legacy Member
Inderdaad, je zal al een hele straffe moeten zijn om assemblycode te schrijven die vier keer zo snel is als die die gegenereerd wordt door de compiler. Doe me een plezier en kijk eens in de datasheets of dat ding een PWM-module aan boord heeft.

Lama`NiFkE

Legacy Member
Krueger zei:
Ben je er zeker van dat je met assembler hogere frequenties zal halen? Uiteindelijk wordt die basic toch ook omgezet naar assembler, dus veel verschil is er niet. Misschien dat je er in slaagt om effeciëntere assembler code te schrijven dan de compiler er genereert, maar met de huidige compilers valt dat nog te betwijfelen.


huidige compilers... het ding is aan gesloten op zo'n oude dos pc met diskette drive... kunnen we niets aan veranderen maar als we gewoon bij basic constant een hoog/laag uitsturen en dan met assambler het zelfde dan is assambler duidelijk veel rapper..

btw ik heb hier nu een cursusje assambler met ook instructies maar mijn probleem blijft: help ik versta dit niet hoe dit werk :/

Lama`NiFkE

Legacy Member
is hier niemand die assambler kan en me kan helpen bij het schrijven van het programma ? :x

killgore

Legacy Member
ik kan het wat, maar gebruik het enkel voor het optimaliseren van andere programma's in c++ e.d, dus betwijfel sterk dat ik kan helpen, srry ;).

QplQyer

Legacy Member
Het is "assembler" (dit is geen nutteloze opmerking, als je assambler in google intikt ipv assembler krijg je allicht niet de juiste informatie te zien, dit is dus wel degelijk hulp).

Voor de rest: voor input/output met assembler gebruik je de commando's in en out. Dingen zoals een while-lus zien er zo uit:
Code:
mov 1,ebx         ; 1 in eax stoppen
.lus: cmp ebx,0           ; vergelijken van eax met 0
jle .verder                  ; jump equals or lower than, springt als de twee gelijk zijn of kleiner naar .verder
mov 1,eax                  ; steek 1 in eax
int 0x8                      ; interrupt-routine oproepen (=kernel commando)
dec ebx                     ; verminder ebx met 1
jmp .lus                     ; spring terug naar .lus
.verder: <code>
+- snel neergeschreven (lees: klopt syntactisch allicht niet) equivalent van
Code:
int i = 1;
while (i > 0) { 
   voer een bepaald kernelcommando uit;
   i--;
}

Dat moet je al op weg helpen, nee?
Meer kan ik niet direct zeggen, tenzij met een gerichtere vraag over waar het probleem juist zit dat je hebt met assembler.

*edit* wat fouten uit die snel geschreven code gehaald :p

QplQyer

Legacy Member
killgore zei:
:offtopic: Kheb u foute gezien ze :D, u lus ging nie echt lusgedrag vertone ;).
Hehe zal me leren van code niet formeel te checken voor ik op submit duw, het was nogal erg ino :p

Lama`NiFkE

Legacy Member
merci qplqyer maar jah ik snap der nie veel van basic is makkelijker :x

de bedoeling is dus dat ik een blokgolf maak, dus signaal laag en dan signaal hoog en dit in een loop brengen maar die waarden van de laag en hoog moeten kunnen veranderen, zodat ik pwm-regeling kan doen (pulse width modulation).

Er komt een spanning binnen op mijn microcontroller bord en die spanning veranderd de hele tijd. Dus moet mijn blokgolf ook aangepast worden naar gelang wat er binnenkomt zodat de uitgang contant blijft.

In basic had ik een programma zoals dit in gedachte (maar niet zeker of dit wel goed is maar dat maakt niet uit want ik heb het in ASSAMBLER nodig).

Code:
10 REM ***regeling via BASIC***
20 FOR T=0 TO 3000
30 NEXT T.
/tijdslus dat hij maar elke x-aantal seconden de ingangswaarden controleert en opneemt

40 X=ADCON.AND.0F0H.OR.00H
50 DAPR=0

/hieronder volgen nu de voorwaarden van als de ingangsspanning groter is dan ...V ga dan naar ... anders genereer blokgolf met juiste waarden. Ze worden per 0.5 V gecontroleert.

60 IF X > 0.0 THEN GOTO 70 ELSE GOTO 300
70 IF X > 0.5 THEN GOTO 80 ELSE GOTO 300
80 IF X > 1.0 THEN GOTO 90 ELSE GOTO 300
90 IF X > 1.5 THEN GOTO 100 ELSE GOTO 300
...
260 IF X > 9.5 THEN GOTO 100 ELSE GOTO 300


/hieronder hoe het maken van de blokgolf die dient te lopen (in een sub? ik weet het niet en weet ook niet hoe)

300 XBY(0F800H)=255
310 FOR E=0 TO 1000
320 NEXT E
/hierboven de hoog (5 V) van de blokgolf

330 XBY(0F800H)=128
340 FOR E=0 TO 500
350 NEXT E
/hierboven de laag (0 V)van de blokgolf

/maar de regels vanaf 300 kloppen ook nog niet want die 1000 en 500 (regel 310&340) dienen dus gewijzigd te moeten worden naar gelang  de spanning die binnenkomt (regel 60) en dus een blokgolf met een langere/kortere hoog/laag te genereren.

en dit heb ik dus in assambler nodig in plaats van basic :(



hier onder zie je nog eens de minimum en maximum waarde van de blokgolf en ook dat dus de 'hoog' moet kunnen worden geregeld naar gelang wat binnekomt.
pwm.jpg

QplQyer

Legacy Member
Staat die "assambler" nu in caps om mij terecht te wijzen dat het "assambler" zou moeten zijn ipv assembler of wat?

Code:
60 IF X > 0.0 THEN GOTO 70 ELSE GOTO 300
Zoiets vertaal je in asm naar:
Code:
mov eax,X               ; je kan enkel maar comparen met registers, dus X moet in een register
cmp eax,0               ; je vergelijkt eax met 0, dit zal enkele statusbits instellen
jg .label70              ; als de waarde in eax (=X) > 0 was -> naar .label70 springen
jmp .label300           ; als de waarde in eax <= 0 komen we hier terecht en springen we dus naar .label300

Die for-lus is equivalent aan de while-lus die ik al postte.

*edit* hier is een betere tutorial, ik heb de verkeerde gepm'd: http://docs.cs.up.ac.za/programming/asm/derick_tut/

Suicide Monkey

Legacy Member
Werkt die asm code op de microcontroller? Die lijkt me verdacht veel op die van de x86 :unsure:

QplQyer

Legacy Member
Het is x86, aangezien het mij leek dat (aangezien hij basic gebruikte als andere taal) hij een soort drivertje nodig had eerder, dat vanuit een pc de controller aanstuurt.
Vanuit een andere optiek, als je intel x86 snapt zal het omzetten naar code voor de microcontroller niet echt moeilijk zijn, het lijkt me dat de basiskennis assembler al niet aanwezig is ofzo.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan