Het Elektor forum gaat sluiten. Zie ook deze link. Vanaf vrijdag 15 maart is het niet langer mogelijk om in te loggen op het forum. Wel blijft de inhoud van het forum nog zichtbaar tot het einde van de maand maart. Per 1 april gaat het forum definitief uit de lucht.

Microcontrollers en Hexadecimal

Ontwerpen en programmeren

Postby nieuw 2 » Thu Dec 27, 2012 12:00 am

Je uitleg is wat warrig. Een µC gaat geen code omzetten naar analoog. Hij gaat lijn per lijn zijn main uitvoeren. Af en toe onderbroken door een interrupt of een zijsprong naar een ander programmadeel.

Waarom hex? Ik denk dat je dit vooral moet zoeken in geheugenbesparing. 1 geheugenlocatie kan zo een waarde tussen 0 en 15 bevatten. Heel het computer gegeven is ook binair. 0, 1, 2, 4, 8, 16, ... Net iets anders dan ons tientallig stelsel. Het tientallig stelsel implementeren zou dan ook groot geheugen verlies betekenen.
nieuw 2
 
Posts: 124
Joined: Thu Jan 02, 2014 3:28 pm

Postby jippie » Thu Dec 27, 2012 12:00 am

Refereer je naar de .hex files die de compiler aanmaakt?

:1000000009C00EC00DC00CC00BC00AC009C008C09A:1000100007C006C011241FBECFE9CDBF18D01AC03B:10002000EFCF82E287B981E38FBD82E083BF8AE0B0:1000300087BB089580EC86B93699FECF85B189BD1E:1000400087FD02C018BA089588E088BB0895E9DFEB:08005000F1DFFECFF894FFCFB1:00000001FF


Deze bestanden (in dit geval Intex-hex) worden alleen door de programmer gebruikt, en bij sommige controllers zit de programmer in de interne bootloader (zoals bij Arduino).

De binaire code die de compiler uitspuwt kan niet betrowbaar/foutloos over een seriele verbionding gestuurd worden. Daarom wordt deze code vertaald naar leesbare tekens en bovendien verrijkt met checksums, zodat transmissiefouten simpel gedetecteerd kunnen worden.

Bovenstaande file is in werkelijkheid 267 bytes lang, de daadwerkelijke data die geflashd wordt is slechts 88 bytes.
jippie
 
Posts: 342
Joined: Thu Jan 02, 2014 3:28 pm

Postby arjen h. » Thu Dec 27, 2012 12:00 am

Allard JansenIk vraag me echter af wat een μC hier aan heeft.


Een uC kent niets anders dan hexadecimaal. Zij het in waarden (getallen, letters, leestekens, ...) en anders de commando's cq machinecode.

Wat de machinecode betreft, een uC doet niets zonder opdrachten in de vorm van machinecode. Dit zijn allemaal hex getallen die de uC vertellen wat ze moet doen in de vorm van registers optellen, shiften, vergelijken. De zogenaamde instructieset. Wat jij typt in C, C# of welke taal dan ook, de compiler zet et om naar machinecode (hex) zodat de uC er wat mee kan doen.
Het Elektor forum is voor de lezers; voor een vraag aan de redactie kun je het beste Elektor een email sturen.
arjen h.
Moderator
 
Posts: 1321
Joined: Thu Jan 02, 2014 10:40 am

Postby arjen h. » Thu Dec 27, 2012 12:00 am

Allard JansenHoe gaat het converteren van digitale naar analoge in zijn werk?
Google op Digitaal Analoog Converter. Dit is een begin... klik.'
Het Elektor forum is voor de lezers; voor een vraag aan de redactie kun je het beste Elektor een email sturen.
arjen h.
Moderator
 
Posts: 1321
Joined: Thu Jan 02, 2014 10:40 am

Postby arjen h. » Thu Dec 27, 2012 12:00 am

Allard JansenHet maakt dus niet uit in welke taal je het programmeert, alles word omgezet naar één Hex bestand?
Ja, in ieder geval voor uC geldt dit. Bij applicaties op de pc heb je nog dll's. Dit is ook machine code net als exe bestanden, maar dll's zijn niet direct te runnen (exe wel).



Machine code is het allerlaagste, hex codes, geen beginnen aan om deze te programmeren. Heb dit ooit wel zelf gedaan met een Z80, maar dat is lang geleden. Moest toen in een boekje de codes opzoeken en op een testbordje inkloppen.

Daarboven assembly, leesbare taal, move register B naar register A.
De echte puristen zweren hier bij (zoals Anneo hier op het forum).

Daar weer boven krijg je de hogere talen als C, C#, Basic, enz.


Google even op machine code en assembly.
Op wikipedia kun je de nodige informatie vinden.
Het Elektor forum is voor de lezers; voor een vraag aan de redactie kun je het beste Elektor een email sturen.
arjen h.
Moderator
 
Posts: 1321
Joined: Thu Jan 02, 2014 10:40 am

Postby petrus bitbyter » Thu Dec 27, 2012 12:00 am

Machinecode is niet leesbaar voor mensen. Die code bestaat uit een enorm aantal punten in de machine waar een hoge of een lage spanning aanwezig is. Alleen bij de oudste computers bestond het programma uit één of meer bedrade borden en kon je dus aan die bedrading het programma herkennen.

