Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.11.2008, 13:01
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
AVR пишет в ОЗУ непонятно куда......
Привет.
И так.
В обработчике прерывания от таймера стоит процедурка для чтения программного SPI. Но есть проблемы.
При выполенени следующего куска кода... Прога пишет ибо в ячейку 00 и 01, или в 01 02 в зависимости от кода, который стоял выше (я думаю не так важно).
Код:
Код:
|
programm_SPI_test:
wdr
push XL
push XH
push TEMP_C
push TEMP_B
clr TEMP_C
ldi TEMP_B, $BD
call programm_SPI_send_resive
ldi TEMP_A,0
load_p X, controls_table_memory_begin
add_to_word X,TEMP_A
ld TEMP_A, X
ldi TEMP_C, $0F
st X+,TEMP_C
st X, TEMP_C
pop TEMP_B
pop TEMP_C
pop XH
pop XL
ret |
Макросы:
Код:
|
.macro load_p
ldi @0H,HIGH(@1)
ldi @0L,LOW(@1)
.endmacro
.macro add_to_word
push TEMP_A
mov TEMP_A, @1
adc @0L, TEMP_A
brcc goto_end
ldi TEMP_A, 1
add @0H, TEMP_A
goto_end:
pop TEMP_A |
3-й день борюсь....
Да,... controls_table_memory_begin =2Е8.
В чем я неправ при записи в ОЗУ???
Че не учел?, или это баг?
|
|
|
|
12.11.2008, 13:19
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Ну так и есть. У вас первое сложение с переносом, а второе без. А должно быть наоборот.
|
|
|
|
12.11.2008, 14:23
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Да я не про то.
ПО коду должно сохранять в ячейки 00 и 01.
А иногда сохраняет в ячейки 01 и 02 при том же коде, хотя ДОЛЖНО сохранять в 00 и 01.
Типо по коду:
X=0
st X+,TEMP_C ;TEMP_C -› X(0)
st X, TEMP_C ;TEMP_C -› X(1)
А иногда сохраняет типо так:
X=0
st X+,TEMP_C ;TEMP_C -› X(1)
st X, TEMP_C ;TEMP_C -› X(2)
Вчем грабли то?
Похожий баг был при попытке использовать моканду ADIW вместо макроса add_to_word. При многоразовом вызове ADIW:
ADIW X, 63
ADIW X, 63
ADIW X, 20
тоже писало подобно данной ситуации.
|
|
|
|
12.11.2008, 14:25
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
P.S.
Из мануала:
Код:
|
ldi r26,$60 ; Set X low byte to $60
st X+,r0 ; Store r0 in data space loc. $60(X post inc)
st X,r1 ; Store r1 in data space loc. $61 |
|
|
|
|
12.11.2008, 14:42
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Выдало ошибку при изменениии кода выше:
Loaded partfile: C:Program FilesAtmelAVR ToolsPartDescriptionFilesATmega1280
Error in plugin: Atmel AVR Assembler Command: COMPILE
Решилась перезапуском студии.
|
|
|
|
12.11.2008, 15:19
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от ua_gruzin
|
Да я не про то.
|
Вот именно что не про то.
У вас адрес, куда писать, вычисляется в макро.
А там - загрузка базового адреса и + к нему смещение.
Первое сложение - командой ADC - это значит, сложить операнды И ПЕРЕНОС! Состояние бита переноса вам неизвестно. Потому и попадает то в нужный, то в нужный+1
А второе сложение - без переноса.
ДОЛЖНО БЫТЬ НАОБОРОТ
|
|
|
|
12.11.2008, 15:31
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Вы правы на все 100%.
Большое спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:48.
|
|