roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

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

посмотрите пожалуйста, правильно что ли?

Re: МикроКонтроллер AVR начинающим - общие вопросы

galex1981 » 29 сен 2010, 00:33

Проще всего проверить код в AVR Studio

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 29 сен 2010, 00:44

да в общем-то правильно...
ну, если придираться, то обычно в АВР-ках старший байт адреса кладут в старший регистр -
например, если используется регистровая пара как указатель, то нужно делать именно так.
(r1 и r2 - это не пара, так что в общем можно как попало запихивать, хотя это и "некрасиво")

ну и еще, довольно странно в качестве временного регистра выбирать каждый раз разные регистры...

Re: МикроКонтроллер AVR начинающим - общие вопросы

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ричной системе В )
и в чем может быть ошибка??

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 29 сен 2010, 23:47

Замечания тут ни при чем - код вы зря запутали.
На первый взгляд должно работать (несмотря на полный идиотизм задания :))
Отлаживайтесь в AVR Studio по шагам.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Victorovych » 30 сен 2010, 13:39

Так по-моему правильнее будет :crazy: :
Код: Выделить всёРазвернуть
   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

Re: МикроКонтроллер AVR начинающим - общие вопросы

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;   
}


Хочу чтобы выполнялся код в прерывании (это для теста написана строчка), в протеусе работает, в реальности нет. Где грабли? :oops:

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 01 окт 2010, 13:25

может timsk забыли? а может main :)

Re: МикроКонтроллер AVR начинающим - общие вопросы

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")
}

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 01 окт 2010, 13:52

Я так и понял...
На первый взгляд должно работать. :pardon:

Re: МикроКонтроллер AVR начинающим - общие вопросы

ADonis » 01 окт 2010, 13:59

Я тоже так считаю, но вот что на выходе реального МК, тогда как в протеусе все нормально
Вложения
Шум на PD0.JPG

Re: МикроКонтроллер AVR начинающим - общие вопросы

blindman » 01 окт 2010, 16:35

Ничего удивительного. Ногу на вывод кто будет настраивать?

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 01 окт 2010, 16:35

Ахха... ТОЧНО!!! :)

Re: МикроКонтроллер AVR начинающим - общие вопросы

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
Fuses.JPG (7.43 КиБ) Просмотров: 1546

Re: МикроКонтроллер AVR начинающим - общие вопросы

blindman » 02 окт 2010, 03:22

На картинке - типичная осциллограмма с висящего в воздухе провода. Проверяй монтаж, убедись что контроллер шьется правильно, и вообще может не на той ноге смотришь


Rambler\'s Top100 Mail.ru counter