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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Возникла такая проблема, при отправке байта по SPI пишет spdr write collision, это в шпротеусе

код отправки такой

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

;ОТПРАВКА БАЙТА ПО SPI
 sendSPI:
   ;PB2 = 0
   cbi PORTB, 2
   ;шлем байт = temp2
   out SPDR, temp2
   ;rcall Delay
   ;проверка передачи
   in temp1, SPSR
   sbrs temp1, 7 ; если равен 1 то пропуск след команду
   rjmp sendSPI
   ;PB2 = 1
   sbi PORTB, 2
   ret


Правильно ли я сделал проверку бита SPIF(7 бит в регистре SPSR)?

если добавляю задержку rcall Delay то все нормально. шлю данные в 595 регистр.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

А что мешало воспользоваться примером из даташита?

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

SPI_MasterTransmit:
  ; Start transmission of data (r16)
  out SPDR,r16
Wait_Transmit:
  ; Wait for transmission complete
  in r16, SPSR
  sbrs r16, SPIF
    rjmp Wait_Transmit
ret
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

COKPOWEHEU Спасибо, заработало! Пытался сделать сам, переписывал код с си, забыл что в даташите есть примеры.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

А как работать с большими числами?

Выделил в оперативке переменную в два байта, записал туда просто два числа.
Вот так:

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

   ldi YL, low(number)
   ldi YH, high(number)
   
   ld r16, Y+
   ld r17, Y+
   ldi r18, 124
   ldi r19, 231
   st Y+, r18
   st Y+, r19


А как записать одно число, например 124231, и дальше работать с ним?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Запись беззнакового числа 0...4 294 967 295(FFFF FFFF)

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

LDI XH,BYTE4(124231)
LDI XL,BYTE3(124231)
LDI YH,BYTE2(124231)
LDI YL,BYTE1(124231)
Запись знакового числа -2 147 483 648...2 147 483 647(1000 0000...7FFF FFFF)

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

LDI XH,BYTE4(-124231)
LDI XL,BYTE3(-124231)
LDI YH,BYTE2(-124231)
LDI YL,BYTE1(-124231)
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

люди добрые, помогите пож инициализировать МК:

Attiny 13
прерывание по переполнению таймера 0 (TIMER0_OVF)
частота - 4,8 МГц
предделитель - СК/256

Исходник прилагаю.

Вот опой чую, что где-то туплю, но вот только где? :shock:

Спойлер.include "d:\avr\avrasm\appnotes\tn13def.inc"

; Отсчет времени
; чтение кнопок
; Запись времени в ОЗУ

.def Temp=R16 ;\;
.def Temp1=R17 ; \ вспомогательные
.def Temp2=R18 ; / регистры
.def Temp3=R19 ;/;
.def HTemp=R20 ;старший счетный регистр |Вводим два дополнительных счетных регистра,
.def LTemp=R21 ;младший счетный регистр |т.к. счетчик 8-ми розрядный, а нам этого мало ))
.def Second=R22 ;счет секунд (0-60)
.def Min=R23 ;счет минут (0-60)
.def Hour=R24 ;счет часов (0-24)


.dseg


.cseg
.org 0


; ;*************************** Вектора прерываний ************************

rjmp RESET
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
rjmp TIMER0_OVF ;TIMER0_OVF_vect Прерывание по переполнению таймера/счетчика 0
rjmp EE_READY ;EE_READY_vect EEPROM готова
rjmp ANALOG_COMP ;ANALOG_COMP_vect Аналоговый компаратор переключился
rjmp TIMER0_COMPA ;TIMER0_COMPA_vect Прерывание по сравнению, канал A таймера/счетчика 0
rjmp TIMER0_COMPB ;TIMER0_COMPB_vect Прерывание по сравнению, канал B таймера/счетчика 0
rjmp WDT ;WDT_vect Сторожевой таймер (если используется в качестве источника прерывания)



; *********** Коментируем используемые прерывания *********************

;RESET
;INT0:
;PCINT0:
;TIMER0_OVF
EE_READY:
ANALOG_COMP:
TIMER0_COMPA:
TIMER0_COMPB:
WDT:

reti



RESET: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b00000010 ;разрешить прерывание по переполнению таймера/счетчика 0
out TIMSK0,Temp

ldi Temp,0b00000001 ;тактовый сигнал = CK/256
out TCCR0B,Temp

; ldi Temp,0b00000000 ;Установить вывод OCOA в 1 при совпадении TCNT0 с OCR0A
; out TCCR0A,Temp

ldi Temp,0b00000000 ;
out TCNT0,Temp

ldi Temp,RamEnd ;инициализаци¤ стека
out SPL,Temp

ldi Temp1,0b00000001
sei

