Ассемблер (ASM) для AVR в вопросах и ответах
- Pink-Pank
- Опытный кот
- Сообщения: 721
- Зарегистрирован: Ср июн 11, 2014 09:43:13
- Откуда: США
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну, тогда где-то лишний rcall или забыли ret. Еще как вариант - обращаетесь к регистрам периферии за диапазоном 0x5F при помощи команд in/out. В результате попадаете на регистры стека. Где-то тут на форуме проскакивала такая ошибка.
Fucking static initialization order fiasco
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если это вся программа, то работает правильно.СКАЗОЧНИК писал(а):Может кому не лень будет, глянет в АВРстудии проект мой...Однако, после выхода из подпрограммы инициализации дисплея (по ret) попадает не туда, откуда начал... Уже исправил одну проблему, когда перекидывало по ret выше на два адреса, а теперь НИЖЕ перекидывает...
Спойлер
Код: Выделить всё
.include "tn2313def.inc"
; ============
; ТИП МИКРОКОНТРОЛЛЕРА (.device)
; ============
.device ATtiny2313
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
; ====
; МАССИВЫ И Т.Д. (.eseg) EEPROM (.db, .dw)
; ====
.eseg
; ******************************
; НАЧАЛО ПРОГРАММЫ (.cseg) FLASH
; ******************************
.cseg
; ----------
; ВЕКТОРЫ ПРЕРЫВАНИЙ
; ----------
rjmp RESET ; Reset Handler
rjmp INT_0 ; External Interrupt0 Handler
rjmp INT_1 ; External Interrupt1 Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp USART0_RXC ; USART0 RX Complete Handler
rjmp USART0_DRE ; USART0,UDR Empty Handler
rjmp USART0_TXC ; USART0 TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp PCINT ; Pin Change Interrupt
rjmp TIMER1_COMPB ; Timer1 Compare B Handler
rjmp TIMER0_COMPA ; Timer0 Compare A Handler
rjmp TIMER0_COMPB ; Timer0 Compare B Handler
rjmp USI_START ; USI Start Handler
rjmp USI_OVERFLOW ; USI Overflow Handler
rjmp EE_READY ; EEPROM Ready Handler
rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;RESET ; Reset Handler
INT_0: ; External Interrupt0 Handler
INT_1: ; External Interrupt1 Handler
TIM1_CAPT: ; Timer1 Capture Handler
TIM1_COMPA: ; Timer1 CompareA Handler
TIM1_OVF: ; Timer1 Overflow Handler
TIM0_OVF: ; Timer0 Overflow Handler
USART0_RXC: ; USART0 RX Complete Handler
USART0_DRE: ; USART0,UDR Empty Handler
USART0_TXC: ; USART0 TX Complete Handler
ANA_COMP: ; Analog Comparator Handler
PCINT: ; Pin Change Interrupt
TIMER1_COMPB: ; Timer1 Compare B Handler
TIMER0_COMPA: ; Timer0 Compare A Handler исправил в ТН2313ДЕФ.ИНК
TIMER0_COMPB: ; Timer0 Compare B Handler исправил в ТН2313ДЕФ.ИНК
USI_START: ; USI Start Handler
USI_OVERFLOW: ; USI Overflow Handler
EE_READY: ; EEPROM Ready Handler
WDT_OVERFLOW: ; Watchdog Overflow Handler
reti ; Выход из прерываний, которые не используются
; ----------
; ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
; ----------
; **************************************************************************************************
; ИНИЦИАЛИЗАЦИЯ МК (логическое начало основной программы) ******************************************
; **************************************************************************************************
; --------- конфигурация портов ----------
Reset:
; ---------- начальные значения переменных, массивы ----------
; ----- конфигурация прерываний, стека, аналогового компаратора, таймеров -----
ldi temp, 0xFF ; Сбросить флаги внешних прерываний
out EIFR, temp
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
ldi temp, 1<<ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
out ACSR, temp
rcall INIT_LCD
ldi R18, 0x34
rcall SYMBOL
;ADDRESS 1,2
; SYMBOL 0x33
; SYMBOL 0x37
; SYMBOL 0x36
; SYMBOL 0x31
;ADDRESS 1,8
; SYMBOL 0x4d
; SYMBOL 0x48
; SYMBOL 0x7a
;ADDRESS 1,12
; SYMBOL 0x6b
; SYMBOL 0x48
; SYMBOL 0x7a
;ADDRESS 2,2
; SYMBOL 0x34
; SYMBOL 0x33
; SYMBOL 0x37
; SYMBOL 0x36
; SYMBOL 0x31
;ADDRESS 2,8
; SYMBOL 0x4d
; SYMBOL 0xa1
; SYMBOL 0xe5
;ADDRESS 2,12
;
; SYMBOL 0xba
; SYMBOL 0xa1
; SYMBOL 0xe5
; SYMBOL 0x70
; SYMBOL 0xc3
; SYMBOL 0xb3
; SYMBOL 0x61
; SYMBOL 0xb9
;ADDRESS 2,12
; ---------- разрешение прерываний ----------
sei ; Разрешаем прерывания
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
;SYMBOL:
; OUT PORTB,R18
;вывод старшей тетрады
; SWAP R18
; OUT PORTB,R18
;вывод младшей тетрады
;RET
; ret
;INIT_LCD:
; ret
;*****************************************************************************************************************************
.equ DB7port = PORTB ; Указать порт,к которому подключен вывод DB7 дисплея
.equ DB7ddr = DDRB ; Указать регистр напраавления порта, к которому подключен DB7 дисплея
.equ DB7_PIN = PINB
.equ DB7pin = 1 ; Указать номер бита порта, к которому подключен DB7 дисплея
.equ DB6port = PORTB
.equ DB6ddr = DDRB
.equ DB6_PIN = PINB
.equ DB6pin = 4
.equ DB5port = PORTB
.equ DB5ddr = DDRB ; Аналогично (см. выше)
.equ DB5_PIN = PINB
.equ DB5pin = 2
.equ DB4port = PORTB
.equ DB4ddr = DDRB
.equ DB4_PIN = PINB
.equ DB4pin = 3
.equ RSport = PORTD
.equ RSddr = DDRD
.equ RSpin = 6
.equ R_Wport = PORTD
.equ R_Wddr = DDRD
.equ R_Wpin = 5
.equ Eport = PORTB
.equ Eddr = DDRB
.equ Epin = 0
.equ SPEED = 4
;****************************************************************************************************************************
INIT_LCD:
sbi RSddr, RSpin
cbi RSport, RSpin
sbi R_Wddr, R_Wpin
cbi R_Wport, R_Wpin ; Запись в дисплей RW
sbi Eddr, Epin
cbi Eport, Epin ; Опустили строб E
rcall OUT_PORT ;
rcall CLR_PORT
rcall DELAY_13107 ; Первая задержка в районе более 20 мс (после включения питания)
rcall DELAY_13107
rcall DELAY_13107
rcall DELAY_13107
;----------
ldi R18, 0b00110000 ; Команда установки 8 линий для инициализации (первый раз)
rcall DB_LINE ; Вызываем подпрограмму, которая отправит команду (тетраду)
rcall STROBE
rcall DELAY_13107 ; Вторая задержка больше 5 мс
;----------
rcall STROBE ; Команду на выходе никто не менял, значит просто строб
rcall DELAY_102 ; Задержка в 100 мкс
;----------
rcall STROBE
rcall DELAY_102 ; Задержка в 100 мкс
;----------
cbi RSport, RSpin ; Идет команда
ldi R18, 0b00100000 ; Команда установки 4 линии для инициализации (четвертый раз)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rcall DB_LINE ; Вызываем подпрограмму, которая отправит команду (тетраду)
rcall STROBE
rcall DELAY_102 ; Задержка в 100 мкс
;----------
cbi RSport, RSpin ; Идет команда
ldi R18, 0b00101000 ; Команда установки 4 линии и две строки (наконец-то прошла и вторая тетрада) (уже нормалный порядок битов в команде)
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00001000 ; Выключение дисплея
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00000001 ; Очистка дисплея
rcall CMD_WR ; Вызываем подпрограмму отправки команды
rcall DELAY_13107
ldi R18, 0b00000110 ; Установка режима вывода данных (сдвиг курсора вправо)
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ldi R18, 0b00001101 ; Включаем дисплей, курсор в виде квадрата
rcall CMD_WR ; Вызываем подпрограмму отправки команды
ret
;==============
STROBE:
sbi Eport, Epin ; Подняли строб
rcall DELAY ; Задержка более 500 нс
cbi Eport, Epin ; Опустили строб
rcall DELAY ; Задержка более 500 нс
ret
;----------
SYMBOL: ; Символ (код символа)
;ldi R18, @0
rcall DATA_WR
;.ENDM
ret
;----------
; .MACRO ADDRESS ; Адерс в формате Адрес (х,у) , где х - строка (1 или 2), у - позиция в строке (0...16)
; ldi R18, @0
; cpi R18, 1
; breq RAVNO ; Перейти, если равно, т.е. выбрана 1 строка
; ldi R18, (192+@1) ; А если выбрана 2 строка, то прибавляем к ее адресу (и команде) позицию
; rjmp W
; RAVNO: ldi R18, (128+@1) ; А если первая строка, то прибавляем к ее команде позиции
; W: rcall CMD_WR
; .ENDM
;*************************************************************************************************************
; ПРОЦЕДУРА записи байта команды в дисплей
CMD_WR:
; cli
; rcall BUSY ; Ждем готовности
cbi RSport, RSpin ; Идет команда
rjmp WRITE
;----------
; ПРОЦЕДУРА записи байта данных в дисплей
DATA_WR:
; cli
; rcall BUSY ; Ждем готовности
sbi RSport, RSpin ; Идут данные
;----------
WRITE:
rcall DB_LINE ; Вызываем подпрограмму, которая выведет значение тетрады в порт(ы)
rcall STROBE
swap R18 ; Перевернем тетрады местами
nop
rcall DB_LINE ;
rcall STROBE
rcall DELAY_102
;sei
ret
;===================
DB_LINE: ; Выводим тетраду в линии дисплея
rcall CLR_PORT
sbrc R18, 4 ; Пропустить слудующую, еслли бит сброшен
sbi DB4port, DB4pin ; Ставим бит
sbrc R18, 5 ; Пропустить слудующую, еслли бит сброшен
sbi DB5port, DB5pin ; Ставим бит
sbrc R18, 6 ; Пропустить слудующую, еслли бит сброшен
sbi DB6port, DB6pin ; Ставим бит
sbrc R18, 7 ; Пропустить слудующую, еслли бит сброшен
sbi DB7port, DB7pin ; Ставим бит
ret
;=====================
; BUSY: ; Ожидание флага занятости контроллера дисплея
; ; RCALL PORT_IN ; Порты на вход
;
; cbi RSport, RSpin ; Идет Команда!
; sbi R_Wport, R_Wpin ; Чтение!
;
; BusyLoop: sbi Eport, Epin ; Подняли строб
; rcall DELAY ; Задержка более 500 нс
; clr R18 ; Очистить переменную
; ;----------
;
; sbic DB7_PIN, DB7pin ; Пропустить следующую команду, если пин очищен = 0
; rjmp S1
; ldi R18, 0x00 ; Если очищен, делаем нулями
; rjmp Z1 ; и выходим
; S1: ldi R18, 0xFF ; А если не очищен, то делаем R17 единиц
; ;----------
; Z1: cbi Eport, Epin ; Опустили строб
; rcall DELAY ; Задержка более 500 нс
;
; sbi Eport, Epin ; Подняли строб (Дальше строб идет, но вторую тетраду мы не читаем,на нее пофиг)
; rcall DELAY ; Задержка более 500 нс
;
; cbi Eport, Epin ; Опустили строб
; rcall DELAY ; Задержка более 500 нс
;
; cpi R18,0x00 ; сравниваем флаг = 0? Дисплей свободен?
; brne BusyLoop ; Если нет, то переход
; ret
;----------
DELAY_102:
ldi R16, 255 ; Задержка ~102,4 mkсек
ldi R17, 1
Loop2: subi R16, 1
sbci R17, 0
brcc Loop2
ret
;----------
DELAY_13107:
ldi R16, 255 ; Задержка ~13.107 mсек
ldi R17, 255
Loop1: subi R16, 1
sbci R17, 0
brcc Loop1
ret
;----------
DELAY:
ldi R16, SPEED
loop: dec R16
brne loop
ret
;----------
CLR_PORT:
cbi DB4port, DB4pin
cbi DB5port, DB5pin
cbi DB6port, DB6pin
cbi DB7port, DB7pin
ret
;----------
OUT_PORT:
sbi DB4ddr, DB4pin ; Задаем направление порта на ВЫХОД
sbi DB5ddr, DB5pin
sbi DB6ddr, DB6pin
sbi DB7ddr, DB7pin
ret
;.include "LCD4.inc"
.exit
Спойлер
Студия 4.19- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ниче не понимаю... У меня студия глючила что ли??? Реально задолбался отлаживать... Всегда после инициализации дисплея выходила сразу на разрешение прерываний. Пропускала вывод символа... Прошу прощения, что отнял у вас время.

