Arduino UNO ATMega328P in assembly

Salve a tutti,
è il mio primo post in questo forum, mi presento mi chiamo Biagio Ianero e ho 17 anni.
Scrivo questo post per tutti gli utenti Macintosh che hanno acquistato arduino, ma vogliono programmarlo senza usare le librerie super-semplificate già fornite e senza acquistare programmatori hardware esterni.
Essendo su mac non ho potuto nemmeno usufruire dell'IDE di sviluppo AVR Studio, e ho dovuto girare un po' qua e là per mettere insieme vari programmi a linea di comando per programmare il nostro ATMega in assembly o C.
I programmi a linea di comando necessari sono: avr-as (assembler), avr-gcc (compilatore C), avr-ld (linker), avr-objcopy (da .elf a .hex, formato compatibile con tutti i programmatori) e avrdude (per trasferire l'hex sul chip).
Fortunatamente troviamo tutto "impacchettato" qui:

Dopo aver scritto il vostro programma in assembly o C, potete seguire i seguenti passi per portarlo sull'ATMega senza passare dall'IDE Arduino:

  1. Compilazione (esempio in assebly, per il C basta cambiare avr-as con avr-gcc)
    $ avr-as -mmcu=atmega328p -o helloworld.o helloworld.S

  2. Linking
    $ avr-ld -o helloworld.elf helloworld.o

  3. Da elf a hex Intel (formato compatibile con tutti i programmatori)
    $ avr-objcopy --output-target=ihex helloworld.elf helloworld.hex

  4. Programmazione con avrdude
    $ avrdude -p atmega328p -P tty.usbserial-xxxxx -c arduino -b 115200 -F -U flash:w:helloworld.hex

Al posto di tty.usbserial-xxxxx bisogna inserire il nome del device di osx sul quale è collegato Arduino (menù "Serial Port" dell'IDE).

Spero di essere stato utile,
un saluto a tutti,
Biagio.

Spero di essere stato utile,
un saluto a tutti,

Sono sicuro che a qualcuno tornerà utile, anche perchè è una procedura standard che lavora su tutte le piattaforme, eventualmente per programmi più complessi c'è "make" che dovrebbe compilare anche sotto MAC.

Ciao.

Certo :slight_smile:
Quella sequenza di comandi pul essere sostituita con un Makefile :slight_smile:

Mi sembra che spieghi come complicarsi la vita.

  1. per programmare il ATmega in assembler devi avere una discreta conoscenza di programmazione in assembler e dell'architettura del ATmega. Dubito che fino a questo punto siano arrivati tanti che girano su questo Forum. Io non so farlo.
  2. Perché non usare il IDE Arduino per compilare e uploadare il programma? Se non Ti piace l' editore del IDE usa un altro.

Ciao Uwe

Ho specificato:
"Scrivo questo post per tutti gli utenti Macintosh che hanno acquistato arduino, ma vogliono programmarlo senza usare le librerie super-semplificate già fornite"

A me piace imparare cosa c'è "sotto il cofano". :slight_smile:

Qualcuno potrebbe dirmi se dall'ambiente di sviluppo Arduino è possibile programmare il uC in linguaggio assembler e non in C/C++? Grazie

@matteodellinoci: essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Ah ... per rispondere alla tua domanda ... QUI e QUI

Guglielmo

tutto il framework Arduino si può bypassare, ad esempio cancellate le due funzioni loop() e setup() e scrivere

int main()
{
    while(1);
}

e così avrete il main pulito con i suoi pregi e difetti, ad esempio nessun interrupt inizializzato e quindi no delay,millis et simila.
Sapere modificare il comportamento del framework è un buon inizio, per programmare in C non basta conoscere il linguaggio, che si racchiude in circa 200/300 pagine, bisogna avere altre conoscenze, bisogna studiare parecchio.
Tramite l'ide Arduino non si può programmare in Assembly perché viene richiamato GCC e poi g++ dunque possiamo usare l'inline, ma meglio non abusarne ed usarlo solo in casi strettamente necessari.
Forse si crede che in tale linguaggio il chip corra più veloce, ma per superare le ottimizzazioni del compilatore bisogna avere tanta,tanta,tanta esperienza.

Volete fare di più? aprite la directory che contiene il core Arduino e iniziate ad aggiungere , modificare il codice.Ricordatevi che li siete in C non in C++.