#define red 13
#define amber 12
#define green 11
void setup() {
Serial.begin(9600);
pinMode(red, OUTPUT);
pinMode(amber, OUTPUT);
pinMode(green, OUTPUT);
digitalWrite(red, HIGH); // Start with red light
}
void loop() {
if (Serial.available() > 0) {
char received = Serial.read();
if (received == 'a') {
Serial.println("Caution");
// Assembly language block for more efficient light control
asm volatile(
"ldi %[delay_value], 200 ; Set delay value to 200\n"
"sbi %[port_amber], %[pin_amber] ; Turn on amber light\n"
"call delay_func ; Call delay function\n"
"cbi %[port_red], %[pin_red] ; Turn off red light\n"
"cbi %[port_amber], %[pin_amber] ; Turn off amber light\n"
"sbi %[port_green], %[pin_green] ; Turn on green light\n"
"call delay_func ; Call delay function\n"
"sbi %[port_amber], %[pin_amber] ; Turn on amber light\n"
"cbi %[port_green], %[pin_green] ; Turn off green light\n"
"call delay_func ; Call delay function\n"
"cbi %[port_amber], %[pin_amber] ; Turn off amber light\n"
"sbi %[port_red], %[pin_red] ; Turn on red light\n"
"call delay_func ; Call delay function\n"
"rjmp end_assembly ; Jump to the end of the assembly block\n"
"delay_func: ; Delay function label\n"
"dec %[delay_value] ; Decrement delay_value\n"
"brne delay_func ; Repeat delay_func if delay_value is not zero\n"
"ret ; Return from delay_func\n"
"end_assembly: ; End of assembly block\n"
:
: [port_red] "I" (_SFR_IO_ADDR(PORTB)), [pin_red] "I" (PORTB5),
[port_amber] "I" (_SFR_IO_ADDR(PORTB)), [pin_amber] "I" (PORTB4),
[port_green] "I" (_SFR_IO_ADDR(PORTB)), [pin_green] "I" (PORTB3),
[delay_value] "r" (0) // Corrected specification for %[delay_value]
);
Serial.println("RED light is on");
Serial.println("---------------------------------");
}
}
}