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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Ну почти убедили. Я в своих железках, разошедшихся в сотнях экземпляров в самые-самые промышленные условия, выводил инфу по классике : появилась - скинул. Жалоб не было. А от помех может не только ЖКИ слететь, но и функционал прибора пострадать. Не получится так: больному хорошо под наркозом, а что унутре - вскрытие покажет :( ?
Впрочем, это отвлечение в сторону.
Насчет : опрос флага увеличит время... При выводе - да. А в паузах при стабильной инф. время уходит только на опрос флага. В целом в среднем - должно быть короче.
Жаль, что я уже не практикую, попробовал бы; интересный вариант.
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Jack_A писал(а):...

Пример использования такого способа работы с дисплеем. На видео VFD, но это полный функциональный аналог ЖКИ.
Лень заново писать, скопировал с другого форума:
концепция:

Смотрим в сторону ПЛК. Есть модуль процессора, панель оператора, расширение ввода-вывода. Эти блоки абсолютно самостоятельны. В модуле процессора крутится только программа цикла работы оборудования. Панель оператора вообще модуль с собственной операционной системой. Для панели оператора создается свой проект. И для вывода информации панель операторы опрашивает модуль процессора, тот выдает нужные данные. Набор данных зависит от состояния, в котором находится программа панели оператора. Скажем исходный режим - отображение одной информации, при входе в параметры отображается другая информация.

Именно такой подход я использую в последнее время в своих проектах. Только модули программные. Модуль аппаратной части дисплея. Модуль вывода информации. Модуль управления устройством, для которого текущий проект и создается. И этот подход полностью себя оправдал. Все модули абсолютно самостоятельны. Нет взаимосвязей. Легко отлаживать и проекты создаются в разы быстрее.

Если вы собираетесь использовать графический дисплей, тем более для станка, то для дисплея вам нужно создать отдельный проект, который будет получать значения переменных, рабочие данные. И в зависимости от состояния показывать нужную информацию. То есть, делать что-то вроде панели оператора.

Плюсы - проекты гораздо легче создавать и отлаживать. Разгружается "модуль процессора". Он теперь занят только циклом работы оборудования.
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

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

Сообщение dr.doc »

Александр Писанец (у него канал на youtube) решил проблему помех с дисплеем след. образом: с некоторой периодичностью считывается информация из дисплея и сравнивается с той, что ему передали из буфера. При не совпадении - повторная инициализация (своего рода watchdog timer).
Как показывает практика, на дисплее остается часть кракозябр. Поэтому нужно либо очищать его (примерно 4,1 мС) либо инициализировать его, не дожидаясь установления питания (около 6 мС).
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

dr.doc писал(а):...

У меня дисплей работает без опроса флага и только на прием данных. Каждый полный цикл обновления переинициализация дисплея. То есть каждые 20*4+4 адреса строк = 84 мс. Но! VFD дисплей работает быстро, у него вообще нет задержек.
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

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

Сообщение dr.doc »

Вы когда нибудь помехи хорошие ловили? У меня была ситуация со стабилизатором сетевого напряжения, когда watchdog сбрасывался несколько раз перед тем как сработать. Выявлялось так: динамическая индикация на семисегментник в прерываниях по 250 мкС. Собака настроена на 30 мС (примерно). Период сетевого напряжения (отсчеты АЦП) "вдвигаются" в буфер. Происходит расчет текущего значения, а потом выносится решение о переключении выходов реле и обновление выводимого значения на индикатор. Watchdog сбрасывается только после обновления выводимого на семисегментник значения, т.е. примерно через 22 мС.
От помех "завис" контроллер - горела только одна цифра. И продолжительность ее свечения составляла примерно одну секунду. Собаку проверял специально отдельным участком кода при помощи осциллографа и "иголки" на выводе контроллера. Думаю, что 44780 в этих условиях просто потух бы...
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Я хорошие помехи словил один раз, еще на заре своей практики. МК сбрасывался при включении электромагнитных клапанов на 220 V. Сделал из этого выводы, и больше никогда "не ловил помех".
Борьба с помехами - комплексная. Развивать эту тему не буду. Некогда. Методы борьбы с помехами подробно описаны в различных источниках.
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

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

Сообщение dr.doc »

Суть не в борьбе с ними, а в том, что постоянное обновление дисплея иногда даже вредно, т.к. не всегда понятно, от чего происходит та или иная нештатная ситуация. А дисплей - этакий индикатор. Просто нужно решить для себя, что важнее: устойчивая работа узла или стабильный вывод показаний. Я, например, столкнувшись раз с подобным, сделал для себя след.: раз в 0,5-1 сек. (если не требуется чаще) читаю дисплей, сравниваю с буфером, после этого либо сразу пишу новые данные, либо иду на инициализацию, а потом пишу данные.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Попробуйте сделать простой опыт. Соберите макетку с минимумом. МК, кварц, дисплей. Забейте все знакоместа чем-нибудь. И оставьте все дело включенным на длительное время (несколько суток). Ессно, БП должен быть с хорошим качеством питания. И я вам гарантирую, через некоторое время работы на дисплее будут кракозябры. Кстати, дисплей можно не забивать данными. Достаточно проинициализировать его.
Shark-vc
Родился
Сообщения: 6
Зарегистрирован: Сб дек 05, 2015 23:21:05

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

Сообщение Shark-vc »

Demiurg писал(а):
Shark-vc писал(а):...

У тебя либо инициализация хромает, либо аппаратная часть (непропай, замыкание, обрыв). Возможно просто нужно подкрутить контростность.
Я даю тебе архив с рабочей либой для ЖКИ. У меня 20х4, 4-битный интерфейс. Работает либа так: раз в 1 мс, посимвольно отправляется содержимое буфера на дисплей. В программе работаем с буфером. Но можно работать и напрямую с дисплеем. Разбирайся сам. Отвечу только на уточняющие вопросы.


вы в чем писали? я не могу открыть проект. Я например работал в протеусе 8.1.

Есть еще люди которые знают и могут помочь с ЖКИ lm016l на АТмеле 8535 , на ассемблере?
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

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

Сообщение dr.doc »

Четырехбитное - делал. Исходник для ATtiny2313, но принципиальной разницы нет. Код под Atmel Studio.
Вложения
Readme.txt
(3 КБ) 245 скачиваний
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Shark-vc писал(а):...

AVR-Studio 4.19
OKF
Это не хвост, это антенна
Сообщения: 1388
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Demiurg писал(а):Попробуйте сделать простой опыт. Соберите макетку с минимумом. МК, кварц, дисплей. Забейте все знакоместа чем-нибудь. И оставьте все дело включенным на длительное время (несколько суток). Ессно, БП должен быть с хорошим качеством питания. И я вам гарантирую, через некоторое время работы на дисплее будут кракозябры. Кстати, дисплей можно не забивать данными. Достаточно проинициализировать его.

О)) Супер! От альфа частиц штоле? Однако... И как только тогда всё ВООБШЕ работает!
Аватара пользователя
dr.doc
Это не хвост, это антенна
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

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

