Как создать задержки на языке ассемблера 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
Обсуждение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);
,
@Ignacio Vazquez-Abrams
Смотрите также:
- Запустить Timer1 в ATmega2560 со сборкой
- Как добавить два сборочных массива в arduino
- Сборка для цикла, повторяющегося 2 раза, хотя предполагается, что это нужно сделать только один раз
- Код сборки Arduino Uno R3 для нажатия кнопки и включения светодиода
- Как установить регистр ПК (счетчик программ) на другую функцию (для планировщика)
- Atmega собирает и ретранслирует вызовы прерывания
- В чем разница/связь между Arduino и AVR?
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
Это чисто вопрос программирования, и, вероятно, его следовало оставить в stackoverflow, а не переносить сюда., @Chris Stratton