;********************** ************************
;********************** Загрузка начальных значений ************************
;********************** ************************

ldi Temp,0
mov HTemp,Temp
mov LTemp,Temp
mov Second,Temp
mov Min,Temp
mov Hour,Temp
mov Temp1,Temp

;*********************************************

main: out PortB,Temp1
rjmp main




;********************** *********************
;********************** обработчик прерывания переполнения таймера *********************
;********************** TIMER0_OVF *********************

TIMER0_OVF: ldi Temp,0b00000000 ;
out TCNT0,Temp
ror Temp1
reti
Вложения
code.asm
(2.71 КБ) 182 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Вектор прерывания переполнения таймера установлен неправильно.
Спойлер

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

.include "tn13def.inc"

; Отсчет времени
;   чтение кнопок
; Запись времени в ОЗУ

.def   Temp=R16   ;\;
.def   Temp1=R17   ; \ вспомогательные
.def   Temp2=R18   ; / регистры
.def   Temp3=R19   ;/;
.def   HTemp=R20   ;старший счетный регистр |Вводим два дополнительных счетных регистра,
.def   LTemp=R21   ;младший счетный регистр   |т.к. счетчик 8-ми розрядный, а нам этого мало ))
.def   Second=R22   ;счет секунд (0-60)
.def   Min=R23   ;счет минут (0-60)
.def   Hour=R24   ;счет часов (0-24)


.dseg


.cseg
.org 0
;*************************** Вектора прерываний ************************
   rjmp RESET   
;rjmp INT0   ;INT0_vect   Внешнее прерывание 0
;rjmp PCINT0   ;PCINT0_vect   Прерывание 0 по изменению состояния вывода
.org 3
;********************** обработчик прерывания переполнения таймера *********************
;**********************   TIMER0_OVF   *********************
TIMER0_OVF:
   LSL Temp1
   ANDI   Temp1,0b01111111
   CPI   Temp1,$40
   BRLO   PC+2
   LDI   Temp1,1
   reti

RESET:
   ldi Temp,0b11111111 ;настройка портов
   out DDRB,Temp

;********************** Загрузка начальных значений ************************

ldi Temp,0
mov HTemp,Temp
mov LTemp,Temp
mov Second,Temp
mov Min,Temp
mov Hour,Temp
mov Temp1,Temp

;*********************************************

;ldi Temp,0b00000000 ;
out TCNT0,Temp

ldi Temp,0b00000010 ;разрешить прерывание по переполнению таймера/счетчика 0
out TIMSK0,Temp
out TIFR0,Temp

ldi Temp,0b00000100 ;тактовый сигнал = CK/256
out TCCR0B,Temp
;ldi Temp,0b00000001 ;тактовый сигнал = CK/256??????????????
;out TCCR0B,Temp

ldi Temp1,0b00000001
sei

main:   out PortB,Temp1
rjmp main
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

То есть помимо пропущенного регистра TIFR0, я еще и нарушил порядок написания? Или в каком порядке описаны прерывания не имеет значения?
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.

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

.include "tn13def.inc"
.def temp=r16
.org 0
     rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться
.org INT0addr
     rjmp RESET
.org   PCI0addr
     rjmp RESET
.org   OVF0addr
     rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
.org   ERDYaddr
     rjmp RESET
.org   ACIaddr
     rjmp RESET
.org   OC0Aaddr
     rjmp RESET
.org   OC0Baddr
     rjmp RESET
.org   WDTaddr
     rjmp RESET
.org   ADCCaddr
     rjmp RESET

TIM0_OVF:
;code
reti

RESET:
     ldi temp, low(RAMEND)
     out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
     ldi temp, 0
     out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
     ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
     out TCCR0B, temp
     ldi temp, (1<<TOIE0)
     out TIMSK, temp ;локальное разрешение прерывания
     out TIFR, temp ;сброс флага
     sei ;глобальное разрешение прерываний
CYCLE:
     rjmp CYCLE
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Спойлер

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

.include "tn13def.inc"
.def temp=r16
.org 0
     rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться

;!!!!!!!!!!!!!!!правда, для этого нужно открыть tn13def.inc, выписать символику векторов

.org INT0addr
     rjmp RESET
.org   PCI0addr
     rjmp RESET
.org   OVF0addr
; в этом коде лишние команды
;     rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
;.org   ERDYaddr
;     rjmp RESET
;.org   ACIaddr
;     rjmp RESET
;.org   OC0Aaddr
;     rjmp RESET
;.org   OC0Baddr
;     rjmp RESET
;.org   WDTaddr
;     rjmp RESET
;.org   ADCCaddr
;     rjmp RESET

TIM0_OVF:
;code
reti