Сообщение dr.doc »

Вполне возможно что и от них... Только речь шла про частоту обновления дисплея и возможность ее порчи за длительное время. Только как - то слабо соотносится заявленный автором интервал обновления данных в 1 мС и несколько суток.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Shark-vc
Родился
Сообщения: 6
Зарегистрирован: Сб дек 05, 2015 23:21:05

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

Сообщение Shark-vc »

Demiurg писал(а):
Shark-vc писал(а):...

AVR-Studio 4.19


к сожалению на виндовс 10 у меня отказывается ставиться. Попробовал так же скачать с сайта атмел последнюю версию, выдает ошибку при скачивании.

Народ,хелп, помогите с ЖКИ lm016l , курсовая из-за него идет под каток :с
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Shark-vc писал(а):курсовая из-за него идет под каток :с

А вот это вы зря сказали... Теперь точно никто не поможет. По крайней мере бесплатно. и в этой теме, которая про ассемблер, а не про дисплеи. И так уже срачу развели.

простите за оффтоп. Можно его удалить. :facepalm: :oops:

З.Ы. Не ставится АВР Студио 4.19, значит снесите свою винду 10 и поставьте винду 8... Вот и все решение проблемы.
Станислав
Shark-vc
Родился
Сообщения: 6
Зарегистрирован: Сб дек 05, 2015 23:21:05

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

