#include "lib_io_tp.h"
void setup() {
Serial.begin(115200);
SetupES();
}
void loop() {
unsigned char E=readPort();
writePort(E);
Serial.print(" ");
Serial.print(E,HEX);
Serial.println();
delay(100);
}
#include
void SetupES(void);
unsigned char readPort(void);
void writePort(unsigned char value);
#include "lib_io_tp.h"
/*mix de
https://wokwi.com/arduino/projects/313005664351814210
et de
https://wokwi.com/arduino/projects/301188813482361352
*/
// Pin definitions:
const int datapin_in = 2; /* Q7 */
const int clockpin_in = 3; /* CP */
const int latchpin_in = 4; /* PL */
const int datapin_out = 5;
const int clockpin_out = 6;
const int latchpin_out = 7;
///////////////////////////////////////////////////////
void SetupES(void){
pinMode(datapin_in, INPUT);
pinMode(clockpin_in, OUTPUT);
pinMode(latchpin_in, OUTPUT);
// Set the three SPI pins to be outputs:
pinMode(datapin_out, OUTPUT);
pinMode(clockpin_out, OUTPUT);
pinMode(latchpin_out, OUTPUT);
}
///////////////////////////////////////////////////////
unsigned char readPort(void){
unsigned char val=0;
// Step 1: Sample
digitalWrite(latchpin_in, LOW);
digitalWrite(latchpin_in, HIGH);
for (int i = 0; i < 8; i++) {
int bit = digitalRead(datapin_in);
val=(val<<1)|bit;
digitalWrite(clockpin_in, HIGH); // Shift out the next bit
digitalWrite(clockpin_in, LOW);
}
return val;
}
///////////////////////////////////////////////////////
void writePort(unsigned char value){
shiftOut(datapin_out, clockpin_out, MSBFIRST, value); //Send "data" to the shift register
//Toggle the latchpin_out to make "data" appear at the outputs
digitalWrite(latchpin_out, HIGH);
digitalWrite(latchpin_out, LOW);
}
///////////////////////////////////////////////////////
{
"version": 1,
"author": "Uri Shaked",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": -41.14, "left": 32.68, "attrs": {} },
{ "type": "wokwi-74hc165", "id": "sr1", "top": -121.05, "left": 145.07, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw8", "top": -201.18, "left": 0, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw7", "top": -201.18, "left": 40, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw6", "top": -201.18, "left": 80, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw5", "top": -201.18, "left": 120, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw4", "top": -201.18, "left": 160, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw3", "top": -201.18, "left": 200, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw2", "top": -201.18, "left": 240, "attrs": {} },
{ "type": "wokwi-slide-switch", "id": "sw1", "top": -201.18, "left": 280, "attrs": {} },
{
"type": "wokwi-74hc595",
"id": "sr2",
"top": -302.5,
"left": 313.3,
"rotate": 90,
"attrs": {}
},
{ "type": "wokwi-led", "id": "led1", "top": -335, "left": 275, "attrs": { "color": "red" , "label": "0" } },
{ "type": "wokwi-led", "id": "led2", "top": -335, "left": 235, "attrs": { "color": "red" , "label": "1"} },
{ "type": "wokwi-led", "id": "led3", "top": -335, "left": 195, "attrs": { "color": "red" , "label": "2"} },
{ "type": "wokwi-led", "id": "led4", "top": -335, "left": 155, "attrs": { "color": "red" , "label": "3"} },
{ "type": "wokwi-led", "id": "led5", "top": -335, "left": 115, "attrs": { "color": "red" , "label": "4"} },
{ "type": "wokwi-led", "id": "led6", "top": -335, "left": 75, "attrs": { "color": "red" , "label": "5"} },
{ "type": "wokwi-led", "id": "led7", "top": -335, "left": 35, "attrs": { "color": "red" , "label": "6"} },
{ "type": "wokwi-led", "id": "led8", "top": -335, "left": -5, "attrs": { "color": "red" , "label": "7"} }
],
"connections": [
[ "sr1:D7", "sw8:2", "green", [ "v24", "h-114" ] ],
[ "sr1:D6", "sw7:2", "green", [ "v18", "h-114" ] ],
[ "sr1:D5", "sw6:2", "green", [ "v12", "h-80" ] ],
[ "sr1:D4", "sw5:2", "green", [ "v8", "h-45" ] ],
[ "sr1:D3", "sw4:2", "green", [ "v-26", "h7" ] ],
[ "sr1:D2", "sw3:2", "green", [ "v-20", "h21" ] ],
[ "sr1:D1", "sw2:2", "green", [ "v-16", "h61" ] ],
[ "sr1:D0", "sw1:2", "green", [ "v-10", "h82" ] ],
[ "sr1:PL", "uno:4", "orange", [ "v36", "h13" ] ],
[ "sr1:CP", "uno:3", "purple", [ "v30", "h-22" ] ],
[ "sr1:Q7", "uno:2", "magenta", [ "v-4", "h0" ] ],
[ "uno:GND.1", "sw8:1", "black", [ "v-16", "h0" ] ],
[ "sw8:1", "sw7:1", "black", [ "v7", "h0" ] ],
[ "sw7:1", "sw6:1", "black", [ "v7", "h0" ] ],
[ "sw6:1", "sw5:1", "black", [ "v7", "h0" ] ],
[ "sw5:1", "sw4:1", "black", [ "v7", "h0" ] ],
[ "sw4:1", "sw3:1", "black", [ "v7", "h0" ] ],
[ "sw3:1", "sw2:1", "black", [ "v7", "h0" ] ],
[ "sw2:1", "sw1:1", "black", [ "v7", "h0" ] ],
[ "sw1:3", "uno:5V", "red", [ "v12", "h21", "v335", "h0" ] ],
[ "sw1:3", "sw2:3", "red", [ "v12", "h0" ] ],
[ "sw2:3", "sw3:3", "red", [ "v12", "h0" ] ],
[ "sw3:3", "sw4:3", "red", [ "v12", "h0" ] ],
[ "sw4:3", "sw5:3", "red", [ "v12", "h0" ] ],
[ "sw5:3", "sw6:3", "red", [ "v12", "h0" ] ],
[ "sw6:3", "sw7:3", "red", [ "v12", "h0" ] ],
[ "sw7:3", "sw8:3", "red", [ "v12", "h0" ] ],
[ "sr1:VCC", "sw5:3", "red", [ "v-34", "h165" ] ],
[ "sr1:CE", "sw4:1", "black", [ "v-39", "h158" ] ],
[ "sr1:GND", "uno:GND.1", "black", [ "v42", "h-233" ] ],
[ "sr2:GND", "uno:GND.1", "black", [ "v205","h0" ] ],
[ "sr2:GND", "led1:C", "black", [ "v0", "h-13" ] ],
[ "sr2:GND", "led2:C", "black", [ "v0", "h-29" ] ],
[ "sr2:GND", "led3:C", "black", [ "v0", "h-16" ] ],
[ "sr2:GND", "led4:C", "black", [ "v0", "h-35" ] ],
[ "sr2:GND", "led5:C", "black", [ "v0", "h-66" ] ],
[ "sr2:GND", "led6:C", "black", [ "v0", "h-100" ] ],
[ "sr2:GND", "led7:C", "black", [ "v0", "h206" ] ],
[ "sr2:GND", "led8:C", "black", [ "v0", "h277" ] ],
[ "sr2:VCC", "uno:5V", "red", [ "h30", "v500", "h-156" ] ],
[ "sr2:DS", "uno:5", "blue", [ "h16", "v220", "h-68" ] ],
[ "uno:GND.1", "sr2:OE", "black", [ "h0","v-16", "h230", "v-52" ] ],
[ "sr2:STCP", "uno:7", "purple", [ "h7", "v189", "h-77" ] ],
[ "sr2:SHCP", "uno:6", "gray", [ "h4", "v170", "h-66" ] ],
[ "sr2:Q7", "led8:A", "green", [ "h0" ] ],
[ "sr2:Q6", "led7:A", "green", [ "h-4", "v6", "h-194" ] ],
[ "sr2:Q5", "led6:A", "green", [ "h-7", "v12", "h-161" ] ],
[ "sr2:Q4", "led5:A", "green", [ "h-10", "v18", "h-131" ] ],
[ "sr2:Q3", "led4:A", "green", [ "h-13", "v24", "h-95" ] ],
[ "sr2:Q2", "led3:A", "green", [ "h-16", "v31", "h-64" ] ],
[ "sr2:Q1", "led2:A", "green", [ "h-19", "v37", "h-40" ] ],
[ "sr2:Q0", "led1:A", "green", [ "h10", "v-17", "h-63", "v40", "h-6" ] ]
]
}
====Probleme avec les vcd====
en fait ce sont les caractères "d'été" ' et é dans l'heure qui posent problème.
codes ascii 39 et 130 dans table ascii french
or d'après
https://en.wikipedia.org/wiki/Value_change_dump#:~:text=From%20Wikipedia%2C%20the%20free%20encyclopedia%20Value%20Change%20Dump,language%20by%20the%20IEEE%20Standard%201364-1995%20in%201996.
Each variable is assigned an arbitrary, compact ASCII identifier for use in the value change section. The identifier is composed of printable ASCII characters from ! to ~ (decimal 33 to 126). Several variables can share an identifier if the simulator determines that they will always have the same value.
lecture de la date dans gtkwave: https://github.com/gtkwave/gtkwave/blob/ee52b426351cb2a58af16b11bf401519ccba3ead/gtkwave3-gtk3/src/helpers/fst/fstapi.c
====création d'eléments=====
https://www.youtube.com/watch?v=gh27icNatwA
https://github.com/wokwi/wokwi-elements/blob/master/CONTRIBUTING.md
https://elements.wokwi.com/?path=/story/7-segment--red-4
https://hackaday.io/urishaked
https://hackaday.io/course/176685-avr-architecture-assembly-reverse-engineering
------------------------------------------
dossier pour fichiers ressources: https://bvdp.inetdoc.net/files/cesi/
=====Installation à l'iut=====
sudo apt update
il faut taper O plusieurs fois en console
sudo apt install chromium-browser
https://askubuntu.com/questions/118025/bypass-the-yes-no-prompt-in-apt-get-upgrade
sudo DEBIAN_FRONTEND=noninteractive apt update -y
sudo apt -y install chromium-browser
bizarre sur E10, il n'y a que chromium
sudo apt -y install chromium
sudo apt -y install gtkwave python3-pip
sudo pip3 install watchdog
cd ~/Téléchargements
wget --no-check-certificate https://bvdp.inetdoc.net/files/cesi/wokwi2gtkwave.py
python3 ./wokwi2gtkwave.py
dans firefox,
option (trois traits horizontaux en haut à droite)
paramètres
dans la partie Téléchargements, cocher:
Enregistrer les fichiers dans le dossier
et choisir le dossier Téléchargements
il y a le probleme de faire en sorte de télécharger automatiquement le fichier plutot que de l'ouvrir...
https://support.mozilla.org/fr/kb/changer-ce-que-fait-firefox-lorsque-vous-cliquez-telechargez-fichier
cd ~/.mozilla/firefox
find .|grep handlers
./kywfgwb2.default/handlers.json
gedit ~/.mozilla/firefox/kywfgwb2.default/handlers.json
explication sur: https://support.mozilla.org/en-US/questions/1197107
firefox indique que wikwi-logic.vcd est un fichier de type GTKWave Dump File à partir de :blob:
plugin a voir: https://addons.mozilla.org/en-US/firefox/addon/content-type-fixer/
avant:
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":0,"ask":true},"video/x-msvideo":{"action":0,"ask":true,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true}}}
après avoir changé AVI en télécharger le fichier:
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":0,"ask":true},"video/x-msvideo":{"action":0,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true}}}
modif de fichier pour sauver les .vcd:
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":0,"ask":true},"video/x-msvideo":{"action":0,"ask":true,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true},"vcd":{"action":0,"extensions":["vcd"]}}}
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":0,"ask":true},"video/x-msvideo":{"action":0,"ask":true,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true},"vcd":{"action":0,"extensions":["vcd"]}}}
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":2,"ask":true},"video/x-msvideo":{"action":0,"ask":true,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true},"application/GTKWave Dump File":{"action":0,"ask":false}}}
{"defaultHandlersVersion":{"fr":3},"mimeTypes":{"application/pdf":{"action":3,"extensions":["pdf"]},"application/x-bittorrent":{"action":0,"ask":true,"extensions":["torrent"]},"video/mp4":{"action":0,"ask":true,"extensions":["mp4"]},"application/zip":{"action":0,"ask":true,"extensions":["zip"]},"application/force-download":{"action":0,"ask":true,"extensions":["cbr"]},"application/x-rar-compressed":{"action":2,"ask":true},"video/x-msvideo":{"action":0,"ask":true,"extensions":["avi"]},"text/xml":{"action":3,"extensions":["xml"]},"image/svg+xml":{"action":3,"extensions":["svg"]},"image/webp":{"action":3,"extensions":["webp"]},"image/avif":{"action":3,"extensions":["avif"]}},"schemes":{"webcal":{"action":2,"ask":true},"ircs":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"mailto":{"action":4,"handlers":[null,{"name":"Yahoo! Mail","uriTemplate":"https://compose.mail.yahoo.com/?To=%s"},{"name":"Gmail","uriTemplate":"https://mail.google.com/mail/?extsrc=mailto&url=%s"}]},"irc":{"action":2,"ask":true,"handlers":[null,{"name":"Mibbit","uriTemplate":"https://www.mibbit.com/?url=%s"}]},"apt":{"action":4,"ask":true},"application/vcd":{"action":0,"ask":false,"extensions":["vcd"]}}}
liste des mime types: https://www.htmlstrip.com/mime-file-type-checker
vcd pas bon...
https://www.bing.com/search?form=MOZLBR&pc=MOZI&q=mime+type+vcd+gtkwave
application/vnd.gtkwave-gtkw
https://reposcope.com/mimetype/application/vnd.gtkwave-gtkw
il y a également https://reposcope.com/mimetype/application/vnd.gtkwave-vcd
application/vnd.gtkwave-vcd
rechercher: mime type GTKWave Dump File
https://www.bing.com/search?form=MOZLBR&pc=MOZI&q=mime+type+GTKWave+Dump+File+
application/vnd.gtkwave-ae2
doc du format vcd: https://en.wikipedia.org/wiki/Value_change_dump
https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
Il existe deux types MIME principaux qui jouent un rôle important en terme de types par défaut :
text/plain est le type MIME par défaut pour les fichiers texte. Un fichier texte doit pouvoir être lu par un utilisateur et ne pas contenir de données binaires.
application/octet-stream est le type MIME par défaut dans tous les autres cas. Un fichier de type inconnu doit être associé à ce type MIME. Les navigateurs traiteront les fichiers associés à ce type MIME de façon particulière pour protéger au maximum l'utilisateur des éventuels risques de sécurité.
bon je n'y arrive pas ça va finir avec:
sudo apt install chromium-browser
=====Organisation ? =====
organisation temporelle? (moi en premier pour me libérer au S4?)
appli assembleur -> passer en inline asm gcc
appli au WS2812 ou autre
commande de procédé: on peut garder le tapis festo avec interface 8574 arduino ou nucléo
arduino et vstudio code / platform IO: disassembly automatisé ok mais pas de simulateur pour l'assembleur (essayer un autre simu)
passer sous nucléo dans un second temps ?
est ce qu'on part de HAL puis on descend vers bas niveau ou l'inverse?
dev algo sur PC pour debug puis cross compilation
=====Archi ATMEGA328P=====
documentation du micro: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
cours d'architecture ATMEGA328P: https://www-lisic.univ-littoral.fr/~hebert/microcontroleur/atmel/
cours en anglais: https://bvdp.inetdoc.net/files/cesi/polyarduinocottenceau2019.pdf
====Makefile====
https://github.com/sudar/Arduino-Makefile
https://gist.github.com/SkypLabs/c32ce01c695620e033443d407544f21e
arguments pour makefile: https://stackoverflow.com/questions/2214575/passing-arguments-to-make-run
PHONY: https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html
https://blog.podkalicki.com/how-to-compile-and-burn-the-code-to-avr-chip-on-linuxmacosxwindows/
programmation arduino en assembleur (pour des programmes complets): https://gist.github.com/mhitza/8a4608f4dfdec20d3879
=====Wokwi=====
éditeur en ligne de code arduino avec simulation de matériel: https://wokwi.com/
code source de wikwi: https://github.com/wokwi
Description arduino uno avec broches et périphériques internes simulés: https://docs.wokwi.com/parts/wokwi-arduino-uno
GDB en ligne: https://docs.wokwi.com/gdb-debugging
projet vide arduino uno: https://wokwi.com/arduino/new?template=arduino-uno
exemple de projet piano: https://wokwi.com/arduino/projects/291958456169005577
analyseur logique: https://docs.wokwi.com/parts/wokwi-logic-analyzer et https://docs.wokwi.com/guides/logic-analyzer#using-the-logic-analyzer
=====AVR Assembler=====
sudo apt install avra
cd ~/Bureau/iutatrier/iut5/cesi/asm_arduino
make
avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:blink.hex
pour que le Makefile compile et upload le bon programme:
make program="blink" upload
=====Différents simulateurs=====
plusieurs simulateurs hors ligne: https://all3dp.com/fr/2/meilleur-simulateur-arduino-en-ligne-hors-ligne/
exemple de simulation avec thinkercad: https://create.arduino.cc/projecthub/KMsaifullah/virtual-arduino-simulation-ce1bd2
=====SimAVR=====
simulateur arduino couplé avec gtkwave:
https://github.com/buserror/simavr
https://github.com/buserror/simavr/tree/master/examples
TP programmation assembleur sur ATMEGA328P: http://jmfriedt.free.fr/TP_M1_asm32u4.pdf
visualisation fichier vcd avec gtkwave via simavr (simavr peut être utilisé avec GDB )
cd ~/Bureau/iutatrier/iut5/cesi/simuavr
git clone https://github.com/buserror/simavr.git
sous bionic 18.04, c'est installable avec apt, mais je dois compiler à la main
make
pb: fatal error: libelf.h: Aucun fichier ou dossier de ce type
il faut installer:
sudo apt install libelf-dev
fatal error: curses.h: Aucun fichier ou dossier de ce type
sudo apt-get install libncurses-dev
=====Visual studio code=====
https://fr.wikipedia.org/wiki/Visual_Studio_Code
téléchargement: https://code.visualstudio.com/download
version linux deb: https://code.visualstudio.com/docs/?dv=linux64_deb
sudo dpkg -i code_1.60.2-1632313585_amd64.deb
dpkg -c code_1.60.2-1632313585_amd64.deb | more
installe dans ./usr/share/code/bin/code
dus /usr/share/code
1M /usr/share/code/bin
3M /usr/share/code/swiftshader
7M /usr/share/code/locales
125M /usr/share/code/resources
293M /usr/share/code
il me propose au démarrage: "Do you want to install the recommended extensions for C++?"
https://marketplace.visualstudio.com/vscode
====C++====
https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools
* Installation: Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
ext install ms-vscode.cpptools
====Arduino (finalement ne pas l'installer====
https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino
* Installation: Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
ext install vsciot-vscode.vscode-arduino
====PlatformIO====
https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide
* Installation: Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
ext install platformio.platformio-ide
Problème à cause de version python
Error: TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received null at /home/bvandepo/.vscode/extensions/platformio.platformio-ide-2.3.3/node_modules/platformio-node-helpers/dist/index.js:1:771390 at a (/home/bvandepo/.vscode/extensions/platformio.platformio-ide-2.3.3/node_modules/platformio-node-helpers/dist/index.js:1:771284) at w (/home/bvandepo/.vscode/extensions/platformio.platformio-ide-2.3.3/node_modules/platformio-node-helpers/dist/index.js:1:771035) at u (/home/bvandepo/.vscode/extensions/platformio.platformio-ide-2.3.3/node_modules/platformio-node-helpers/dist/index.js:1:770559) at /home/bvandepo/.vscode/extensions/platformio.platformio-ide-2.3.3...
passer à python 3.6, installation à la main depuis les sources facile: https://moreless.medium.com/install-python-3-6-on-ubuntu-16-04-28791d5c2167
cd /opt
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
tar -xvf Python-3.6.3.tgz
cd Python-3.6.3
./configure
make
make install
création d'un projet arduino dans platform io: https://docs.platformio.org/en/latest//integration/ide/vscode.html#quick-start
l'extension arduino fait un conflit avec platformio, la virer!
~/.platformio$ dus
2M ./platforms
29M ./penv
64M ./.cache
274M ./packages
366M ./
=====Super doc sur asm inliné avec GCC=====
livre à acheter: https://leanpub.com/arduinoinlineassembly
https://ucexperiment.wordpress.com/2016/03/04/arduino-inline-assembly-tutorial-1/
If certain instructions need to remain consecutive in the output, put them in a single multi-instruction asm statement. GCC’s optimizers can move asm statements relative to other code, including across jumps.
asm statements may not perform jumps into other asm statements. GCC does not know about these jumps, and therefore cannot take account of them when deciding how to optimize. Jumps from asm to C labels are only supported under extended asm.
Under certain circumstances, GCC may duplicate (or remove duplicates of) your assembly code when optimizing. This can lead to unexpected duplicate symbol errors during compilation if your assembly code defines symbols or labels. And since GCC does not parse the Assembler instructions, it has no visibility of any symbols it may reference.
https://ucexperiment.wordpress.com/2016/03/07/arduino-inline-assembly-tutorial-2/
https://ucexperiment.wordpress.com/2016/03/08/arduino-inline-assembly-tutorial-3/
https://ucexperiment.wordpress.com/2016/03/10/arduino-inline-assembly-tutorial-4/
https://ucexperiment.wordpress.com/2016/03/11/arduino-inline-assembly-tutorial-5-2/
https://ucexperiment.wordpress.com/2016/03/13/arduino-status-register-sreg/
https://ucexperiment.wordpress.com/2016/03/14/arduino-inline-assembly-tutorial-6-2/
https://ucexperiment.wordpress.com/2016/03/16/arduino-inline-assembly-tutorial-7-bit-shifts/
https://ucexperiment.wordpress.com/2016/03/19/arduino-inline-assembly-tutorial-8-math/
https://ucexperiment.wordpress.com/2016/03/22/toward-a-more-general-digitalread/
https://ucexperiment.wordpress.com/2016/03/23/arduino-inline-assembly-tutorail-9-branching/
https://ucexperiment.wordpress.com/2016/03/28/arduino-inline-assembly-tutorial-10-strings/
https://ucexperiment.wordpress.com/2016/03/31/arduino-inline-assembler-tutorial-11-tables/
https://ucexperiment.wordpress.com/2016/04/02/arduino-inline-assembly-tutorial-12-functions/
https://ucexperiment.wordpress.com/2016/04/05/arduino-inline-assembler-tutorial-13-interrupts/
https://ucexperiment.wordpress.com/2016/04/06/arduino-inline-assembly-tutorial-14-examples/
https://ucexperiment.wordpress.com/2016/04/06/arduino-inline-assembly-port-pin-compendium/
https://ucexperiment.wordpress.com/2016/05/21/my-cup-overflows/
https://ucexperiment.wordpress.com/2016/11/06/using-atmel-studio-for-arduino-development/
https://ucexperiment.wordpress.com/2016/11/06/atmel-studio-does-blink-in-assembly-language/
dans https://ucexperiment.wordpress.com/2016/04/02/arduino-inline-assembly-tutorial-12-functions/
* Arguments are allocated left to right, starting in register r25 descending through register r8. All arguments are aligned to start in even-numbered registers (odd-sized arguments, like char, have one free register above them), for example, a single 8-bit value is passed via the r24 register (r25 is assumed empty), a single 16-bit value is passed via the r25:r24 register pair, and a 32-bit value would be passed via r25:r24:r23:r22 register combination.
Return values are expected to be passed in a similar fashion. An 8-bit value is passed via r24, a 16-bit value in r25:r24, and 32-bits in r22:r23:r24:r25. An 8-bit return value may be zero/sign-extended to 16-bits by the called function.
* Function “call-used” registers are r18-r27, and r30-r31. Any, or all of these registers may be allocated by the compiler for local data. However, we may use them freely in assembler subroutines. Calling C subroutines can clobber any of them, and the caller is responsible for saving and restoring before and after use.
* Function “call-saved” registers are r2-r17, and r28-r29. They may also be allocated by the compiler for local data, but C subroutines leaves them unchanged. Assembler subroutines are responsible for saving and restoring any of these registers, if changed. The Y register pair (r29:r28) is used as a frame pointer (pointing to local data placed on the stack) if necessary.
* Fixed registers, r0, and r1 are never allocated by the compiler for local data. The temporary register, r0 can be clobbered by any C code (except interrupt handlers which save it), and may be used freely. The zero register is r1, and assumed to be always zero in any C code. It may be used for other purposes within a piece of assembler code, but must then be cleared after use (clr r1). Interrupt handlers save and clear r1 on entry, and restore r1 on exit (in case it was non-zero).
=====assembleur AVR=====
jeu d'instruction etc:
http://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf#page=18
http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf#PAGE=22
désassemblage (voir page: https://bvdp.inetdoc.net/wiki/doku.php?id=desassemblage_arduino )
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump -d /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o > ~/test_disassembly.cpp.asm
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump -d ./cesi1.ino.cpp.o > ./test_disassembly.cpp.asm
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-objdump -d ./cesi1.ino.cpp.o > ./test_disassembly.cpp.asm
Linking everything together...
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-gcc -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o /tmp/arduino_build_319925/libraries/Wire/Wire.cpp.o /tmp/arduino_build_319925/libraries/Wire/utility/twi.c.o /tmp/arduino_build_319925/../arduino_cache_377812/core/core_arduino_avr_uno_7c971292e96a0aa19cbc2b17540b3549.a -L/tmp/arduino_build_319925 -lm
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/cesi1.ino.eep
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/cesi1.ino.hex
Utilisation de la bibliothèque Wire version 1.0 dans le dossier: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-size -A /tmp/arduino_build_319925/cesi1.ino.elf
Le croquis utilise 4124 octets (12%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 410 octets (20%) de mémoire dynamique, ce qui laisse 1638 octets pour les variables locales. Le maximum est de 2048 octets.
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avrdude -C/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:/tmp/arduino_build_319925/cesi1.ino.hex:i
cd /tmp/arduino_build_319925/
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump -d ./cesi1.ino.elf > ./test_disassembly.cpp.asm
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump -d ./core/main.cpp.o > ./test_disassembly.cpp.asm
file /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o
/tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o: ELF 32-bit LSB relocatable, Atmel AVR 8-bit, version 1 (SYSV), not stripped
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump -S -s -g -e -t -D /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o > ~/test_disassembly.cpp.asm && gedit ~/test_disassembly.cpp.asm &
/usr/share/arduino/hardware/tools/avr/bin/avr-objdump --help
Usage: /usr/share/arduino/hardware/tools/avr/bin/avr-objdump
/home/bvandepo/Téléchargements/arduino-1.8.13/arduino-builder -dump-prefs -logger=machine -hardware /home/bvandepo/Téléchargements/arduino-1.8.13/hardware -hardware /home/bvandepo/.arduino15/packages -tools /home/bvandepo/Téléchargements/arduino-1.8.13/tools-builder -tools /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -tools /home/bvandepo/.arduino15/packages -built-in-libraries /home/bvandepo/Téléchargements/arduino-1.8.13/libraries -libraries /home/bvandepo/Arduino/libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path /tmp/arduino_build_319925 -warnings=none -build-cache /tmp/arduino_cache_377812 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.arduinoOTA.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avr-gcc.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -verbose /home/bvandepo/Arduino/cesi1/cesi1.ino
/home/bvandepo/Téléchargements/arduino-1.8.13/arduino-builder -compile -logger=machine -hardware /home/bvandepo/Téléchargements/arduino-1.8.13/hardware -hardware /home/bvandepo/.arduino15/packages -tools /home/bvandepo/Téléchargements/arduino-1.8.13/tools-builder -tools /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -tools /home/bvandepo/.arduino15/packages -built-in-libraries /home/bvandepo/Téléchargements/arduino-1.8.13/libraries -libraries /home/bvandepo/Arduino/libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path /tmp/arduino_build_319925 -warnings=none -build-cache /tmp/arduino_cache_377812 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.arduinoOTA.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avr-gcc.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr -verbose /home/bvandepo/Arduino/cesi1/cesi1.ino
Using board 'uno' from platform in folder: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr
Using core 'arduino' from platform in folder: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr
Detecting libraries used...
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/cores/arduino -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/variants/standard /tmp/arduino_build_319925/sketch/cesi1.ino.cpp -o /dev/null -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for Wire.h: [Wire@1.0]
ResolveLibrary(Wire.h)
-> candidates: [Wire@1.0]
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/cores/arduino -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/variants/standard -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire/src /tmp/arduino_build_319925/sketch/cesi1.ino.cpp -o /dev/null -DARDUINO_LIB_DISCOVERY_PHASE
Using cached library dependencies for file: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire/src/Wire.cpp
Using cached library dependencies for file: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire/src/utility/twi.c
Generating function prototypes...
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/cores/arduino -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/variants/standard -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire/src /tmp/arduino_build_319925/sketch/cesi1.ino.cpp -o /tmp/arduino_build_319925/preproc/ctags_target_for_gcc_minus_e.cpp -DARDUINO_LIB_DISCOVERY_PHASE
/home/bvandepo/Téléchargements/arduino-1.8.13/tools-builder/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino_build_319925/preproc/ctags_target_for_gcc_minus_e.cpp
Compilation du croquis...
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/cores/arduino -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/variants/standard -I/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire/src /tmp/arduino_build_319925/sketch/cesi1.ino.cpp -o /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o
Compiling libraries...
Compiling library "Wire"
Utilisation du fichier déjà compilé : /tmp/arduino_build_319925/libraries/Wire/Wire.cpp.o
Utilisation du fichier déjà compilé : /tmp/arduino_build_319925/libraries/Wire/utility/twi.c.o
Compiling core...
Using precompiled core: /tmp/arduino_cache_377812/core/core_arduino_avr_uno_7c971292e96a0aa19cbc2b17540b3549.a
Linking everything together...
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-gcc -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/sketch/cesi1.ino.cpp.o /tmp/arduino_build_319925/libraries/Wire/Wire.cpp.o /tmp/arduino_build_319925/libraries/Wire/utility/twi.c.o /tmp/arduino_build_319925/../arduino_cache_377812/core/core_arduino_avr_uno_7c971292e96a0aa19cbc2b17540b3549.a -L/tmp/arduino_build_319925 -lm
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/cesi1.ino.eep
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/arduino_build_319925/cesi1.ino.elf /tmp/arduino_build_319925/cesi1.ino.hex
Utilisation de la bibliothèque Wire version 1.0 dans le dossier: /home/bvandepo/Téléchargements/arduino-1.8.13/hardware/arduino/avr/libraries/Wire
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avr-size -A /tmp/arduino_build_319925/cesi1.ino.elf
Le croquis utilise 4124 octets (12%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 410 octets (20%) de mémoire dynamique, ce qui laisse 1638 octets pour les variables locales. Le maximum est de 2048 octets.
/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/bin/avrdude -C/home/bvandepo/Téléchargements/arduino-1.8.13/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:w:/tmp/arduino_build_319925/cesi1.ino.hex:i
-------------------------------
visual studio code
maison en bas, import arduino project, choisir le dossier du sketch
cocher use libraries installed by Arduino IDE
Import
CTRL+ALT+B
il faut avoir #include
"Building in release mode"
ajout de la génération du disassembly avec platformIO: https://www.youtube.com/watch?v=XtB2eWMf6Bw&ab_channel=EricPeronnin
fichier à charger et adapter les chemins: http://www.geii.eu/index.php?option=com_content&view=article&id=243&Itemid=953
asmdump.py à mettre dans le même dossier que /home/bvandepo/Documents/PlatformIO/Projects/211011-210535-uno/platformio.ini
Import("env", "projenv")
# Ajout de l'option -g aux indicateurs du linker pour obtenir le code source dans le fichier elf.
env.Append(LINKFLAGS=["-g"])
# Ajout d'un outil dans le menu Custom de PIO
env.AddCustomTarget(
"asm_dump",
"$BUILD_DIR/${PROGNAME}.elf",
"/home/bvandepo/.platformio/packages/toolchain-atmelavr/avr/bin/objdump -D -S $BUILD_DIR/${PROGNAME}.elf > $BUILD_DIR/${PROGNAME}.asm",
"Dump ELF to ASM",
"Dump de firmware.elf vers firmware.asm (source + ASM résultant de la compilation)."
)
# Fonction de call back pour extraire le code asm compilé avec le code source
def asmAvecSourceCB(source, target, env):
print("Dump firmware.elf ...")
env.Execute("/home/bvandepo/.platformio/packages/toolchain-atmelavr/avr/bin/objdump -D -S $BUILD_DIR/${PROGNAME}.elf > $BUILD_DIR/${PROGNAME}.asm")
# do some actions
# Ajout d'une fonction de call back a exécuté lorsque le fichier firmware.elf est créé.
env.AddPostAction("$BUILD_DIR/${PROGNAME}.elf", asmAvecSourceCB)
note: on peut le faire de manière automatique via copie dans le dossier: ~/Documents/PlatformIO/Projects/211011-210535-uno/
ajouter à la fin de platformio.ini
extra_scripts = asmdump.py
note: on peut le faire de manière automatique via ajout dans le dossier: ~/Documents/PlatformIO/Projects/211011-210535-uno/
lors de l'import d'un projet arduino, platform io DUPLIQUE le fichier pour en faire un projet dans son arborescence propre
/home/bvandepo/Documents/PlatformIO/Projects/211011-210535-uno/src/cesi1.ino
cliquer sur le fichier .ino puis CTRL+ALT+B le fichier firmware.asm apparai sous uno->src
ca fonctionne mais..
j'ai tenté de mettre la fonction Traitement dans une paire de fichiers .h/.cpp
bvandepo@rapid:~/Documents/PlatformIO/Projects/211011-210535-uno$ ll src
total 20
drwxrwxr-x 2 bvandepo bvandepo 4096 oct. 11 21:19 ./
drwxrwxr-x 8 bvandepo bvandepo 4096 oct. 11 21:23 ../
-rw-rw-r-- 1 bvandepo bvandepo 4219 oct. 11 21:18 cesi1.ino
-rw-rw-r-- 1 bvandepo bvandepo 263 oct. 11 21:18 traitement.cpp
bvandepo@rapid:~/Documents/PlatformIO/Projects/211011-210535-uno$ ll include/
total 16
drwxrwxr-x 2 bvandepo bvandepo 4096 oct. 11 21:17 ./
drwxrwxr-x 8 bvandepo bvandepo 4096 oct. 11 21:23 ../
-rw-rw-r-- 1 bvandepo bvandepo 1386 oct. 11 21:05 README
-rw-rw-r-- 1 bvandepo bvandepo 49 oct. 11 21:18 traitement.h
mais à cause de l'optimisation, la fonction est inlinée et n'apparait donc pas...
return (valeur+51)%4;
f5c: 68 2f mov r22, r24
f5e: 70 e0 ldi r23, 0x00 ; 0
f60: 6d 5c subi r22, 0xCD ; 205
f62: 7f 4f sbci r23, 0xFF ; 255
f64: 63 70 andi r22, 0x03 ; 3
f66: 77 27 eor r23, r23
mettre plutot des commentaires:
unsigned char TraiteDonnee(unsigned char valeur)
{
//début du code à tester
return (valeur+51)%4;
//fin du code à tester
}
puis rechercher dans le fichier asm: la chaine début du code à tester
conversion binaire -> ascii pour 0 à 9:
unsigned char TraiteDonnee(unsigned char valeur)
{
//début du code à tester
// __asm__("andi r24,0x0F\n\t");
//ne marche pas seul car le compilateur ne voit pas de return et l'optim dégage le code assembleur...
//https://ucexperiment.wordpress.com/2016/04/02/arduino-inline-assembly-tutorial-12-functions/
//unsigned char len;
asm (
"andi %0, 0xf \n ori %0, 0x30 \n"
: "+r" (valeur)
);
return valeur;
//fin du code à tester
}
TODO: voir si on peut desactiver l'optimisation de gcc...
=====Application ASM WS2812====
/*
* light weight WS2812 lib V2.1 - Arduino support
*
* Controls WS2811/WS2812/WS2812B RGB-LEDs
* Author: Matthias Riegler
*
* Mar 07 2014: Added Arduino and C++ Library
*
* September 6, 2014: Added option to switch between most popular color orders
* (RGB, GRB, and BRG) -- Windell H. Oskay
*
* License: GNU GPL v2 (see License.txt)
*/
#include "WS2812.h"
#include
WS2812::WS2812(uint16_t num_leds) {
count_led = num_leds;
pixels = (uint8_t*)malloc(count_led*3);
#ifdef RGB_ORDER_ON_RUNTIME
offsetGreen = 0;
offsetRed = 1;
offsetBlue = 2;
#endif
}
cRGB WS2812::get_crgb_at(uint16_t index) {
cRGB px_value;
if(index < count_led) {
uint16_t tmp;
tmp = index * 3;
px_value.r = pixels[OFFSET_R(tmp)];
px_value.g = pixels[OFFSET_G(tmp)];
px_value.b = pixels[OFFSET_B(tmp)];
}
return px_value;
}
uint8_t WS2812::set_crgb_at(uint16_t index, cRGB px_value) {
if(index < count_led) {
uint16_t tmp;
tmp = index * 3;
pixels[OFFSET_R(tmp)] = px_value.r;
pixels[OFFSET_G(tmp)] = px_value.g;
pixels[OFFSET_B(tmp)] = px_value.b;
return 0;
}
return 1;
}
uint8_t WS2812::set_subpixel_at(uint16_t index, uint8_t offset, uint8_t px_value) {
if (index < count_led) {
uint16_t tmp;
tmp = index * 3;
pixels[tmp + offset] = px_value;
return 0;
}
return 1;
}
void WS2812::sync() {
*ws2812_port_reg |= pinMask; // Enable DDR
ws2812_sendarray_mask(pixels,3*count_led,pinMask,(uint8_t*) ws2812_port,(uint8_t*) ws2812_port_reg );
}
#ifdef RGB_ORDER_ON_RUNTIME
void WS2812::setColorOrderGRB() { // Default color order
offsetGreen = 0;
offsetRed = 1;
offsetBlue = 2;
}
void WS2812::setColorOrderRGB() {
offsetRed = 0;
offsetGreen = 1;
offsetBlue = 2;
}
void WS2812::setColorOrderBRG() {
offsetBlue = 0;
offsetRed = 1;
offsetGreen = 2;
}
#endif
WS2812::~WS2812() {
free(pixels);
}
#ifndef ARDUINO
void WS2812::setOutput(const volatile uint8_t* port, volatile uint8_t* reg, uint8_t pin) {
pinMask = (1<
/*
* light weight WS2812 lib V2.1 - Arduino support
*
* Controls WS2811/WS2812/WS2812B RGB-LEDs
* Author: Tim (cpldcpu@gmail.com)
*
* Jan 18th, 2014 v2.0b Initial Version
* March 7th, 2014 v2.1 Added option to retarget the port register during runtime
* Removes inlining to allow compiling with c++
*
* License: GNU GPL v2 (see License.txt)
*/
#include "WS2812.h"
/*
This routine writes an array of bytes with RGB values to the Dataout pin
using the fast 800kHz clockless WS2811/2812 protocol.
*/
// Timing in ns
#define w_zeropulse 350
#define w_onepulse 900
#define w_totalperiod 1250
// Fixed cycles used by the inner loop
#define w_fixedlow 3
#define w_fixedhigh 6
#define w_fixedtotal 10
// Insert NOPs to match the timing, if possible
#define w_zerocycles (((F_CPU/1000)*w_zeropulse )/1000000)
#define w_onecycles (((F_CPU/1000)*w_onepulse +500000)/1000000)
#define w_totalcycles (((F_CPU/1000)*w_totalperiod +500000)/1000000)
// w1 - nops between rising edge and falling edge - low
#define w1 (w_zerocycles-w_fixedlow)
// w2 nops between fe low and fe high
#define w2 (w_onecycles-w_fixedhigh-w1)
// w3 nops to complete loop
#define w3 (w_totalcycles-w_fixedtotal-w1-w2)
#if w1>0
#define w1_nops w1
#else
#define w1_nops 0
#endif
// The only critical timing parameter is the minimum pulse length of the "0"
// Warn or throw error if this timing can not be met with current F_CPU settings.
#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000)
#if w_lowtime>550
#error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?"
#elif w_lowtime>450
#warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)."
#warning "Please consider a higher clockspeed, if possible"
#endif
#if w2>0
#define w2_nops w2
#else
#define w2_nops 0
#endif
#if w3>0
#define w3_nops w3
#else
#define w3_nops 0
#endif
#define w_nop1 "nop \n\t"
#define w_nop2 "rjmp .+0 \n\t"
#define w_nop4 w_nop2 w_nop2
#define w_nop8 w_nop4 w_nop4
#define w_nop16 w_nop8 w_nop8
void WS2812::ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi,uint8_t *port, uint8_t *portreg)
{
uint8_t curbyte,ctr,masklo;
uint8_t sreg_prev;
masklo = ~maskhi & *port;
maskhi |= *port;
sreg_prev=SREG;
cli();
while (datlen--) {
curbyte=*data++;
asm volatile(
" ldi %0,8 \n\t"
"loop%=: \n\t"
" st X,%3 \n\t" // '1' [02] '0' [02] - re
#if (w1_nops&1)
w_nop1
#endif
#if (w1_nops&2)
w_nop2
#endif
#if (w1_nops&4)
w_nop4
#endif
#if (w1_nops&8)
w_nop8
#endif
#if (w1_nops&16)
w_nop16
#endif
" sbrs %1,7 \n\t" // '1' [04] '0' [03]
" st X,%4 \n\t" // '1' [--] '0' [05] - fe-low
" lsl %1 \n\t" // '1' [05] '0' [06]
#if (w2_nops&1)
w_nop1
#endif
#if (w2_nops&2)
w_nop2
#endif
#if (w2_nops&4)
w_nop4
#endif
#if (w2_nops&8)
w_nop8
#endif
#if (w2_nops&16)
w_nop16
#endif
" brcc skipone%= \n\t" // '1' [+1] '0' [+2] -
" st X,%4 \n\t" // '1' [+3] '0' [--] - fe-high
"skipone%=: " // '1' [+3] '0' [+2] -
#if (w3_nops&1)
w_nop1
#endif
#if (w3_nops&2)
w_nop2
#endif
#if (w3_nops&4)
w_nop4
#endif
#if (w3_nops&8)
w_nop8
#endif
#if (w3_nops&16)
w_nop16
#endif
" dec %0 \n\t" // '1' [+4] '0' [+3]
" brne loop%=\n\t" // '1' [+5] '0' [+4]
: "=&d" (ctr)
// : "r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo)
: "r" (curbyte), "x" (port), "r" (maskhi), "r" (masklo)
);
}
SREG=sreg_prev;
}