Hex files combineren

Arduino specifieke Software
Gebruikers-avatar
Berichten: 8
Geregistreerd: 10 Jan 2020, 23:21
Woonplaats: Westervoort

Hex files combineren

Berichtdoor FritsS » 03 Feb 2020, 15:53

Hallo allemaal,

In de wereld van Arduino ben ik nog nieuw, bezit nog niets en probeer mij via dit forum en You Tube te oriënteren. Mijn doel is een modelauto RC te kunnen besturen.
Wat voor mij nog een grote vraag is, is de keuze van de programmeer taal. Ga ik dat doen in assembler, zodat ik ook goed snap wat er in de controller gebeurt?
Of kies ik voor het aanleren van de taal C en kan dan allerlei kant en klare programma's uit verschillende bibliotheken overnemen?
Ik heb een sterke voorkeur voor assembler, omdat ik nu eenmaal graag weet hoe iets werkt en wat er fout gaat. In C is mij dat erg vaag en helemaal als een ander het bedacht heeft.

Mijn vraag aan jullie is: Kun je twee hexfiles (1 gemaakt in assembler, de andere geschreven in C) ook samenvoegen en dan in de Arduino laden?

Frits

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Hex files combineren

Berichtdoor Koepel » 03 Feb 2020, 21:51

Mijn voorstel is om zo snel mogelijk een Arduino Uno te kopen en het ledje te laten knipperen met de Blink "sketch" : https://www.arduino.cc/en/tutorial/blink.
De pin van het ledje op de Arduino Uno is gedefineerd met 'LED_BUILTIN', dus je hebt verder niets nodig.
Als dat werkt dan werkt het traject van een "sketch" tot en met het Arduino boardje. Op die manier merk je vanzelf of je het steeds leuker of steeds minder leuk gaat vinden.
Een Arduino Uno clone kost maar 4 euro op AliExpress.

De mensen van Arduino noemen een "programma" een "sketch" om het wat toegankelijker te maken. Ik vind het maar niks, maar ik ga maar mee met Arduino en noem het dan ook maar een "sketch" :roll:

Arduino is bedoeld om snel een prototype in elkaar te kunnen zetten, en dezelfde functies te kunnen gebruiken voor elk Arduino board.
Om zelf in assembler te programmeren staat daar heel ver van af.
Je kunt natuurlijk wel vanuit 'C' de registers zelf programmeren. Dat wordt regelmatig gedaan om bijvoorbeeld iets speciaals te doen met een PWM signaal en een timer.

Als je de AVR familie microcontrollers in assembler wilt programmeren, dan kun je misschien beter kijken bij: https://www.avrfreaks.net/.

Ik gebruik de Arduino IDE omgeving. Anderen op dit forum gebruiken soms een professionele ontwikkelomgeving. Er is bijvoorbeeld een "Sloeber"-uitbreiding voor de Eclipse IDE.

De libraries van Arduino hebben bugs. Dat is zo. Sommigen blijven jarenlang bestaan ondanks aandringen van gebruikers om het op te lossen.
Het is open-source, dus iedereen kan een library voor Arduino maken en op Github zetten.

De Arduino software en hardware is ontwikkeld op een universiteit. Het is niet gemaakt door embedded software developers met jarenlange ervaring. Er zijn dan ook nogal wat vreemde en onhandige keuzes gemaakt.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Hex files combineren

Berichtdoor shooter » 04 Feb 2020, 10:01

welkom, en ik geef koepel groot gelijk hoor, koop zo een ding en ga ermee spelen.
Ja je kunt er met wat hulpmiddelen zoals elektronica prima een auto mee besturen.
en ja je kunt in assembler schrijven, maar met de huidige ingewikkelde architectuur van een processor is het veel slimmer en stuk sneller om dat in een hogere taal te doen zoals C.
Begin eens met SCRATCH voor arduino dat is nog sneller programmeren.
voor de snelheid hoef je niet naar assembler want 24 Mhz is tegenwoordig de standaard.
combineren is ook zeker een optie in C zelfs in de arduino IDE kan dat prima.
je zet dan een stuk machinetaal in C en dat wordt dan netjes samengevoegd in 1 grote file.
Het grote voordeel is dat een kind van 10 binnen een uur iets werkends heeft, dat zie ik in assembler nog niet gebeuren.
je hebt gelijk assembler draait sneller, maar is veel moeilijker te leren.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 8
Geregistreerd: 10 Jan 2020, 23:21
Woonplaats: Westervoort