Сообщение Shark-vc »

СКАЗОЧНИК писал(а):
Shark-vc писал(а):курсовая из-за него идет под каток :с

А вот это вы зря сказали... Теперь точно никто не поможет. По крайней мере бесплатно. и в этой теме, которая про ассемблер, а не про дисплеи. И так уже срачу развели.

простите за оффтоп. Можно его удалить. :facepalm: :oops:

З.Ы. Не ставится АВР Студио 4.19, значит снесите свою винду 10 и поставьте винду 8... Вот и все решение проблемы.



ну значит это не форум, а цирк еврейский,зачем он нужен если тут все ради денег тогда сидят?)
И раз уж такая пьянка, то мне уже помогли ребята с киберфорума)
Vaha
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пт окт 11, 2013 20:43:07
Откуда: с. Муравлёвка Измаильский р-н.

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

Сообщение Vaha »

Здравствуйте.
Имеется "asm" программа, писанная на "AVRStudio" под Atmega8 для просмотра знакогенератора ЛСД экранчиков на основе HD44780 микроконтроллеров. Программа состоит из основной "LSD_4pin_m8.asm" и 4-х ("m8def.inc" - не считаю - это как само сабой... ) includ-ных файлов: "m8_ini_st.asm", "ini_LCD_4pin.asm", "zad.asm", "hex2ascii.asm" .

LSD_4pin_m8.asm:
Спойлер

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

 


 .include "m8_ini_st.asm"  ;ATmega8 + стек

 ;используемые переменные

      .def dat_LCD = r17
      .def temp  = r16
 ;----------

          .cseg          ;данная директива означает, что дальше идет код программы

       rcall ini_lcd    ; Инициализация портов и ЛСД., и п/п записи команд и кода в ЛСД по 4-и шинам
                            ; используемые порты D (D4...D7) и B (B0, B1)
                            ; данные загружаем в "dat_LCD" он же - R17 и идем на ... "zap_dan" (rcall zap_dan)
                            ; команды загружаем в "dat_LCD" он же - R17 и идем на "zap_com" (rcall zap_com)


;==========  программа =========
; программа просмотра символов ЛСД
; от 0 до 255 - просматриваем знакогенератор ЛСД

m1:      ldi r24,0x00
            mov r0,r24     ; R0 - счетчик и hex код для преобразования

m2:      ldi dat_lcd,0x83; устанавливаем курсор в 6-ю позицию
            rcall zap_com   ;

            rcall pr_hex  ; преобразование hex в ASCII
            mov dat_lcd,pr_dat_h; выводим старшее значение hex кода
      rcall zap_dan
      mov dat_lcd,pr_dat_l; выводим младшее значение hex кода
      rcall zap_dan
      ldi dat_lcd,0x3d  ; знак "="
      rcall zap_dan
      ldi dat_lcd,0x3e  ; знак ">"
      rcall zap_dan
      mov dat_lcd,r0    ; сам hex код на выход
      rcall zap_dan
      ldi temp,255       ; задержка между выводим символов
      rcall zad_b_
      rcall zad_b_
      rcall zad_b_
      rcall zad_b_
      inc r0                 ; следующий знак
      mov r24,r0
      brne m2        ; тут можно поставить и "rjmp m2", ну чтобы флаги зря не проподали...
      rjmp m1

.include "ini_LCD_4pin.asm"
.include "zad.asm"
.include "hex2ascii.asm"


m8_ini_st.asm:
Спойлер

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

 

