#pragma GCC optimize (-Og)
#include "ArduinoTrace.h"
volatile byte dato;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//PORTD=PORTD|(1<<PD4); //board pin 4 pull-up resistor
asm volatile
(
"lds r24, %0\n"
"ori r24, 0x10 \n"
"sts %0, r24"
:"=m" (PORTD)//porcentaje 1
:"0" (PORTD) //porcentaje 0 // pero no hace falta poner m nuevamente, acá se permite poner 0, es por eso que se trabajan con %0
);
}
void loop() {
// put your main code here, to run repeatedly:
//dato=PIND&0x10; //aislar bit 4 de PIND
// asm volatile
// (
// "in r24,%0 \n" //operando 0
// "andi r24,0x10 \n"
// "sts dato,r24"
// :
// :"I" (_SFR_IO_ADDR(PIND)) //constante del operando 0, estan entre 0 y 63
// //entrada-salida con direccion 0x09,busca la direccion del puerto dado.
// );
asm volatile
(
"lds r24,%0 \n"
"andi r24,0x10 \n"
"sts dato, r24"
:
: "m" (PIND)
);
if(dato==0) //si pulsador oprimido (bit 4 de PIND en 0)
{
//PORTB=PORTB|(1<<PB0); //led on
// asm volatile
// (
// "sbi %0, 0"
// :
// :"I" (_SFR_IO_ADDR(PORTB))//busca la direccion del puerto B, para colocar el bit 0 de ese puerto en 1
// );
asm volatile
(
"lds r24, %1 \n"
"ori r24, 0x01 \n"
"sts %0, r24"
:"=m" (PORTD) //destino, entrada
:"m" (PORTD) //puente, que se le guarda, salida
);
}
else //sino:
{
//PORTB=PORTB&~(1<<PB0); //led off
asm volatile
(
"cbi %0, 0"
:
:"I" (_SFR_IO_ADDR(PORTB)) //la misma vaina de arriba
);
}
}