Проблема с портом 0x6F
Когда я дизассемблирую созданный в среде Arduino IDE pjoject, я вижу в созданном коде («фактически дизассемблированный код»), что он использует инструкцию IN/OUT на порту 0X6F.
Вот так (часть дизассемблированного списка):
00E3 4FFF SBCI R31,0XFF ; .O
00E4 91A5 LPM R26,Z+ ; ..
00E5 91B4 LPM R27,Z ; ..
00E6 B79F IN R25,0X6F ; ..
00E7 94F8 CLI ; ..
00E8 1161 CPSE R22,R1 ; a.
00E9 C004 RJMP L00EE ; ..
00EA 918C LD R24,X ; ..
00EB 9530 COM R19 ; 0.
00EC 2338 AND R19,R24 ; 8#
00ED C002 RJMP L00F0 ; ..
00EE 91EC L00EE: LD R30,X ; ..
00EF 2B3E OR R19,R30 ; >+
00F0 933C L00F0: ST X,R19 ; <.
00F1 BF9F OUT 0X6F,R25 ; ..
00F2 9508 L00F2: RET
В любом случае в таблице данных ATMEGA328 указано, что порт 0x6F отображается в памяти и поэтому доступ к нему должен осуществляться через инструкции LDS/STS. Эта проблема меня очень смущает. Кто-нибудь может дать мне объяснение?? Спасибо !
@Kristian Sander, 👍0
Обсуждение1 ответ
Код операции AVR для инструкции IN:
Loads data from the I/O Space (Ports, Timers, Configuration Registers, etc.) into register Rd in the Register File.
Operation:
(i) Rd ← I/O(A)
Syntax: Operands: Program Counter:
(i) IN Rd,A 0 ≤ d ≤ 31, 0 ≤ A ≤ 63, PC ← PC + 1
16-bit Opcode: 1011 0AAd dddd AAAA
Дизассемблирование кода операции B79F (hex) = 1011 0111 1001 1111 (bin)
— это IN R25,$3F
, который на самом деле является SREG
.
Блок кода с инструкциями IN, CLI
и OUT
— критический участок, где сохраняются флаги в SREG
, прерывания отключается, а позже SREG
восстанавливается.
Удачи!
Спасибо большое. Я свяжусь с создателем Disasm, сообщу ему о проблеме и перекомпилирую, когда получу новую версию. Надеюсь, это решит проблему. В любом случае большое-большое спасибо за конструктивные ответы., @Kristian Sander
HI: (время 22:23 по европейскому времени): Позвонил ему, сообщил об ошибке. Он осмотрел. Исправил. Вернул новую версию. Я запустил его. Разобрал файл (который дает приведенный выше список), io-порты теперь правильные (все в диапазоне 0x00 - 0x6F) Благодарю за ценную помощь. КШ, @Kristian Sander
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Каков исходный код C/C++?, @Mikael Patel
avr-objdump дизассемблирует эти байты на «in r25, 0x3f» и «out 0x3f, r25», что соответствует ответу Микаэля Пателя. Похоже у вас сломался дизассемблер., @Edgar Bonet