.nolist                       ;данная директива отключает генерацию кода в листинг,
                                ; т.е. далее в файле *.lss не будет фиксироваться
                                ;ассемблерный код
 .include "m8def.inc"  ;подключение стандартного заголовочного файла для ATmega8
 .list                          ;данная директива включает генерацию кода в листинг, т.е.
                                ;далее в файле *.lss будет фиксироваться ассемблерный код


  ;УСТАНОВКА СТЕКА
      ldi   R16,low(RAMEND)        ;скопируем в R16 младщий байт из константы RAMEND,
                                               ;которая определена в m8def.inc и хранит размер SRAM
          out   SPL,R16                  ;скопируем значение из R16 в SPL
          ldi   R16,high(RAMEND)   ;скопируем в R16 старший байт из константы RAMEND,
                                                ;которая определена в m8def.inc
          out   SPH,R16                 ;скопируем значение из R17 в SPH


ini_LCD_4pin.asm:
Спойлер

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

 

; Инициализация портов и ЛСД., и п/п записи команд и кода в ЛСД по 4-и шинам
; используемые порты D (D4...D7) и B (B0, B1)
;
;+++++++++  описалово  ++++++++
;
; инициализация портов для ЛСД и самого ЛСД - точка входа: "ini_lcd"
;
; данные загружаем в "dat_LCD" он же - R17 и идем на ... "zap_dan" (rcall zap_dan)
; команды загружаем в "dat_LCD" он же - R17 и идем на "zap_com" (rcall zap_com)
;
;++++++++++++++++++++++++++++++

;----------
;   обознач. на схеме     выводы на mega8,   на ЛСД

         .set RS = 0    ;В0(14)   <=>   RS(4),
         .set E =  1    ;B1(15)   <=>   E(6)
         .set D4 = 4    ;D4(6)    <=>   D4(11)
         .set D5 = 5    ;D5(11)    <=>  D5(12)
          .set D6 = 6    ;D6(12)    <=>  D6(13)
         .set D7 = 7    ;D7(13)    <=>  D7(14)

;.equ  portB,1  = pinE
;.equ   portB,0 = pinRS


;----------
;используемые регистры

      .def dat_LCD = r17
      .def temp  = r16

ini_lcd:

; используемые порты D и B
;  --- настройка портов

        ldi temp,0xff
        out ddrD,temp  ; порт D на Выход
        out ddrB,temp  ; порт B на Выход
        ldi temp,0x00
        out portD,temp  ; обнуляем порт D
        out portB,temp  ; обнуляем порт B

; --- инициализация ЛСД 4 шин
      ldi temp,255               ; в данном случае - максимальная задержка
      rcall zad_b_
      rcall zad_b_                 ;задержка после подачи питания

      ldi dat_LCD,0x20         ; включить 4-и шинный обмен 1 строка (0x28 - 2 строки)
      cbi portB,RS                 ; LCD - прием команд
      rcall save1                    ; запись
      ldi dat_LCD,0x28           ; включить 4-и шинный обмен 2 строка (0x20 - 1 строки)
      rcall zap_com
      rcall zad_m

      ldi dat_LCD,0x01           ; очистка памяти, курсор с лева
      rcall zap_com
      ldi temp,0xff               ; большая задержка
      rcall zad_b_

      ldi dat_LCD,0x0e          ; вид курсора
      rcall zap_com
     ldi dat_LCD,0x06           ; авто-сдвиг в право
    rcall zap_com
    ret

;----- запись команд в ЛСД -----8


zap_com:
    cbi portB,RS    ; LCD - прием команд
    rjmp save

;----- запись данных в ЛСД -----

zap_dan:
    sbi portB,RS    ; LCD - прием данных


; -- процесс записи ----------
save:
    push dat_LCD           ; подготовка старшего полубайта (команды или данных):
    andi dat_LCD,0xf0    ; очищаем младший  полубайт
    rcall save1               ; запись старшего полубайта (команды или данных)
    pop dat_lcd
    swap dat_LCD           ; подготовка младшего полубайта (команды или данных)
    andi dat_LCD,0xf0     ; очищаем младший  полубайт
                                    ; запись младшего полубайта (команды или данных)