Elk punt dat een hoge of lage spanning kan hebben, vertegenwoordigt één bit informatie. Die inhoud kan worden weergegeven met "H" of "L" zoals vaak bij digitale schakelingen gebeurt, " true" of "false" in theoretische beschouwingen, "aan" of "uit" bij populaire verhandelingen en "1" of "0" als het over algebra of computers gaat. In computers worden de bits tegenwoordig gerangschikt in groepjes van acht of veelvouden van groepjes van acht: De bytes. Als je voor het weergeven van een bit een "1" of een "0" gebruikt, heb je per byte acht nullen of enen nodig om de inhoud van een byte op papier weer te geven. Dat is een boel onoverzichtelijk schrijfwerk. Vandaar dat de hexadecimale code is verzonnen. Elke mogelijke combinatie van acht enen of nullen kan worden weergegeven door de cijfers nul tot en met negen samen met de letters A tot en met F.

Een programma in HEX-code is dus al twee stappen van de eigenlijke machinecode af en is voor verreweg de meeste mensen onleesbaar. Uitzonderingen bevestigen ook hier de regel. Er waren - en zijn nog wel - mensen die de HEX-code voor een bepaalde processor kunnen lezen alsof het gewone tekst is.

Assemblercode is nog weer een stap verder bij de machinecode vandaan. Die assemblercode, kortweg assembler genoemd, bestaat uit afkortingen voor instructies, getallen en adressen in voor mensen leesbare vorm. Een speciaal programma dat ook assembler genoemd wordt, kan die afkortingen vertalen naar HEX-code of in één keer naar machinecode.

In de dagelijkse praktijk worden de termen "machinecode", "HEX-code" en "assembler" dikwijls door elkaar gebruikt en dat blijkt dus eens te meer voor beginners verwarrend te zijn.

Edit:
Voor een rijtje van vier bits heb je één symbool uit het rijtje 0..F nodig. Voor een byte gebruik je dus twee van die zogenaamde "HEX-digits".

petrus bitbyter
petrus bitbyter
 
Posts: 663
Joined: Thu Jan 02, 2014 3:27 pm

Postby anneo » Thu Dec 27, 2012 12:00 am

Eigenlijk komt hier niet helemaal de achtergrond uit de verf.
De processor kent enkel aan en uit en schakelt daarmee vanalles heen en weer.Voor de eenvoud noemen we de twee toestanden 0 en 1.Je hebt logika waar de 0 een lage spanning is en de 1 een hoge(re) ,maar het kan ook omgekeerd (kwestie an afspraak)
Bij de Z80 bijv. was 1 een spanning >2,4V en een 0 <0,8V zoals bij transistor-logika IC's.
Om een blokje van 8 enen en nullen in register A te laden moet de µP 00111110 zien.Om 't wat leesbaarder te maken splitsen we het op in 0011_1110 en elk deel heeft 16 mogelijke kombinaties.Je zou dat dan ook kunnen schrijven als 3_14 en door de dubbele cijfers (10...15) te vervangen door A...F kun je het kort en overzichtelijk houden met 3E,de hexadecimale voorstelling.Daaraan zie je zo waar de 1-en en 0-len staan.
Omda 't verband tussen 3E en wat er dan gebeurt niet duidelijk is heet de instructie niet 3E maar LD A,wat 'r in moet.Die LD noemen ze een nmonic.En programma schrijven met nmonics en nog wat toeters en bellen gaat dan in assembler.Daarvoor hoef je de hexcodes niet te kennen,hoewel er soms wel leuke trucs mee kunnen.
Een assembler zorgt er ook voor dat de nmonics omgezet worden in enen en nullen en levert dat in de vorm van een hexfile voor een wat overzichtelijker beeld.
Hogere programmeertalen bestaan eigenlijk uit herkennen van tekst en daarmee een reeks voorgebaken assemblercodes aan elkaar te plakken.
Snel en kompakt: machinetaal programmeren
Kost wel veel meer tijd en studie
Maar dan weet je wel precies wat er (zou moeten) gebeur(en)t.
Bij hogere talen hoop je dat ie doet wat er van verwacht wordt en dat er geen fout in zit die net alleen bij jou toepassing roet in t eten gooit.
Anne'
anneo
 
Posts: 1339
Joined: Thu Jan 02, 2014 10:36 am

Postby petrus bitbyter » Fri Dec 28, 2012 12:00 am

We schrijven samen nog een hele cursus microcontrolers

petrus bitbyter
petrus bitbyter
 
Posts: 663
Joined: Thu Jan 02, 2014 3:27 pm

Postby tymenyel » Fri Dec 28, 2012 12:00 am

Vroeger werd ook gebruik gemaakt van octaal. Bij het octale stelsel werden er drie bitjes per digit genomen.
Als we 3E uit het vorige voorbeeld nemen
3E hexadecimaal (soms verkeerd afgekort als "Hex") (grondtal 16)
00111110 binair (grondtal 2)
076 octaal (grondtal 8)
62 decimaal (grondtal 10)

dit is allemaal het zelfde getalletje maar dan op verschillende manieren opgeschreven.

Octaal is bijna uitgestorven omdat byte's 8 bits zijn. Dit is makkelijk op te delen in 2 nibbels van 4 bits dan 2+3+3 bits. In Linux is nog een overblijfsel te zien van het octale stelsel in de bestand attributen(verborgen, directory, beveiligd enz.).

Het lijkt in het begin vreemd om met een ander grondtal te rekenen, maar dat doen we iedere dag. 48 uur = 2 dagen (grondtal 24) 90 minuten = 1,5 uur (grondtal 60) 36 maanden = 3 jaar (grondtal 12).

aan hexadecimale getallen kan je makkelijker zien welk bitje "1"is dan met een decimaal getal, daarom wordt het veel gebruikt.

Groeten, Martijn
tymenyel
 
Posts: 203
Joined: Thu Jan 02, 2014 3:27 pm


Return to Microcontrollers

Who is online

Users browsing this forum: No registered users and 1 guest