Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Челюскин
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Челюскин »

Огромное спасибо, akl и Alexeyslav. я сделал как с синтезатором - таймер делает задержку в 0.1 сек, по окончанию уменьшаю регистр на 1 и проверяю на 0, если не 0, то повторяю цикл.перед этим записываю в регистр нужное число повторений. Я вот только что-то не понял с компаратором, если можно поподробней растолкуйте :dont_know:


p.s. :facepalm: Понял про компаратор - тот же сброс при совпадении!!! Спасибо. :beer:
Лень - двигатель прогресса!
NEM_
Родился
Сообщения: 2
Зарегистрирован: Пт авг 02, 2013 21:32:20
Откуда: Ростовская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение NEM_ »

Доброго времени суток.
Начинаю осваивать МК, на базе ATyni 2313. Подскажите пожалуйста логику работы таймера или что я неправильно делаю. Учебная программа "Часы" по таймеру отсчитывает интервал в 1 секунду и считает значения минут и часов с выводом на семисегментный индикатор.
Тактовая частота 8 МГц, используем 16 разрядный Timer1, Тактовую частоту делим на 256 -> получаем 31250 Гц -> устанавливаем значение регистра сравнения OCR1A = 31250 -> по логике должно получится одно прерывание в секунду... Ан нет, получается интервал 10 секунд... Подскажите где ошибка в логике или в самой программе!
И вопрос №2 А разве в режиме компаратора при совпадении регистра сравнения и счётного регистра, последний не сбрасывается аппаратно?
Программа:

Спойлер

Код: Выделить всё

; Учебная программа выводит время на индикатор

.def temp= r16; присваиваем регистру R16 - имя "temp"
.def min= r17; переменная значения минут
.def chas= r18; переменная значения часов
.def h1= r19; переменная старшего разряда п/п преобразовния
.org 0;_________старт с нуля и переход по вектору на метку "start"__
   rjmp start
.org $04
   rjmp tim1
.org OVF0addr; _адресс прерывания по переполнению таймера 0__
   rjmp tim0

;---------- Инициализация ----------
start:
ldi temp, LOW(Ramend); инициализация указателя стека
out spl, temp
ldi temp, $ff; програмируем порт "В" на выход
out ddrB, temp
ldi temp, 0b0001111
out ddrD, temp; програмируем выводы 1...4 порта "D" на выход
rcall tim0_init; переход на п/п инициализации прерывания

clr r31
ldi r30, $70;  переносим таблицу символов в ОЗУ
ldi temp, $c0; по адресу $70...$79
st Z+, temp
ldi temp, $f9
st Z+, temp
ldi temp, $A4
st Z+, temp
ldi temp, $b0
st Z+, temp
ldi temp, $99
st Z+, temp
ldi temp, $92
st Z+, temp
ldi temp, $82
st Z+, temp
ldi temp, $F8
st Z+, temp
ldi temp, $80
st Z+, temp
ldi temp, $90
st Z+, temp
ldi temp, $01
st Z+, temp

ldi r30, $60;  Обнуляем значение ОЗУ
ldi temp, $00; по адресу $60...$63
st Z+, temp
st Z+, temp
st Z+, temp
st Z+, temp
mov r17, temp
mov r18, temp

   ldi temp, 1; Задаём начальные условия
   mov r2, temp
sei; глобально разрешаем прерывания

;---------- цикл---------------------------------
LOOP: rjmp LOOP
  ;_____
TRANSFORM:; подпрограмма преобразования в двоично-десятичную систему исчесления
clr h1 ;очищаем результат ПРЕОБРАЗОВАНИЯ
LOOP_1:
subi temp,10 ;из входного числа вычитаем - 10
brcs LOOP_2 ;переход на метку при переносе
inc h1 ; + 1
rjmp LOOP_1; назад к циклу
LOOP_2:
subi temp,-10 ; к остатку прибавляем +10 -- получается младший разряд
ret
;----------
   tim0_init:; инициализация прерывания Timer
ldi temp, $2; устанавливаем предделитель
out tccr0, temp; регистр TCCR0B задаёт коэф. деления (Биты CS00,CS01,CS02)
; __________инициализация прерывания Timer1___________
ldi Temp,0b01000010   ;разрешить прерывание компаратора
          out TIMSK,Temp

          ldi Temp,0b00000100   ;тактовый сигнал (8 МГц) = CK/256
          out TCCR1B,Temp
          ldi Temp,0x7A         ;инициализация компаратора
          out OCR1AH,Temp       ; считаем до 31250
          ldi Temp,0x12
          out OCR1AL,Temp
   ret