save1:
         sbi portB,E            ; подготовка строба
          rcall zad15
          out portD,dat_LCD  ; вывод  полубайта (команды или данных) на шины
          rcall zad15
           cbi portB,E            ; строб записи полубайта (команды или данных)
          rcall zad15
          ret

hex2ascii.asm:
Спойлер

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

 

;Преобразование hex кода в код для вывода на печать.
;
; П/П преобразования использует R24, R25
;
;(((((((((((((: ОПИСАЛОВО :))))))))))))))))
; - 1 -------
; Вход:  для преобразования байта, оный заносим в  r24 (pr_dat_l)
; точка входа "pr_hex"
;
; Выход: "pr_dat_h" = r25 - старший символ от входного (r24 (pr_dat_l)),
;          pr_dat_l = r24 - младший символ
;
; - 2 ------
; Вход: для преобразования полубайта, оный заносим в r24 (pr_dat_l) младшие разряды (4-0)
;  точка входа "pr_polu_bait"
;
; Выход: "pr_dat_l" = r24
;
;(((((((((((((((((((((((()))))))))))))))))))))))

;===============
  ;используемые переменные

      .def pr_dat_h = r25
      .def pr_dat_l  = r24
pr_hex:
     mov pr_dat_h,pr_dat_l      ; запоминаем младший  полубайт
    swap pr_dat_l                    ; подготавливаем старший полубайт
    rcall pr_polu_bait                  ; идем преабразовывать
    push pr_dat_l                       ; запоминаем результат старшого полубайта
    mov pr_dat_l,pr_dat_h       ; младший полубайт на обработку
    pop pr_dat_h                    ; старший результат в "pr_dat_h" R25
    rcall pr_polu_bait
    ret


pr_polu_bait:
              andi pr_dat_l,0x0f           ; очищаем старший полубайт
              cpi pr_dat_l,0xa              ; узнаем это цифра или буква (R24-9)
              brcc bukvi                   ; флаг переноса очищен => R24>9 т.е буквы A,B,C,D,E,F
              ori pr_dat_l,0x30          ; если цифра - добавляем в старший полубайт 30h чтоб
              ret                              ;получить код ascii... код готов
bukvi:    subi pr_dat_l,0x9          ; если буква - корректируем...
             ori pr_dat_l,0x40          ; добавляем 40h. код готов.
                 ret

zad.asm:
Спойлер

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

 

;---- задержка -----
;
;--------- описалово ----------
;
; используемые регистры R14,R15,R16
; R16 - он же "temp" - для загрузки констант, которые определяются самим писуном,
;                               в зависимости от частоты камняи и т.д...
; R14, R15 - счетные регистры - соответственно для малой и большой задержок
;
; ВХОДЫ - zad_m; zad_b - соответственно для малой и большой задержок - с
;                                      записанными константами
;    zad_m_; zad_b_ - соответственно для малой и большой задержок с привнесенной
;                                    константой в R16 - он же "temp"
; ВЫХОД - зря потраченное время :)
;----------

;.org pp_zad

  .def temp  = r16

;   ---- малая задержка ---

zad_m:      ldi temp,255
zad_m_:    mov r14,temp
l_zad_m:  dec r14                ;R14-1
                brne l_zad_m      ;переход если R14 <> 0
                  ret
zad15:  ldi temp,15
                rjmp zad_m_

;   ----множитель малой задержки ---

zad_b:     ldi temp,123
l_zad_b:   rcall zad_m
               dec r15
                brne l_zad_b
                   RET
zad_b_:    mov r15,temp
l_zad_b1:  rcall zad_m_
               dec r15
               brne l_zad_b1
                RET