Станислав
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Бывает, бывает что студия дико глючит.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так вроде же официальная бесплатная среда разработки для АВР?!
Первый раз столкнулся просто. (не сильно часто получается новые программулины выдумывать).
Первый раз столкнулся просто. (не сильно часто получается новые программулины выдумывать).
Станислав
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну и что?СКАЗОЧНИК писал(а):Так вроде же официальная бесплатная среда разработки для АВР?!

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Должны поддерживать свое детище и фиксить ошибки своевременно. )))) 
Станислав
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Дык, поддерживают — качайте 6-ю 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А какую скачивать? там что-то много всего...
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
По мне довольно стабильная 4.19 build 730. Пока ещё можно найти здесь
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Уже 6.2 хочу. )) только не знаю какую. Просто 6.2 или 6.2 виз НЕТ?
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Шестёрка не понравилась. Херь какая-то монстрообразная.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
akl писал(а):По мне довольно стабильная 4.19 build 730.
Перед тем, как от нее отказаться и взяться за следующую, Атмели ее прилично вылизали
Нормальная среда, если не гнаться за суперновинками.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так все таки... За какую версию то??? .я уже скачал на всякий случай 4.19. Надо 6.2 качать нет?
Станислав
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если у Вас нет чипов, которые не поддерживаются студией 4.19 (то есть сильно новых), то 4.19 - самое то! Если же Вы соберетесь работать с этими суперновыми МК, которые студия 4.19 не поддерживает, тогда придется качать и ставить 6.хСКАЗОЧНИК писал(а):Так все таки... За какую версию то??? .я уже скачал на всякий случай 4.19. Надо 6.2 качать нет?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Опять хренота какая-то... Добился, чтобы работала программа. Решил еще один файлик вложить, в котором прописать макросы. Так вот, цепляю его на самом верху программного кода, где все библиотеки (инклуды), а потом в программе пишу макрос. сволочь жалуется, что для него это неизвестная команда...
Станислав
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Может, ошибка синтаксическая в названии команды? 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
С инклудами бывает такой косяк когда что-то в нем поправил (добавил функцию), а в другом файле делаешь например ее вызов и при компиляции вылезает такая ошибка. Дело в том, что исправленный файл почему-то студией не сохранился на диск (приходится перед компиляцией сохранять все вручную). Почему такое иногда выскакивает пока не просек 

Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Engineer_Keen писал(а):ошибка синтаксическая
Уже мильон раз проверил...
Engineer_Keen писал(а):файл почему-то студией не сохранился на диск
Как это так? Я же в папке его смотрел. Он там есть. Я просто создал новый файл, в нем сделал макрос. Дал файлу название в "Сохранить как...", потом подключил его в главной программе. И в главной же программе делаю вызов макроса, а он мне хрен..

Ептить!!!
Пару раз презагрузил студию, пару раз сохранил. Теперь все работает...
Короче. Совет. В любой непонятной ситуации, ПЕРЕЗАГРУЖАЙ СТУДИЮ!!
Станислав
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК писал(а):Дал файлу название в "Сохранить как..."
Бывает что файл сохранил, потом что-то в нем подредактировал, а изменения перед компиляцией автоматически не сохранились, как результат вылезает ошибка при попытке задействовать измененную часть программы, вот я о чем. Но у вас скорее всего проблема не в этом.
Глюкавая студия у вас какая-то, то код жрет, то с сохранением проблемы

Последний раз редактировалось Engineer_Keen Пт янв 16, 2015 12:44:23, всего редактировалось 1 раз.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)