Re: Hex files combineren

Berichtdoor FritsS » 04 Feb 2020, 10:28

Jullie zullen denken waarom wil iemand eigenlijk naar assembler kijken. In een grijs verleden in de jaren tachtig werkte ik met de RCA 1802 processor en in die tijd beschikten wij niet over mooie IDE werkomgevingen, maar werd het programma nog rechtstreeks in machinetaal geschreven. Een compiler bestond wel, maar geheugenruimte was schaars en duur. In het begin waren de E-proms maar 4 K en pas later groeide die naar 32 K en meer. Ik heb altijd in de elektronica gewerkt en nu eenmaal met pensioen, vond ik het leuk weer eens iets te gaan maken. Nog altijd probeer ik zoveel mogelijk op een zo klein mogelijke print te proppen en verbaas mij nog steeds over de snelheid van een microcontroller met 16 Mhz, terwijl dat in de ogen sommigen en traag en klein ding is.
Inderdaad shooter, heb ik gelezen dat je in een sketch in C ook een stukje in assembler mag schrijven. Wellicht is dat voor mij de geschikte manier. Je noemde ook Scratch. Ik ga het bekijken.
Ik houd jullie op de hoogte van mijn ervaring met de Arduino.

Frits

Berichten: 163
Geregistreerd: 15 Dec 2012, 21:02
Woonplaats: Delfzijl

Re: Hex files combineren

Berichtdoor FPCUser » 04 Feb 2020, 11:28

Als je de volgende URL opgeeft in Google, krijg je een interessant stukje v/d Universiteit Keulen.

http://www.uni-koeln.de/phil-fak/muwi/ag/praktikum/assembler_arduino.pdf

Vooral de literatuuropgave is interessant.

Gebruikers-avatar
Berichten: 8
Geregistreerd: 10 Jan 2020, 23:21
Woonplaats: Westervoort

Re: Hex files combineren

Berichtdoor FritsS » 04 Feb 2020, 14:09

Dat ben ik met je eens. Ik begrijp uit dit Duitse verhaal dat in-line assembler ook zijn voordeel verliest, omdat het door de compiler als C wordt behandeld.
Het gaat mij niet zo zeer om de snelheid, dan wel om te weten wat ik doe en wil bereiken.
Het aangerade programma Scratch wijkt voor mij veel te veel van de werkelijkheid af. Dat wordt helemaal afwachten of het werkt.(meestal niet)
In Atmel studio 7 kan ik wel een voorbeeld bekijken of een nieuw project starten. Echter als ik een file verander of aanvul, moet ik die onder een andere naam opslaan. Daarna kan ik wel een 'build' uitvoeren, maar mijn nieuwe file zie ik niet terug in de hexfile. Die blijft net als de voorbeeldfile. Kennelijk moet mijn file worden toegevoegd aan het project. Als ik dat doe staat hij er twee maal in. Ook niet de juiste weg dus. Is het soms noodzakelijk om een hardware print te hebben aangesloten?
Tot op heden zie er nog weinig brood in, maar als iedereen het kan moet het mij ook gaan lukken.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Hex files combineren

Berichtdoor Gij Kieken » 04 Feb 2020, 21:48

Waarom moeilijk als het makkelijk ook kan.
Gebruik gewoon de Ide , dit is grotendeels C++;
Wil je geen library gebruiken ,doe het dan niet, en schrijf er zelf één als het nodig blijkt.
Kortweg ,de Tip van Koepel neem een Uno ,steek de Usb kabel erin en probeer,voor de prijs moet je het zeker niet laten.
Ervaar en je zult verbaasd staan.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hex files combineren

Berichtdoor nicoverduin » 05 Feb 2020, 21:25

De meest eenvoudige weg om assembly te gaan schrijven op bijv een Uno is aan jouw project een file met type .S toe voegen. Daarin definieer je een setup en loop functie. In de eigenlijke Ino staat eigenlijk bijna niets meer in.

ff in de oude archieven een oud blink programma :
cpp code
.global main
;
; AssemblerApplication2.asm
;
; Created: 10-7-2018 16:36:51
; Author : nicoverduin
;
; program parameters
;


.equ cycleLsb , 0xFF
.equ cycleMdb , 0xD3
.equ cycleMsb , 0x02

.equ DDRB , 0x04
.equ PORTB , 0x05
.equ DDB5 , 0x05
.equ PORTB5 , 0x05