И тут у меня два вопроса:
1) Эти includ-ы, где вставил, там и начинается соответствующий код - это как-бы логично, понятно.
Вопрос: - существует ли возможность includ-ы описывать, вставлять в верху файла, а их реальное размещение происходило по метке. Например: в файле "hex2ascii.asm" вставить строчку ".org pp_hex2ascii", а гдето в теле программы в нужном месте поставить метку "pp_hex2ascii:" - типа, чтоб сюда влился код из файла "hex2ascii.asm"?
2) В файле "ini_LCD_4pin.asm" адресу "portB,0", что в данном случае, соответствует выводу "RS" на ЛСД, хотел директивой ".equ" присвоить имя "pinRS" - ".equ portB,0 = pinRS" но AVRStudio выдает ошибку. Хотя в файле "m8def.inc" такое "безобразие" сплошь и рядом творится. Пробовал строчку (.equ portB,0 = pinRS) в этот файл добавить - тоже ругается. Чего посоветуете?
Спасибо.

Проект к AVRStudio:
Вложения
LSD_4pin_mega8.rar
(12.02 КБ) 126 скачиваний
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Препроцессор AVR-ассемблера довольно ущербный, так что сомневаюсь.
1. Не слышал про такое. Как и про необходимость такого. Что-то мешает подключить внешние файлы после области векторов прерываний?
2. В файле m8def.inc такого нет. Вроде, ассемблер не позволяет присвоить одному макросу два значения. С этим даже в Си не так просто.
Впрочем, можете воспользоваться препроцессором из Си, там вполне можно объявить макросы как #define LCD_RS D,5, а потом другими макросами разворачивать это в DDRD, PORTD, PIND, 5 и операции с ними.
Еще одна возможность, в которой я еще более неуверен - использовать GNU-ассемблер, хотя синтаксис там сильно отличается.
Vaha
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пт окт 11, 2013 20:43:07
Откуда: с. Муравлёвка Измаильский р-н.

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

Сообщение Vaha »

1)Это как бы и не совсем внешний файлы, так сказать, куски кода, которые по отдельности легче отлаживать. Место где они будут описываться в "Main" файле тоже, как бы особого значения не имеет. Их описание в начале файла придавало-бы тексту читабельности, на мой взгляд.
Вставить их после области векторов прерываний и перепрыгнуть "rjmp" - вопросов нет., это если куски кода имеют вид законченных подпрограмм. Возьмем, например, подпрограмму задержки, и уберем последний "ret" (возврат из подпрограммы) - и у нас получится функционально законченный кусок кода, который можно вставлять в нужные ( и не очень :-)) места. Описать его в начале (либо в другом месте), а вливаться ему в программу по указанной метке. (Но это уже, наверное, из области макросов в коих я пока вообще никак.)
2)Опять эти макросы... в файле "m8def.inc" меня "вдохновили" многочисленные строки:

; ***** BOOTLOADER DECLARATIONS ******************************************
.equ NRWW_START_ADDR = 0xc00

......

.equ SMALLBOOTSTART = FIRSTBOOTSTART
.equ LARGEBOOTSTART = FOURTHBOOTSTART

мне и подумалось, что если им можно, то почему мне нельзя?, ан-нельзя, видать умом пока еще не вышел :) А так хотелось - указал в начале (либо в другом месте) программы, что нулевой пин порта "B" - это здесь и далее по тексту обозначается как "pinRS", - то при замене на любой другой вывод, надо только переназначить "pinRS" и не гонятся по всему тексту за "portB,0".
А на счет "GNU-ассемблер" - мне бы хотя бы с макросами разобраться... Может есть чего почитать про макросы, обязательно с примерами, и поближе к AVR-кам?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Так там тоже самое примитивное - "переменная"="значение". Это вы хотите, чтобы "переменная"="4 значения", обычный avr-ассемблерный препроцессор так не умеет.
Можете попробовать gcc-подобные макросы, сработает или нет.

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

#define TEST B
#define _PORT(x)  PORT##x
#define PORT(x) _PORT(x)

sbi PORT(TEST),0
Если сработает - ваша задача выполнима без лишнего геморроя.
Ответить

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