Страница 268 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт мар 25, 2016 20:23:41
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 регистр.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт мар 25, 2016 20:44:23
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт мар 25, 2016 20:48:20
alex38779
COKPOWEHEU Спасибо, заработало! Пытался сделать сам, переписывал код с си, забыл что в даташите есть примеры.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 10:39:42
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, и дальше работать с ним?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 11:42:15
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)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 17:16:31
Jetetex
люди добрые, помогите пож инициализировать МК:
Attiny 13
прерывание по переполнению таймера 0 (TIMER0_OVF)
частота - 4,8 МГц
предделитель - СК/256
Исходник прилагаю.
Вот опой чую, что где-то туплю, но вот только где?
Спойлер
.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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 17:34:36
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 18:32:34
Jetetex
То есть помимо пропущенного регистра TIFR0, я еще и нарушил порядок написания? Или в каком порядке описаны прерывания не имеет значения?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб мар 26, 2016 22:27:38
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 01:29:56
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
В итоге, в этом простом учебном примере половина команд лишние, да ещё и с ошибками.
"Скромнее надо быть, скромнее..."
Jetetex писал(а): Или в каком порядке описаны прерывания не имеет значения?
Таблица векторов прерываний для каждого камня фиксирована и приведена в DS.
таблица векторов tiny13.PNG
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 08:25:02
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) ; обход блока векторов прерываний

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 18:23:31
Jetetex
COKPOWEHEU писал(а):Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.
Может и не стоит, но это работает. По крайней мере в протеусе... а в железе никак.
Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
Диод на 3й ноге (подключен "+" к МК) должен погаснуть через 1 мин, а гаснет через 74 сек, Хотя в симуляторе все как в сказке.
COKPOWEHEU, по поводу адресов из файла, которым вы посоветовали пользоваться, я вложил этот файл. Мож просветите, где они там, а то я не нашел?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 18:59:56
COKPOWEHEU
454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
Режим CTC позволит настроить делитель точнее. А что у вас с тактированием? Не используете ли случайно внутренний RC-генератор, да еще без калибровки?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 19:55:32
Jetetex
COKPOWEHEU писал(а):454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
Боюсь написать глупость, но я не смог придумать как к attiny 13 прикрутить кварц.
Признаюсь честно - это моё второе устройство.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс мар 27, 2016 20:17:47
COKPOWEHEU
Напрямую - никак, можно использовать кварцевый генератор, подключенный к CLKI.
В принципе, можно попробовать использовать и внутренний RC-генератор, вроде в даташите говорится о точности 1% при комнатных температурах, если использовать калибровку. Где-то читал, правда, что при стирании кристалла, заводская калибровка стирается и приходится подбирать коэффициент вручную.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн мар 28, 2016 03:03:16
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт мар 29, 2016 10:35:03
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
Но на экране осциллографа сигнал не меняется.. В чем может быть проблема?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт мар 29, 2016 11:09:02
akl
Если контроллер как в примере, то я не смог войти в пп led_pwm
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт мар 29, 2016 11:14:46
alex38779
забыл добавить, контроллер attiny13
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт мар 29, 2016 11:23:07
akl
Весь код под спойлером выложите. Мне, допустим, лень дефайнить Вашу символику.