Translate

sâmbătă, 5 octombrie 2024

Iniziare a programmare in assembly AVR

 Introduzione

Nell'era dei linguaggi di programmazione di alto livello, delle librerie precostituite e delle piattaforme di sviluppo sempre più intuitive, potrebbe sembrare anacronistico dedicarsi allo studio di un linguaggio assembly come l'AVR per il microcontrollore ATmega328. Eppure, immergersi nel mondo dell'assembly rappresenta un'opportunità unica per comprendere a fondo i meccanismi che governano il funzionamento di un computer, dalle basi hardware fino alla logica più complessa dei software.

Perché imparare l'assembly AVR?

L'ATmega328, cuore pulsante di molte schede Arduino, è uno dei microcontrollori più diffusi e documentati al mondo. La sua architettura relativamente semplice lo rende un punto di partenza ideale per chi desidera esplorare il mondo dell'assembly.

Il paradosso dell'informatica moderna

Oggi, molti programmatori utilizzano linguaggi di alto livello e framework sofisticati per sviluppare applicazioni complesse. Tuttavia, questa facilità d'uso nasconde una complessità sottostante, spesso basata su una pila di librerie che si appoggiano l'una sull'altra. Questa stratificazione può rendere difficile comprendere il funzionamento interno del software e risolvere problemi complessi.

L'analogia con la biologia

Possiamo paragonare la programmazione in assembly alla bioingegneria. Un bioingegnere che conosce a fondo la biologia molecolare può manipolare il DNA per creare organismi con caratteristiche specifiche. Allo stesso modo, un programmatore che conosce l'assembly può manipolare direttamente l'hardware, creando sistemi embedded personalizzati e altamente performanti.

In conclusione

Imparare l'AVR assembly è un investimento nel tuo futuro professionale. Ti permetterà di affrontare le sfide dell'informatica con una maggiore consapevolezza e flessibilità. E, soprattutto, ti darà la soddisfazione di creare qualcosa di veramente tuo, partendo dalle fondamenta.

Sei pronto a immergerti nel mondo dell'assembly e a scoprire una nuova dimensione della programmazione?

 

Questo e arduino nano, puoi cercare a internet https://www.google.com/search?q=arduino+nano


L'Arduino Nano è un modulo completo che, oltre al microcontrollore ATmega328, include tutta l'elettronica necessaria per funzionare autonomamente. Tra i componenti chiave troviamo un convertitore USB-TTL, che consente la comunicazione con un computer tramite usb, e altri circuiti di supporto per l'alimentazione e la protezione.



Questo e il microntrollere atmega328 





E questa e la struttura interna 



Sono entusiasta di annunciare la creazione di una piccola pagina web https://www.costycnc.it/avr1 che semplifica notevolmente l'inizio della programmazione con Arduino Nano. Grazie alla libreria https://github.com/LingDong-/avrlass , potrai compilare e caricare il tuo codice direttamente dal browser, senza installare software aggiuntivi. Inoltre, la funzione di decompilazione ti permetterà di analizzare il codice compilato e comprendere meglio il funzionamento interno del microcontrollore.






Partiamo da un esempio semplicissimo di codice in assembly per AVR:

Snippet di codice
.org 0x60
init:
sbi 4,5
sbi 5,5
rjmp init

Vediamo insieme cosa fa riga per riga questo piccolo programma.

Spiegazione del codice

  • .org 0x60:

    • Questa direttiva indica al compilatore assembly a partire a scrivere il codice dalla locazione di memoria 0x60. Questa è una pratica comune per posizionare il programma a un indirizzo specifico nella memoria flash del microcontrollere.
  • init::

    • Questa è un'etichetta che definisce l'inizio del programma. Quando il microcontrollore viene resettato, l'esecuzione inizia da questa etichetta.
  • sbi 4,5:

    • Questa istruzione imposta il quinto bit del registro 4 a 1, configurando pin connesso al LED on-board di Arduino come uscita.In altre parole, impostiamo il pin connesso al LED on-board di Arduino in modo che possa controllare un dispositivo esterno.
  • sbi 5,5:

    • Questa istruzione imposta il quinto pin del registro 5 a 1.In altre parole, attiviamo il pin connesso al LED on-board di Arduino per accendere il LED.
  • rjmp init:

    • Questa istruzione significa "Relative Jump". Indica al microcontrollore di saltare incondizionatamente all'etichetta "init". In altre parole, il programma eseguirà in loop queste tre istruzioni all'infinito.