;_____
;                      П/П обработки прерывания
;_____
tim0:
push temp; сохраняем значение переменной temp в стек
in temp, sreg; сохраняем значение региста SREG в стек
push temp

 clr temp
 out portD, temp; гасим индикатор
   lds temp, $007A; Загружаем непосредственно с RAM значение Хранящееся в ячейке $007A
      cpi temp, 0b00010000; сверяем на достижение зачен. 0b00010000
      breq OVERFLOV; если достигло то переход на П/П обнуления
    W: out portD, temp; Включаем нужный разряд (хранится) в яч. №007А
    lsl temp; сдвигаем temp на один пазряд влево
   sts $007A, temp; записываем значение temp в ОЗУ по адресу $007A
  mov r30, r2; копируем r2 в r30 (r2 хранит номер разряда)
  subi r30, -$5f; к r30 прибавляем $5f
  ld temp, z; загружаем значение ОЗУ по адрессу Z (r30,r31)
  ldi r30, $70; загружаем в Z число $70
  add r30, temp; прибавляем к Z число в рег. temp
  ld temp, z; загружаем в temp число по адресу Z
  out portB, temp; Выводим цифру на индикатор
     inc r2; прибавляем номер позиции индикатора

   pop temp; востанавливаем из стека данные
out sreg, temp
pop temp;
reti;

   OVERFLOV:;П/П обнуления
   ldi temp, 1;
   mov r2, temp;
   rjmp W;

   tim1:
   push temp; сохраняем значение переменной temp в стек
in temp, sreg; сохраняем значение региста SREG в стек
push temp
push r30

inc min; Значение минут + 1
  cpi min, 60; сравниваем значение минут с 60
  breq TIM60; если да - то переход на п/п обнуления минут
  rjmp E1; едем дальше
 TIM60:; П/П обнуления минут
  clr min; очищаем значения минут
  inc chas; прибавляем один час
  cpi chas, 24; если часов 24
  breq CHAS24; то переходим на п/п обнуления часов
  rjmp E1
 CHAS24:;П/П обнуления часов
  clr chas; обнулить часы

  E1: mov temp, min; копируем значение минут в temp
Rcall TRANSFORM; вызов п/п преобразования шестнадцатиричного формата в двоично-десятичный
clr r31; запись значения времени в оперативную память
ldi r30, $60 ; по адресу $0060
st Z+, temp; записываем значение едениц минут в ОЗУ с инкременированием адреса
st Z+, h1 ;записываем значение десятков минут в ОЗУ с инкременированием адреса
mov temp, chas; копируем значение часов в temp
Rcall TRANSFORM; вызов п/п преобразования шестнадцатиричного формата в двоично-десятичный
st Z+, temp; записываем значение едениц часов в ОЗУ с инкременированием адреса
st Z+, h1; записываем значение десятков часов в ОЗУ с инкременированием адреса

ldi Temp,0            ;обнуление таймера
          out TCNT1H,Temp
          out TCNT1L,Temp

pop r30
pop temp; востанавливаем из стека данные
out sreg, temp
pop temp;
reti;
Последний раз редактировалось Gudd-Head Пн авг 05, 2013 12:29:23, всего редактировалось 2 раза.
Причина: Нарушение п.2.5 Правил Форума
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Получается у тебя не 10 а 8 секунд. Потому что по умолчанию на свежей меге прошит бит конфигурации CKDIV8 - системная частота делится на 8. Вместо 8Мгц тактовой ты получаешь реально 1Мгц.
Аватара пользователя
ANALOG
Мучитель микросхем
Сообщения: 444
Зарегистрирован: Вс ноя 28, 2010 15:18:52
Откуда: Минск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ANALOG »

Оформьте код тегом [сode][/сode] пожалуйста. От этого глаза вылазят :wink:

И да, судя по коду прерывание действительно должно быть 1 раз в секунду так что тут проблема скорее с частотой тактирования
Вам нужно выключить фьюз-бит CKDIV8
Но с фьюзами надо очень аккуратно, если опыта нет в этом деле - может лучше программно повысить частоту? Насколько я понимаю, в часах секунды не показываются? тогда можно просто уменьшить вдвое значение OCR и прибавлять не по одной а по 4 секунды за раз
NEM_
Родился
Сообщения: 2
Зарегистрирован: Пт авг 02, 2013 21:32:20
Откуда: Ростовская область

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение NEM_ »

Большое спасибо что откликнулись, действительно проблема была в установленном fuse CKDIV8. :kill: Всё исправлено, работает как задумано... :solder:
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение B@R5uk »

