// 2023-01-05, DMW, basic blink sketch plus lots of help from online resources
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
// pinMode(LED_BUILTIN, OUTPUT);
asm volatile (
// "sbi %0, %1 \n" //pinMode(13, OUTPUT);
// sbi - Sets a specified bit in an I/O Register
"sbi %[reg], %[reg_bit] \n" //pinMode(13, OUTPUT);
: /* no return values */
: [reg] "I" (_SFR_IO_ADDR(DDRB)), [reg_bit] "I" (DDB5) /* input values */
: /* no registers clobbered */
);
}
// digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
void led_on() {
asm volatile(
"sbi %[reg], %[reg_bit] \n" // turn LED ON
: /* no return values */
: /* input values */
[reg] "I" (_SFR_IO_ADDR(PORTB)), [reg_bit] "I" (PORTB5)
/* [reg] <-- named parameter, this is the register we want to change
"I" <-- 6-bit data-type
(_SFR_IO_ADDR(PORTB)) <-- C macro expression for providing the address for PORTB
[reg_bit] <-- bit to set, named parameter, "I" <-- 6 bit value
(PORTB5) <-- port B fifth bit, which is pin 13
*/
: /* no registers clobbered */
);
}
// a lot of useful information about inline assembly and the strange
// syntax and parameters in inline asm()
// https://www.nongnu.org/avr-libc/user-manual/inline_asm.html
// digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
void led_off() {
asm volatile(
"cbi %[reg], %[reg_bit] \n" // turn LED OFF
: /* no return values */
: [reg] "I" (_SFR_IO_ADDR(PORTB)), [reg_bit] "I" (PORTB5) /* input values */
: /* no registers clobbered */
);
}
// the loop function runs over and over again forever
void loop() {
// digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
led_on();
delay(1000); // wait for a second
// digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
led_off();
delay(1000); // wait for a second
}