a: .byte 0x20
b: .byte 0x20
c: .byte 0x20
d: .byte

.org 100

main:
sbi DDRB, DDB5 ; PORTB5 output
loop: ; main loop begin
sbi PORTB, PORTB5 ; PORTB5 high (set bit to 1)
call delay ; delay
cbi PORTB, PORTB5 ; 5 PORTB5 low (clear bit to 0)
call delay ; delay
rjmp loop ; main loop

;
; subroutine delay
; Currently set for 1 second delay
;
delay: ; subroutine for delay
; initialize counters
ldi r25, a
ldi r24, b
ldi r18, c

inner_loop:
;
; keep decrementing R18 + R24 + R25 with one until R25 is zero
;
subi r18, 0x01 ; Decrement R18 with 1
sbci r24, 0x00 ; Decrement R24 with carry bit
sbci r25, 0x00 ; Decrement R25 with carry bit
brne inner_loop ; not zero yet so continue to inner loop
ret


de file heet bij mij BlinkASM.S (let op de hoofdletter S voor filetype) in sketch folder BlinkASM. Daarnaast moet je de Ino verwijderen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 8
Geregistreerd: 10 Jan 2020, 23:21
Woonplaats: Westervoort

Re: Hex files combineren

Berichtdoor FritsS » 06 Feb 2020, 08:32

Bedankt voor het meedenken Nico. Het ziet er netjes uit. Maar wat betekent Ino? :?
Inmiddels heb ik een paar Arduino Pro Micro printjes besteld en in afwachting daarvan ga ik de handleiding van de ATmega32U4 nog eens nader bestuderen en een kleine sketch in elkaar zetten.
Dat is een lijvig boekwerk, maar er staat ook heel veel in dat ik nooit ga gebruiken en dus kan overslaan.
Verder blijf ik gericht zoeken naar voorbeelden en ervaringen van anderen. Dat is ook tijdrovend, maar zo hoor of lees ik wel eens iets bruikbaars.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hex files combineren

Berichtdoor nicoverduin » 06 Feb 2020, 08:54

Een .ino is het filetype van een Arduino C/C++ programma. Normaliter zou je bij een C/C++ programma filetype .h, .hpp (voor de includes) en .c, .cpp voor de feitelijke code. De Arduino IDE gebruikt .ino en .h voor code en includes. Overigens gebruik ik zelf niet de Arduino IDE maar de Sloeber (Eclipse met Arduino plugin). zie : https://eclipse.baeyens.it/

Daarnaast is het mogelijk om helemaal je eigen code te schrijven en daarnaast gebruik te maken van de Arduino libraries.
Het .ino bestand ziet er dan als volgt uit:
cpp code
#undef main   // get rid of setup() and loop()


extern "C" void printx(char txt) {
Serial.write(txt);
}

extern "C" void initSerial(){
Serial.begin(9600);
}


Overigens begon ik zelf met 6502 assembly op mijn KIM-1 microcomputer in 1976 :)

Hierbij zijn er een paar belangrijke zaken:
a) de #undef draait de Arduino opbouw de nek om (dus geen setup en loop meer)
b) als je een arduino functie aanroept dan doe je dat met de extern "C". Deze zorgt ervoor dat vanuit assembly en C aanroep mechanisme wordt toegepast.

de assembly in dit voorbeeld is:
cpp code
/**
* programma : main.S
* doel : vervangen main uit C in assembly variant
* auteur : nico verduin
* datum : 08-10-2019
*/

// extern bekend maken of verwachten
.global main // voor de linker
.global init // initialiseren Arduino

.text // code segment
main:
call init // setup atmega328P
call initSerial // roep Serial.begin() aan

ldi R26, 10 // 10 x printen
start:
ldi ZL, lo8(tekst) // Z wijst naar de tekst
ldi ZH, hi8(tekst)
loop:
ld R24, Z+ // Lees teken, aangewezen door Z reg en verhoog Z
cpi R24, 0x00 // kijk of deze 0 is
breq loop1 // Zo ja dan zijn we klaar
push ZL // bewaar het Z register
push ZH
push R26
call printx // Roep Serial.write aan. R24 bevat teken
pop R26
pop ZH // herstel Z register
pop ZL
rjmp loop // volgende teken

loop1:
dec R26 // verlaag counter met 1
brne start // en print nog een keer
done:
rjmp done // eindeloze loop

.data // data segment
tekst: .ascii "dat is een test"
.byte 0x0A, 0x00
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: oyaselyeqot en 12 gasten