Comportamento del programma

Questo semplice programma, quando caricato su un microcontrollore AVR, farà in modo che il pin specifico (connesso al LED on-board di Arduino) sta sempre in stato alto. In pratica, se questo pin e a LED, i LED resta sempre accesso.

Conclusioni

Questo codice, pur essendo molto semplice, illustra alcuni concetti fondamentali della programmazione in assembly:

  • Utilizzo delle etichette: Per definire punti di riferimento nel codice.
  • Manipolazione dei registri: Per controllare l'hardware del microcontrollore.
  • Istruzioni di salto: Per creare loop e controllare il flusso del programma.

Applicazioni pratiche:

  • Accensione di LED: Come già detto, questo codice può essere utilizzato per accendere un LED collegato al pin corrispondente.
  • Creazione di un segnale di riferimento: I pin in stato alto possono essere utilizzati come segnale di riferimento per altri circuiti.
  • Base per programmi più complessi: Questo semplice esempio può essere esteso per creare programmi più sofisticati, come leggere sensori, controllare motori o comunicare con altri dispositivi.

Sviluppi possibili:

  • Includere un ritardo: Utilizzare un timer per creare un ritardo tra le istruzioni.
  • Invertire lo stato dei pin: Utilizzare l'istruzione cbi (Clear Bit) per spegnere i LED.
  • Leggere un ingresso: Utilizzare le istruzioni di input per leggere lo stato di un pulsante o di un sensore.
  • Generare un segnale PWM: Utilizzare i timer per generare un segnale PWM per controllare la luminosità di un LED o la velocità di un motore.

In conclusione, questo codice, seppur basilare, rappresenta un punto di partenza eccellente per chi vuole approfondire la programmazione in assembly per microcontrollori AVR.




vineri, 29 decembrie 2023

how build a assembly compiler for atmega328 in javascript

 I build here an assembly compiler for atmega328 in javascript https://www.costycnc.it/avr-hex-uploader/

Buid an html document with a textarea box and a js script to read textarea box :

<html>

<body>

<textarea id="code" cols="50" rows="20"> </textarea>

<button onclick="compile();">Compile</button>

<script>

         // for verify https://regex101.com/

var regex=/^[\t ]*(?:\.def\s+(\w+),(\w+)|\.org\s+(\d+)|(\w+):)?/;

                  //this regex if  ".def PINB1,1" return [1]="PINB1",  [2]="1"
                  //this regex if  ".org 00" return [3]="00"
                  //this regex if  ":abc" return [4]="abc"

function compile(){

         var input=document.getElementById("code").value;

         var lines = input.split('\n'); 

          for (var i = 0, l = lines.length; i < l; i++) {  

                       var match = regex.exec(lines[i]); 

  console.log("param1:", match[1]);

 console.log("param2:",match[2]);   

 console.log("param3:",match[3]);   

  console.log("param4:", match[4]);   

}

                 }

 

</script>

</body>

</html>

marți, 31 octombrie 2023

RC car toy TX2/RX2 with arduino | costycnc rc car tx rx




https://forum.arduino.cc/index.php?topic=171238.0

rc_car1 I put D2 signal to ground and working good

               upload to arduino rc_car1.ino
               welding wire from arduino to rc car (ground,power and D2) same as rc_car1.jpg photo
               send command letter under serial ... the car need to rispond with moving
               
               a Forward 
               b Forward Turbo 
               c Forward & Left 
               d Forward & Right
               e Backward
               f Backward & Right
               g Backward & Left
               h Left
               i Right

 


Source https://github.com/costycnc/costycnc-toy-rc-car-arduino-ide/

 /*Data Format

W2 W2 W2 W2 (n) x W1 W2 W2 W2 W2 (n) x W1 W2 W2 W2 W2

Number of Function Codes (n) W1 Function Key Decode Result

4 End Code

10 Forward Forward

16 Forward & Turbo Forward

22 Turbo Turbo

28 Turbo & Forward & Left Forward & Left

34 Turbo & Forward & Right Forward & Right

40 Backward Backward

46 Backward & Right Backward & Right

52 Backward & Left Backward & Left

58 Left Left

64 Right Right

*/


