Как создать задержки на языке ассемблера AVR

Привет, я новичок в языке ассемблера AVR, поэтому я пытался получить функцию задержки для создания задержек 1 мс, 100 мкс и 1 мкс, чтобы сделать это, мне нужно выяснить, что заменить nop ниже здесь (материнская плата Arduino Uno r3 ATmega328 Спасибо.

"delay_ms%=:    nop                 ; code to replace  nop  \n"
"delay_100us%=: nop                 ; code to replace  nop  \n"
"delay_1us%=:   nop                 ; code to replace nop  \n"
"               sbiw r30,1          ; decrement ms count (r31:r30)\n"
"               brne delay_ms%=     ; loop to delay_ms while > 0  \n"
"               ret                 ; return from subroutine      \n"

Остальное ниже.

word millisecs;   
Serial.begin(9600); 
}   
void setup() asm volatile(
"          ldi r16,0x3F    ; r16 = 00111111\n"
"          out 4,r16       ; set pins 8-13 as outputs in DDRB\n" 
::: "r16");
millisecs = 1000;            // задержка мигания 1 с
Serial.begin(9600);
}
void loop() 
{
long starttime = millis();        // записываем время начала

asm volatile(
// переход к "миганию" - т.е. переход вокруг подпрограммы delay_ms
"            rjmp  blink%=        ; relative jump to 'blink' \n"
"          ldi r16,0x3F    ; r16 = 00111111\n"
"          out 4,r16       ; set pins 8-13 as outputs in DDRB\n"
::: "r16");

registers used:
r31 - millisecond count (lo byte)
r30 - millisecond count (hi byte)
r17 - 100 microsecond count
r16 - 1 microsecond count
Overall delay (ms) = r30:r31 * r17 * r16
---------------------------------------------------------------------*/
"delay_ms%=:    nop                 ; code to replace  nop  \n"
"delay_100us%=: nop                 ; code to replace  nop  \n"
"delay_1us%=:   nop                 ; code to replace nop  \n"
"               sbiw r30,1          ; decrement ms count (r31:r30)\n"
"               brne delay_ms%=     ; loop to delay_ms while > 0  \n"
"               ret                 ; return from subroutine      \n"

, 👍2

Обсуждение

Это чисто вопрос программирования, и, вероятно, его следовало оставить в stackoverflow, а не переносить сюда., @Chris Stratton


1 ответ


3

AVR LibC уже имеет макросы, которые делают это, при условии, что F_CPU установлен правильно.

// Примечание: Arduino IDE получает значение F_CPU из boards.txt
#define F_CPU xxxxxxxxxx

#include <util/delay.h>

 ...

_delay_ms(1);
_delay_us(100);
_delay_us(1);
,