701 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			HTML
		
	
	
			
		
		
	
	
			701 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			HTML
		
	
	
<!DOCTYPE html>
 | 
						|
<html lang="en">
 | 
						|
  <head>
 | 
						|
    <meta charset="utf-8" />
 | 
						|
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
 | 
						|
 | 
						|
    <title></title>
 | 
						|
    <link rel="stylesheet" href="dist/reveal.css" />
 | 
						|
    <link rel="stylesheet" href="dist/theme/night.css" id="theme" />
 | 
						|
    <link rel="stylesheet" href="plugin/highlight/zenburn.css" />
 | 
						|
	<link rel="stylesheet" href="css/layout.css" />
 | 
						|
	<link rel="stylesheet" href="plugin/customcontrols/style.css">
 | 
						|
 | 
						|
	<link rel="stylesheet" href="plugin/reveal-pointer/pointer.css" />
 | 
						|
 | 
						|
 | 
						|
    <script defer src="dist/fontawesome/all.min.js"></script>
 | 
						|
 | 
						|
	<script type="text/javascript">
 | 
						|
		var forgetPop = true;
 | 
						|
		function onPopState(event) {
 | 
						|
			if(forgetPop){
 | 
						|
				forgetPop = false;
 | 
						|
			} else {
 | 
						|
				parent.postMessage(event.target.location.href, "app://obsidian.md");
 | 
						|
			}
 | 
						|
        }
 | 
						|
		window.onpopstate = onPopState;
 | 
						|
		window.onmessage = event => {
 | 
						|
			if(event.data == "reload"){
 | 
						|
				window.document.location.reload();
 | 
						|
			}
 | 
						|
			forgetPop = true;
 | 
						|
		}
 | 
						|
 | 
						|
		function fitElements(){
 | 
						|
			const itemsToFit = document.getElementsByClassName('fitText');
 | 
						|
			for (const item in itemsToFit) {
 | 
						|
				if (Object.hasOwnProperty.call(itemsToFit, item)) {
 | 
						|
					var element = itemsToFit[item];
 | 
						|
					fitElement(element,1, 1000);
 | 
						|
					element.classList.remove('fitText');
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		function fitElement(element, start, end){
 | 
						|
 | 
						|
			let size = (end + start) / 2;
 | 
						|
			element.style.fontSize = `${size}px`;
 | 
						|
 | 
						|
			if(Math.abs(start - end) < 1){
 | 
						|
				while(element.scrollHeight > element.offsetHeight){
 | 
						|
					size--;
 | 
						|
					element.style.fontSize = `${size}px`;
 | 
						|
				}
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			if(element.scrollHeight > element.offsetHeight){
 | 
						|
				fitElement(element, start, size);
 | 
						|
			} else {
 | 
						|
				fitElement(element, size, end);
 | 
						|
			}		
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		document.onreadystatechange = () => {
 | 
						|
			fitElements();
 | 
						|
			if (document.readyState === 'complete') {
 | 
						|
				if (window.location.href.indexOf("?export") != -1){
 | 
						|
					parent.postMessage(event.target.location.href, "app://obsidian.md");
 | 
						|
				}
 | 
						|
				if (window.location.href.indexOf("print-pdf") != -1){
 | 
						|
					let stateCheck = setInterval(() => {
 | 
						|
						clearInterval(stateCheck);
 | 
						|
						window.print();
 | 
						|
					}, 250);
 | 
						|
				}
 | 
						|
			}
 | 
						|
	};
 | 
						|
 | 
						|
 | 
						|
        </script>
 | 
						|
  </head>
 | 
						|
  <body>
 | 
						|
    <div class="reveal">
 | 
						|
      <div class="slides"><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
# Rust en Arduino: La manera díficil
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="Pasted image 20221208231749.png" alt="" style="width: 300px; object-fit: fill">
 | 
						|
 | 
						|
## Kirbylife (Gabriel)
 | 
						|
 | 
						|
Ingeniero de software en Intel  
 | 
						|
Programo en Python 🐍 por comida y en Rust 🦀 por dopamina.
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Preparación del ambiente
 | 
						|
1. avr-gcc
 | 
						|
2. avr-bintuils
 | 
						|
3. avr-dude
 | 
						|
4. avr-atmel328p.json
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
Notación numérica
 | 
						|
 | 
						|
| Prefijo | Sistema     | Ejemplo        |
 | 
						|
| ------- | ----------- | -------------- |
 | 
						|
| 0x      | Hexadecimal | **0x**25 = 37      |
 | 
						|
|         |             | **0x**FF = 255     |
 | 
						|
| 0b      | Binario     | **0b**101 = 5      |
 | 
						|
|         |             | **0b**1010101 = 85 |
 | 
						|
| \<Nada> | Decimal     | 10, 5, 240     |
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Registros
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="arduino_secciones2.jpg" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
Cada sección de pines tiene asignados 3 registros:
 | 
						|
- Registro de control
 | 
						|
- Registro de OUTPUTs
 | 
						|
- Registro de INPUTs
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Ejemplo:
 | 
						|
- Se hará con la 3ra sección de pines
 | 
						|
- El registro de control será el AA
 | 
						|
- El registro de OUTPUTs será el AB
 | 
						|
- El registro de INPUTs será el AC
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```
 | 
						|
OUTPUT = 1
 | 
						|
INPUT = 0
 | 
						|
```
 | 
						|
<img src="Pasted image 20221124222324.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```
 | 
						|
Registro        Binario          Decimal        Hexadecimal  
 | 
						|
   AA          0b00001111          15               0x0f
 | 
						|
```
 | 
						|
 | 
						|
<img src="Pasted image 20221124223245.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```
 | 
						|
Registro        Binario          Decimal        Hexadecimal  
 | 
						|
   AB          0b00000001           1               0x01
 | 
						|
```
 | 
						|
<img src="Pasted image 20221124225301.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
| Operación | Registro | Valor      |
 | 
						|
| --------- | -------- | ---------- |
 | 
						|
| Escribir  | AA       | 0b00001111 |
 | 
						|
| Escribir  | AB       | 0b00000001 |
 | 
						|
| Leer      | AC       | 0b00100000 |
 | 
						|
 | 
						|
<img src="Pasted image 20221124235204.png" alt="" style="width: 400px; object-fit: fill">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## main.rs
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#![no_std]
 | 
						|
#![no_main]
 | 
						|
 | 
						|
#[no_mangle]
 | 
						|
pub extern "C" fn main() {}
 | 
						|
 | 
						|
#[panic_handler]
 | 
						|
fn panic(_info: &::core::panic::PanicInfo) -> ! {
 | 
						|
    loop {}
 | 
						|
}
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#![no_std]
 | 
						|
#![no_main]
 | 
						|
```
 | 
						|
\---
 | 
						|
-  `#![no_std]`: Evita que se incluya la biblioteca estándar
 | 
						|
-  `#![no_main]`: Delega a la persona que programa el punto de entrada
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#[no_mangle]
 | 
						|
pub fn extern "C" main() {
 | 
						|
} 
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#[no_mangle]
 | 
						|
```
 | 
						|
Sin `no_mangle`:
 | 
						|
<img src="Pasted image 20221120225932.png" alt="" style="object-fit: scale-down">
 | 
						|
 | 
						|
Con `no_mangle`:
 | 
						|
<img src="Pasted image 20221120230036.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
pub fn extern "C" main() {}
 | 
						|
```
 | 
						|
- `pub`: Indica que esa función puede ser accedida fuera del `main.rs`
 | 
						|
- `extern "C"`: Indica que esa función utilizará el ABI de C
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#[panic_handler]
 | 
						|
fn panic(_info: &::core::panic::PanicInfo) -> ! {
 | 
						|
    loop {}
 | 
						|
}
 | 
						|
```
 | 
						|
- `#[panic_handler]`: Le indica al compilador que esa función sea la que se ejecuta cuando suceda un `panic!`
 | 
						|
- `core::panic::PanicInfo`: Contiene la información del `panic!` en cuestión
 | 
						|
- `!`: Le indica al compilador que esa función será infinita
 | 
						|
- `loop`: Ciclo infinito del que no se puede salir hasta reiniciar
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Cargo.toml
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```toml
 | 
						|
[profile.release]
 | 
						|
lto = true
 | 
						|
panic = "abort"
 | 
						|
```
 | 
						|
- `lto = true`:  Optimización del linker (workarround por un bug en LLVM)
 | 
						|
- `panic = "abourt"`: Coloca un `eh_personality` genérico que no tiene ningún efecto
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Compilación
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
`cargo build -Z build-std=core --target avr-atmega328p.json --release`  
 | 
						|
\---
 | 
						|
- `-Z build-std=core`: Indica al compilador que agregue el crate `core`
 | 
						|
- `--target avr-atmega328p.json`:  Indica que se hara compilación cruzada
 | 
						|
- `--release`: Se compilará con el perfil release
 | 
						|
 | 
						|
\---
 | 
						|
###### \*Debe hacerse con la versión nocturna
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="2022-11-22--1669097803_1358x141_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Especificaciones del ATmega328p
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="Pasted image 20221122232816.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### 3 tipos de regitros
 | 
						|
1. DDR (Data Direction Register): Indican en que modo está cada pin
 | 
						|
2. PORT: Contiene la propia información de salida (el de escritura)
 | 
						|
3. PIN: Contiene la propia información de entrada (el de lectura)
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Contruir el nombre de un pin:  
 | 
						|
`{Registro}{Letra indicativa}{N° de pin}`  
 | 
						|
#### Exemplos:  
 | 
						|
| Con Registros | En processing      |
 | 
						|
| ------------- | ------------------ |
 | 
						|
| PORTC5        | A5                 |
 | 
						|
| DDRB2         | 10                 |
 | 
						|
| PIND6         | 6                  |
 | 
						|
| PORTD         | Del 0 al 7         |
 | 
						|
| PORTB5        | Led incrustrado 💡 |
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="Pasted image 20221213120624.png" alt="" style="object-fit: scale-down">
 | 
						|
 | 
						|
`PORTB = 0x25`  
 | 
						|
`DDRB = 0x24`  
 | 
						|
`PINB = 0x23`
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
use core::ptr::{read_volatile, write_volatile};
 | 
						|
 | 
						|
const DDRB: *mut u8 = 0x24 as *mut u8;
 | 
						|
const PORTB: *mut u8 = 0x25 as *mut u8;
 | 
						|
 | 
						|
#[no_mangle]
 | 
						|
pub extern "C" fn main() {
 | 
						|
    unsafe { write_volatile(DDRB, 0b11111111) };
 | 
						|
    unsafe { write_volatile(PORTB, 0b00100000) };
 | 
						|
}
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
Coloca todos los pines de la sección B en modo OUTPUT:
 | 
						|
```Rust
 | 
						|
                                76543210
 | 
						|
unsafe { write_volatile(DDRB, 0b11111111) };
 | 
						|
```
 | 
						|
 | 
						|
Pone voltaje alto en el pin 5 de la sección B:
 | 
						|
```Rust
 | 
						|
                                 76543210
 | 
						|
unsafe { write_volatile(PORTB, 0b00100000) };
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Compilando
 | 
						|
<img src="2022-11-22--1669182946_1084x249_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## ¿Cómo subir el resultado al Arduino?
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="2022-11-23--1669183468_622x338_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
 | 
						|
Arduino IDE > Herramientas > Puerto > "Arduino UNO".
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Convertir el .elf a un .hex
 | 
						|
```Bash
 | 
						|
avr-objcopy -O ihex -R .eeprom path/al/archivo.elf <output>.hex
 | 
						|
```
 | 
						|
<img src="2022-11-23--1669183799_769x60_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Subir el archivo .hex
 | 
						|
```Bash
 | 
						|
avrdude -p atmega328p -c arduino -P <puerto> -U flash:w:<archivo.hex>:i
 | 
						|
```
 | 
						|
<img src="2022-11-23--1669184095_683x461_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="Pasted image 20221123195630.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
pub extern "C" fn main() {
 | 
						|
    unsafe { write_volatile(DDRB, 0b11111111) };
 | 
						|
    unsafe { write_volatile(PORTB, 0b00000000) };
 | 
						|
}
 | 
						|
```
 | 
						|
<img src="Pasted image 20221123195956.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## std::thread\::sleep??
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="Pasted image 20221123224248.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#![feature(asm_experimental_arch)]
 | 
						|
 | 
						|
use core::arch::asm;
 | 
						|
 | 
						|
const CPU_SPEED: u32 = 16_000_000;
 | 
						|
 | 
						|
fn sleep(time: u32) {
 | 
						|
    for _ in 0..(CPU_SPEED / 10 * time) {
 | 
						|
        unsafe { asm!("nop") }
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="2022-11-23--1669265981_1028x627_scrot.png" alt="" style="object-fit: scale-down">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#[no_mangle]
 | 
						|
pub extern "C" fn main() -> ! {
 | 
						|
    unsafe { write_volatile(DDRB, 0b11111111) };
 | 
						|
 | 
						|
    loop {
 | 
						|
        unsafe { write_volatile(PORTB, 0b00000000) };
 | 
						|
        sleep(1);
 | 
						|
        unsafe { write_volatile(PORTB, 0b00100000) };
 | 
						|
        sleep(1);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn sleep(time: u32) { ... }
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
#[no_mangle]
 | 
						|
loop {
 | 
						|
    let mut portb_value = unsafe { read_volatile(PORTB) };
 | 
						|
    portb_value = portb_value ^ ( 1 << 5 );
 | 
						|
    unsafe { write_volatile(PORTB, portb_value) };
 | 
						|
    sleep(1);
 | 
						|
}
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Operador XOR (^)
 | 
						|
| Entrada A | Entrada B | Salida |
 | 
						|
| --------- | --------- | ------ |
 | 
						|
| 0         | 0         | 0      |
 | 
						|
| 0         | 1         | 1      |
 | 
						|
| 1         | 0         | 1      |
 | 
						|
| 1         | 1         | 0      |
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Operador shift left ( << )
 | 
						|
| Entrada A | Entrada B | Salida     |
 | 
						|
| --------- | --------- | ---------- |
 | 
						|
| 0b1       | 2         | 0b100      |
 | 
						|
| 0b101     | 5         | 0b10100000 |
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
Compilamos, convertimos, subimos y...   
 | 
						|
✨`\._.\ \._./ /._./`✨
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## PEEEEERO
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
##  ✨ HAL ✨
 | 
						|
#### (Capa de abstracción de hardware)
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### embedded-hal 🤖
 | 
						|
```Rust
 | 
						|
trait OutputPin {
 | 
						|
    fn set_high();
 | 
						|
    fn set_low();
 | 
						|
    fn toggle();
 | 
						|
    ...
 | 
						|
}
 | 
						|
 | 
						|
trait InputPin {
 | 
						|
    fn is_low() -> bool;
 | 
						|
    fn is_high() -> bool;
 | 
						|
}
 | 
						|
 | 
						|
SpiDevice, I2c, Serial, UART, Delay, etc...
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Biblioteca 📜
 | 
						|
```Rust
 | 
						|
fn blink(pin: &mut OutputPin, delay: &mut DelayUs) -> ! {
 | 
						|
    pin.set_high();
 | 
						|
    loop {
 | 
						|
	    pin.toggle();
 | 
						|
	    delay.delay_ms(1000);
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
###### solo para fines ilustrativos, no sirve este código
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### arduino-hal ⚡
 | 
						|
```Rust
 | 
						|
struct Pin {
 | 
						|
    ddr: *mut u8;
 | 
						|
    port: *mut u8;
 | 
						|
    number: u8;
 | 
						|
}
 | 
						|
 | 
						|
impl embedded_hal::OutputPin for Pin {
 | 
						|
    fn set_high(&self) {
 | 
						|
	    let mut pin_value = unsafe { read_volatile(self.port) };
 | 
						|
	    pin_value = pin_value | (1 << self.number);
 | 
						|
	    unsafe { write_volatile(self.port, pin_value) };
 | 
						|
    }
 | 
						|
	fn set_low(&self) { ... }
 | 
						|
	fn set_toggle(&self) { ... }
 | 
						|
}
 | 
						|
```
 | 
						|
###### solo para fines ilustrativos, no sirve este código
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
### Firmware 💻
 | 
						|
```Rust
 | 
						|
#[arduino_hal::entry]
 | 
						|
fn main() -> ! {
 | 
						|
	let mut led_pin = arduino_hal::pins::B5;
 | 
						|
	led_pin.set_output();
 | 
						|
 | 
						|
	blink::blink(led_pin);
 | 
						|
}
 | 
						|
```
 | 
						|
###### solo para fines ilustrativos, no sirve este código
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
<img src="diagrama-hal.png" alt="" style="width: 600px; object-fit: fill">
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
```Rust
 | 
						|
use panic_halt as _;
 | 
						|
 | 
						|
#[arduino_hal::entry]
 | 
						|
fn main() -> ! {
 | 
						|
    let peripherals = arduino_hal::Peripherals::take().unwrap();
 | 
						|
    let pins = arduino_hal::pins!(peripherals);
 | 
						|
 | 
						|
    let mut led = pins.d13.into_output();
 | 
						|
    led.set_high();
 | 
						|
 | 
						|
    loop {
 | 
						|
        led.toggle();
 | 
						|
        delay_ms(1000);
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
Compilamos, convertimos, subimos y...   
 | 
						|
✨`\._.\ \._./ /._./`✨  
 | 
						|
(De nuevo)
 | 
						|
</div></script></section><section  data-markdown><script type="text/template"><!-- .slide: class="drop" -->
 | 
						|
<div class="" style="position: absolute; left: 0px; top: 0px; height: 700px; width: 960px; min-height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center" absolute="true">
 | 
						|
 | 
						|
## Mis redes :)
 | 
						|
 | 
						|
**Telegram:** @kirbylife  
 | 
						|
**Mastodon:** @kirbylife\@mstdn.mx  
 | 
						|
**Twitter:** @kirbylife  
 | 
						|
**e-mail:** hola\@kirbylife.dev  
 | 
						|
 | 
						|
**Repositorio:** https:\//gitlab.com/kirbylife/arduino_blinkrs
 | 
						|
</div></script></section></div>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <script src="dist/reveal.js"></script>
 | 
						|
 | 
						|
    <script src="plugin/markdown/markdown.js"></script>
 | 
						|
    <script src="plugin/highlight/highlight.js"></script>
 | 
						|
    <script src="plugin/zoom/zoom.js"></script>
 | 
						|
    <script src="plugin/notes/notes.js"></script>
 | 
						|
    <script src="plugin/math/math.js"></script>
 | 
						|
	<script src="plugin/mermaid/mermaid.js"></script>
 | 
						|
	<script src="plugin/chart/chart.min.js"></script>
 | 
						|
	<script src="plugin/chart/plugin.js"></script>
 | 
						|
	<script src="plugin/customcontrols/plugin.js"></script>
 | 
						|
	<script src="plugin/reveal-pointer/pointer.js"></script>
 | 
						|
 | 
						|
    <script>
 | 
						|
      function extend() {
 | 
						|
        var target = {};
 | 
						|
        for (var i = 0; i < arguments.length; i++) {
 | 
						|
          var source = arguments[i];
 | 
						|
          for (var key in source) {
 | 
						|
            if (source.hasOwnProperty(key)) {
 | 
						|
              target[key] = source[key];
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
        return target;
 | 
						|
      }
 | 
						|
 | 
						|
	  function isLight(color) {
 | 
						|
		let hex = color.replace('#', '');
 | 
						|
 | 
						|
		// convert #fff => #ffffff
 | 
						|
		if(hex.length == 3){
 | 
						|
			hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}`;
 | 
						|
		}
 | 
						|
 | 
						|
		const c_r = parseInt(hex.substr(0, 2), 16);
 | 
						|
		const c_g = parseInt(hex.substr(2, 2), 16);
 | 
						|
		const c_b = parseInt(hex.substr(4, 2), 16);
 | 
						|
		const brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
 | 
						|
		return brightness > 155;
 | 
						|
	}
 | 
						|
 | 
						|
	var bgColor = getComputedStyle(document.documentElement).getPropertyValue('--r-background-color').trim();
 | 
						|
	var isLight = isLight(bgColor);
 | 
						|
 | 
						|
	if(isLight){
 | 
						|
		document.body.classList.add('has-light-background');
 | 
						|
	} else {
 | 
						|
		document.body.classList.add('has-dark-background');
 | 
						|
	}
 | 
						|
 | 
						|
      // default options to init reveal.js
 | 
						|
      var defaultOptions = {
 | 
						|
        controls: true,
 | 
						|
        progress: true,
 | 
						|
        history: true,
 | 
						|
        center: true,
 | 
						|
        transition: 'default', // none/fade/slide/convex/concave/zoom
 | 
						|
        plugins: [
 | 
						|
          RevealMarkdown,
 | 
						|
          RevealHighlight,
 | 
						|
          RevealZoom,
 | 
						|
          RevealNotes,
 | 
						|
          RevealMath.MathJax3,
 | 
						|
		  RevealMermaid,
 | 
						|
		  RevealChart,
 | 
						|
		  RevealCustomControls,
 | 
						|
	      RevealPointer,
 | 
						|
        ],
 | 
						|
 | 
						|
 | 
						|
    	allottedTime: 120 * 1000,
 | 
						|
 | 
						|
		mathjax3: {
 | 
						|
			mathjax: 'plugin/math/mathjax/tex-mml-chtml.js',
 | 
						|
		},
 | 
						|
		markdown: {
 | 
						|
		  gfm: true,
 | 
						|
		  mangle: true,
 | 
						|
		  pedantic: false,
 | 
						|
		  smartLists: false,
 | 
						|
		  smartypants: false,
 | 
						|
		},
 | 
						|
 | 
						|
		mermaid: {
 | 
						|
			theme: isLight ? 'default' : 'dark',
 | 
						|
		},
 | 
						|
 | 
						|
		customcontrols: {
 | 
						|
			controls: [
 | 
						|
			]
 | 
						|
		},
 | 
						|
      };
 | 
						|
 | 
						|
      // options from URL query string
 | 
						|
      var queryOptions = Reveal().getQueryHash() || {};
 | 
						|
 | 
						|
      var options = extend(defaultOptions, {"width":960,"height":700,"margin":0.04,"controls":true,"progress":true,"slideNumber":false,"transition":"slide","transitionSpeed":"default"}, queryOptions);
 | 
						|
    </script>
 | 
						|
 | 
						|
    <script>
 | 
						|
      Reveal.initialize(options);
 | 
						|
    </script>
 | 
						|
  </body>
 | 
						|
 | 
						|
  <!-- created with Advanced Slides -->
 | 
						|
</html>
 |