RESET:
;для tiny13 эти команды ненужные    ldi temp, low(RAMEND)
;                              out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
     ldi temp, 0
     out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
     ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
     out TCCR0B, temp
     ldi temp, (1<<TOIE0)
     out TIMSK0, temp ;локальное разрешение прерывания
     out TIFR0, temp ;сброс флага
;для tiny13 эти команды неправильные   out TIMSK, temp ;локальное разрешение прерывания
;                               out TIFR, temp ;сброс флага
     sei ;глобальное разрешение прерываний
CYCLE:
     rjmp CYCLE
.EXIT
В итоге, в этом простом учебном примере половина команд лишние, да ещё и с ошибками.:facepalm: "Скромнее надо быть, скромнее..."
Jetetex писал(а): Или в каком порядке описаны прерывания не имеет значения?
Таблица векторов прерываний для каждого камня фиксирована и приведена в DS.
таблица векторов tiny13.PNG
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ну дык ежли дотошно следовать концепции использования заранее объявленных имен фрагмент:

Спойлер.cseg
.org 0
;*************************** Вектора прерываний ************************
rjmp RESET
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
.org 3


корректнее выглядит как

Спойлер.cseg
.org 0x0000
;*************************** Вектора прерываний ************************
irq_res:
rjmp init ; переход к началу программы инициализации системы
; блок размещения векторов активных прерываний
;irq_INT0: .org INT0addr
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;irq_PCINT0: .org PCI0addr
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
.org (irq_res+int_vectors_size) ; обход блока векторов прерываний

8)
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

COKPOWEHEU писал(а):Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.


Может и не стоит, но это работает. По крайней мере в протеусе... а в железе никак. :(

Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?

Диод на 3й ноге (подключен "+" к МК) должен погаснуть через 1 мин, а гаснет через 74 сек, Хотя в симуляторе все как в сказке.



COKPOWEHEU, по поводу адресов из файла, которым вы посоветовали пользоваться, я вложил этот файл. Мож просветите, где они там, а то я не нашел?
Вложения
tn13def.txt
(15.11 КБ) 195 скачиваний
Фьюзы.jpg
Считанные с МК
(195.98 КБ) 213 скачиваний
Схема.jpg
(192.49 КБ) 374 скачивания
code.asm
(8.73 КБ) 332 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
Режим CTC позволит настроить делитель точнее. А что у вас с тактированием? Не используете ли случайно внутренний RC-генератор, да еще без калибровки?
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

COKPOWEHEU писал(а):454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.

:oops:


Боюсь написать глупость, но я не смог придумать как к attiny 13 прикрутить кварц.
Признаюсь честно - это моё второе устройство. :roll:
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Напрямую - никак, можно использовать кварцевый генератор, подключенный к CLKI.
В принципе, можно попробовать использовать и внутренний RC-генератор, вроде в даташите говорится о точности 1% при комнатных температурах, если использовать калибровку. Где-то читал, правда, что при стирании кристалла, заводская калибровка стирается и приходится подбирать коэффициент вручную.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Jetetex писал(а):Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
По коду
Спойлер

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

TIMER0_OVF:
   IN   R15,SREG      ;сохранить SREG в неиспользуемый R15
;
   OUT   SREG,R15
Exit:   reti
;
;
Dealay:
   mov Temp2,pvm
D:   dec Temp2
;   cpi Temp2,0
   brne D
   cbi PortB,3         ;выключаем индикатор работы таймера
   ret
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Столкнулся с проблемой. Не могу понять алгоритм.

В общем настроил ШИМ, сигнал генерируется, когда вручную меняю значение в OCR0A например, то и сигнал шима меняется.

Я хочу программно увеличивать этот регистр, что бы сделать плавный розжиг диода.

Пример брал с сайта http://easyelectronics.ru/avr-uchebnyj- ... -shim.html

Как я делаю:

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

  main:      
   lds temp, TCNT0
   lds temp1, TCNT0+1
   cpi r16,$10
   brcs ex1
   cpi r17, $01
   brcs ex1
   rcall led_pwm
 ex1:
   nop
   nop
   rjmp main

 ;плавный розжиг светодиода
 led_pwm:
   cli
   in temp, OCR0A
   in temp1, OCR0A+1
   inc temp
   out OCR0A, temp
   out OCR0A+1, temp1
   
   sei

   clr temp
   cli
   out TCNT0, temp
   sts TCNT0, temp
   sts TCNT0+1, temp
   sts TCNT0+2, temp
   sts TCNT0+3, temp
   sei
   ret


Но на экране осциллографа сигнал не меняется.. В чем может быть проблема?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Если контроллер как в примере, то я не смог войти в пп led_pwm
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

забыл добавить, контроллер attiny13
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Весь код под спойлером выложите. Мне, допустим, лень дефайнить Вашу символику.
Ответить

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