Технический форум по робототехнике.
slavik.ksu » 27 сен 2010, 13:31
помогите пожалуйста с написанием кода в AVRstudio для мк Atmel ...
Задача : " Запишите в регистры R1 и R2 адрес ячейки памяти 001D . Запишите в эту ячейку число 44, а в регистр R5 – число BB. Сложите (R5) с содержимым ячейки памяти 001D. "
написал код
ldi r17 , 00
mov r1 , r17
ldi r16 , 0x1D
mov r2 , r16
; до сюда думаю правильно, далее как записать в эту ячйку число 44 незнаю..предположил что можно так:
ldi r18 , 44
sts 0x001D , r18
посмотрите пожалуйста, правильно что ли?
galex1981 » 29 сен 2010, 00:33
Проще всего проверить код в AVR Studio
Michael_K » 29 сен 2010, 00:44
да в общем-то правильно...
ну, если придираться, то обычно в АВР-ках старший байт адреса кладут в старший регистр -
например, если используется регистровая пара как указатель, то нужно делать именно так.
(r1 и r2 - это не пара, так что в общем можно как попало запихивать, хотя это и "некрасиво")
ну и еще, довольно странно в качестве временного регистра выбирать каждый раз разные регистры...
slavik.ksu » 29 сен 2010, 23:06
сделал задание до конца, и чето не получается..
задание " Запишите в регистры R1 и R2 адрес ячейки памяти 001D . Запишите в эту ячейку число 4, а в регистр R5 – число 3. Сложите (R5) с содержимым ячейки памяти 001D. Результат перешлите в регистр R6. Просмотрите R5, R 6 и ячейку памяти 001D. "
с учетом Вашего замечания получился такой код:
ldi r17 , 00
mov r1 , r17
ldi r16 , 0x1D
mov r2 , r16 ; записали ячейку 001D в регистры r1 и r2
mov r26 , r2
mov r27 , r1 ; теперь ячейка записана в паре регистров Х
ldi r18 , 4
st X , r18 ; в ячейку записали число 4
ldi r19 , 3
mov r5 , r19 ; в регистр r5 записали число 3
ld r20 , X ; содержимое ячейки выписали в r20
add r5 , r20 ; сложили r5 с содержимым ячейки
в последней строчке мы сложили r5=3 с r20=4 , в результате в r5 мы должны получить 7 !?? но почемуто там получается 11 (или в 16ричной системе В )
и в чем может быть ошибка??
Michael_K » 29 сен 2010, 23:47
Замечания тут ни при чем - код вы зря запутали.
На первый взгляд должно работать (несмотря на полный идиотизм задания
)
Отлаживайтесь в AVR Studio по шагам.
Victorovych » 30 сен 2010, 13:39
Так по-моему правильнее будет
:
- Код: Выделить всё • Развернуть
clr r1 ;
ldi r16,$1D ;Запишите в регистры R1 и R2 адрес ячейки памяти 001D
mov r2,r16 ;
ldi r29,$04 ;
mov r5,r29 ; Запишите в эту ячейку число 4, а в регистр R5 – число 3
dec r5 ;
add r5,r29 ;Сложите (R5) с содержимым ячейки памяти 001D
mov r6,r5 ;Результат перешлите в регистр R6
ADonis » 01 окт 2010, 12:26
Всем привет!
Чего-то я завис, ядрышко mega16, вот такой код:
- Код: Выделить всё • Развернуть
//Настройка таймера 2
ASSR=0x00;
TCCR2=0b00001001;//Режим СТС, без прескалера
TCNT2=0x00;
OCR2=0x12;
#asm("sei")
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTD.0=~PORTD.0;
}
Хочу чтобы выполнялся код в прерывании (это для теста написана строчка), в протеусе работает, в реальности нет. Где грабли?
Michael_K » 01 окт 2010, 13:25
может timsk забыли? а может main
ADonis » 01 окт 2010, 13:29
Сорри, насобирал кусками с проекта необходимые на мой взгляд строки, поэтому мог запутать, вот так это все выглядит:
- Код: Выделить всё • Развернуть
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTD.0=~PORTD.0;
}
void main(void)
{
//Настройка таймера 2
ASSR=0x00;
TCCR2=0b00001001;//Режим СТС, без прескалера
TCNT2=0x00;
OCR2=0x12;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
#asm("sei")
}
Michael_K » 01 окт 2010, 13:52
Я так и понял...
На первый взгляд должно работать.
ADonis » 01 окт 2010, 13:59
Я тоже так считаю, но вот что на выходе реального МК, тогда как в протеусе все нормально
- Вложения
-
blindman » 01 окт 2010, 16:35
Ничего удивительного. Ногу на вывод кто будет настраивать?
Michael_K » 01 окт 2010, 16:35
Ахха... ТОЧНО!!!
ADonis » 01 окт 2010, 19:50
Да она-то настроена - кусочками собирал код с проекта )) забыл эту строку сюда засунуть. К тому же - в Протеусе работает, да и не скомпилируется по-моему, если не настроить. Тут чет другое :-X
Добавлено спустя 17 минут 1 секунду:Проверил - если не настраивать на выход, то компилируется, но в Протеусе не пашет :-X
Добавлено спустя 5 минут 29 секунд:Еще раз прикладываю полный уже (удалил все ненужное и скопипастил) код "проекта":
- Код: Выделить всё • Развернуть
#include <mega16.h>
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
PORTD.0=~PORTD.0;
}
// Declare your global variables here
void main(void)
{
// Port D initialization
PORTD=0x02;
DDRD=0xFF;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC2 output: Toggle on compare match
ASSR=0x00;
TCCR2=0b00001001;
TCNT2=0x00;
OCR2=0x12;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
И еще настройки фьюзов реального МК:
- Fuses.JPG (7.43 КиБ) Просмотров: 1546
blindman » 02 окт 2010, 03:22
На картинке - типичная осциллограмма с висящего в воздухе провода. Проверяй монтаж, убедись что контроллер шьется правильно, и вообще может не на той ноге смотришь