Народ, подскажите, пожалуйста, где взять подробное описание команд ATtiny13А, не ту краткую сводку с мнемоникой/описанием в два слова/изменяемыми флагами, а подробное, с побитовой кодировкой, с описанием всех тонкостей. По типу как в этом даташите на PIC. Русский не обязателен.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Kavka »

На сайте производителя, естественно.
http://www.atmel.com/images/doc2535.pdf - раздел "21. Instruction Set Summary"
http://www.atmel.com/images/doc0856.pdf - за подробностями "8-bit AVR Instruction Set"
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение B@R5uk »

Kavka писал(а):http://www.atmel.com/images/doc0856.pdf - за подробностями "8-bit AVR Instruction Set"
Оно! Изображение Спасибо!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Можно и так:
берем avr studio 4.19(или чего покруче), запускаем...
Открываем какой-нибудь проэктик на асме.
Жмем help ->> avr tools user guide->>
далее AVR assembler ->> instruktions и гуляем по текстам... 8)
Только я предпочитаю в большинстве случаев самолапную шпоргалку, за исключением тех команд, которые в ней особо отмечены.
шпора AVR.pdf
(60.25 КБ) 221 скачивание
:write:
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

B@R5uk писал(а):Народ, подскажите, пожалуйста, где взять подробное описание команд ATtiny13А

Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel А.В.Евстифеев
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 1essor1 »

Пытаюсь подружить аппаратный SPI со сдвиговым регистром hc595, чего-то не ладится. Такой вопрос: в качестве тактового использую естественно вывод sck и инфу передаю по mosi. Защелкивать пытаюсь по miso.Вроде как в режиме мастера miso должен быть как вход, а его по выходу использую, могут быть от этого проблемы? И возможно нужно как то настраивать полярность сигнала? У меня умолчания стоят - единственное что поставил это передача со старшего разряда.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Конечно могут. аппаратный SPI перекрывает управление выводами, т.е. ты не можешь дергать выводами отведенными модулю SPI когда он активен при помощи регистров DDRx и PORTx. Другими словами у SPI выше приоритет управления выводами чем у DDRx и PORTx. Поэтому, для защелкивания бери другой вывод либо при помощи одновибратора - как только импульсы SCK исчезают одновибратор через некоторое время сформирует импульс защелкивания. преимущества - не нужен вывод контроллера, недостаток - защелкивание происходит через неконтролируемый интервал времени. Для динамической индикации и низкочастотных применений регистра вроде управления реле - этот недостаток не мешает.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Часто использовал 595е, но никогда не вешал их на SPI. ИМХО, проще написать подпрограмму на 10 строчек, и рулить там выводом как захочешь.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

ploop писал(а):проще написать подпрограмму на 10 строчек

В смысле, программный SPI?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Ну типа выплюнуть данные в регистр. Выставил бит, дёрнул такт, следующий, и так в цикле. Если убрать все премудрости, то плюётся он очень быстро (595м пофигу на скорость, они, если память не изменяет, до 50МГц будут работать).
Аватара пользователя
1essor1
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Вс дек 09, 2012 12:14:44

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение 1essor1 »

Всё получилось - перебросил защелку на вывод SS, когда в мастере он на выход - SPI на него чхать) Все работает :beer:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Порой не проще. Программный SPI ужасно медленный. Аппаратным модулем можно выплюнуть данные в регистр за 3-4 такта и выполнять программу дальше. Каким еще методом можно загружать данные в регистр со скоростью до 8Мбит/сек при тактовой частоте 8Мгц? Программным выйдет порядка 200...300К/сек (это если ничего мешать не будет). На STM-ках с его DMA так вообще можно отправить в SPI хоть 1000 байт и тут же продолжить выполнять программу дальше не беспокоясь об отправке данных и прерывании процесса при возникновении прерывания.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Кто-то говорил, что быстрее? Вроде речь шла о том, что проще.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Alexeyslav »

Так одновременно с тем и проще. Передача 8 бит - всего ишь положить необходимое значение в регистр, а сам процесс передачи - не забота программы. А программное "проще" - это реализовать алгоритм передачи программно, одна только передача данных в подпрограмму займет уйму тактов, дёргание ножкой SCK - целых 4 такта... уже только за это время можно передать несколько байт по SPI.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Alexeyslav писал(а):займет уйму тактов, дёргание ножкой SCK - целых 4 такта... уже только за это время можно передать несколько байт по SPI.

Вспомнилось из ДШ на тиньку2313:
Изображение
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»