void setup()

{

 pinMode(2, OUTPUT);

}


void loop()

{

   delay(1000); 

    for(int i=0; i<=30; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

 for(int i=0; i<=3; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(1500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

 for(int i=0; i<=9; i++) // This makes the car go "forward" 10 W1 pulses 500Mhz 50% duty cycle

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

}


 delay(1000); 

    for(int i=0; i<=30; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

 for(int i=0; i<=3; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(1500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

 for(int i=0; i<=39; i++) // This makes the car go "forward" 10 W1 pulses 500Mhz 50% duty cycle

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

}

 delay(1000); 

    for(int i=0; i<=30; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

 for(int i=0; i<=3; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(1500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

 for(int i=0; i<=45; i++) // This makes the car go "forward" 10 W1 pulses 500Mhz 50% duty cycle

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

}

 delay(1000); 

    for(int i=0; i<=30; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

 for(int i=0; i<=3; i++) // This starts the communication 4 W2 pulses 1KHz 75% duty cycle 

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(1500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

 for(int i=0; i<=63; i++) // This makes the car go "forward" 10 W1 pulses 500Mhz 50% duty cycle

 {

   digitalWrite(2, HIGH);

   delayMicroseconds(500);


   digitalWrite(2, LOW);

   delayMicroseconds(500);

 }

}

}

duminică, 29 octombrie 2023

PROGRAMMING AN ATMEGA328P WITHOUT THE ARDUINO IDE

This site https://www.costycnc.it/avr-hex-uploader is make manually by me and not have yet implemented all asm code ... so if want to help me are welcome!

This page was created for upload hex code to arduino nano ( for upload grbl firmware to arduino nano used in my costycnc foam cutter costycnc https://www.costycnc.it) ... but i added some functions (after tons of hours and google search and tests) that permit you not only upload your firmware to arduino but also create your small code in asm , compile it and upload to arduino!

So you can watch this first video tutorial https://youtu.be/0i8CgucF1Bg?si=npn7C0CtkzRj3GIi (is in italian but translated in english too) you will understand purpose of this site. 

In few words ... you can compile asm code and upload to arduino nano only with this page. 

In this mode you have many advantages :

-You can learn the base of microcontroller in generally and specially atmega328 architecture.

-You can learn the base of asm language (many are unknown now even to me!!!)

-You can create in this mode very small code.

-You can see in my tutorials practice example without download hudge programs.

And many other advantages  which do not come to my mind now!







See my channels for anothers videos!

https://www.youtube.com/@bobyca2003





duminică, 10 octombrie 2021

costycnc how inkscape create svg in mm

 My page is www.costycnc.it ... and my id is costycnc ... so ... try on internet costycnc .

I create this page www.costycnc.it/cm8 for transform a image to gcode , i modified potrace https://kilobtye.github.io/potrace/ for transform coordonate to gcode ... practicall all lines that compound svg i transform to gcode ... for example L 10 10 to G01 X10 Y10 (at line 1249)... C 10 10 to G01 X10 X10  (at line 1239)  see here https://www.costycnc.it/potrace/potrace.js.highlight.html#1236

Inkscape create document svg with height and with in mm ... my old transformed potrace to gcode ... create a gcode in mm but svg in pixels ... so now i try to  produce also the svg file in mm not in pixel.

The dpi of my system is 96 (also the inkscape use 96 dpi ) so the old svg produce 378 for 10 mm ... so I did not understand because this 378  ... but here explain better 

https://stackoverflow.com/questions/35517230/lines-look-irregular-in-thickness-when-using-texturebrush

Since the convention is that all monitors have 96 pixels per inch, and by definition 1 inch == 25.4 mm, we have that 0.1 mm == 0.1 mm * 96 (px / inch) * (1 inch / 25.4 mm) == 0.378 pixels (approximately).

so ...here   https://www.costycnc.it/potrace/potrace.highlight.html#155 at line 155 i put 100/378 for result values in mm ... first was 1 and svg measure result was in pixels...

now need to understand better to finished program!