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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 6
Зарегистрирован: Сб дек 05, 2015 23:21:05

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

Demiurg писал(а):
Shark-vc писал(а):...
AVR-Studio 4.19
к сожалению на виндовс 10 у меня отказывается ставиться. Попробовал так же скачать с сайта атмел последнюю версию, выдает ошибку при скачивании.

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

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

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

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

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

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

СКАЗОЧНИК писал(а):
Shark-vc писал(а):курсовая из-за него идет под каток :с
А вот это вы зря сказали... Теперь точно никто не поможет. По крайней мере бесплатно. и в этой теме, которая про ассемблер, а не про дисплеи. И так уже срачу развели.

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

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

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

Сообщение 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 КБ) 133 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

Сообщение 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-кам?
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

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

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

sbi PORT(TEST),0
Если сработает - ваша задача выполнима без лишнего геморроя.
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Vaha писал(а):Вопрос: - существует ли возможность includ-ы описывать, вставлять в верху файла, а их реальное размещение происходило по метке. Например: в файле "hex2ascii.asm" вставить строчку ".org pp_hex2ascii", а гдето в теле программы в нужном месте поставить метку "pp_hex2ascii:" - типа, чтоб сюда влился код из файла "hex2ascii.asm"?
Хм... Замудрёно как-то. Но если сильно хочется, то...
Если код в инклюде просто вставляется и исполняется. Нет вызовов процедур/функций внутри инклюдника извне, то оформить всё что есть в инклюднике как макрос, подключать инклюдник в начале, а где надо вставлять вызов макроса.
Vaha писал(а):.equ portB,0 = pinRS
Обычно наоборот :) Слева то, чему присваивают, справа то чему равно.

Может будет полезно (на русском) - тынц.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Возможно задам глупый вопрос.... Но иначе, у меня такой компактный код не получается, как у дЖЕдаев на форуме и я себя чувствую крайне не комфортно.
вот оператор AND или ANDI. Мы делаем
ПЕРЕМЕННАЯ И ПЕРЕМЕННАЯ (КОНСТАНТА).
Пусть у меня:

Переменная = 0b00010000, а константа 0b10011001, тогда если сделать с ними Логическое И, установится флаг Z (Флаг нуля/ Зиро)? ПОчему?

Я понимаю, если я делаю сравнение и вычитаю одно число из другого, тогда может установится флаг нуля. А здесь я в Логическом И получаю единицу только там, где единицы совпали, причем они будут в переменной совпавшие, а остальные останутся нулями.

О! Все. Пока писал понял. Спасибо. Вопрос снят. :facepalm: :))) :))) :)))
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СКАЗОЧНИК писал(а):О! Все. Пока писал понял. Спасибо. Вопрос снят.
Кстати, вот один из методов проверки регистра на равенство нулю без изменения его значения. Я сейчас не про AVR, а в общем

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

or Reg,0x00
Если регистр равен 0, то флаг Z будет установлен. Не во всех процессорах были команды типа TEST.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Всем доброго времени суток, помогите с компаатором на ат90с2313. Написал алгоритм с прерыванем по совпадению компаратора, а он почему-то работает по переполнению. Мож где то в коде накоячил.

Вот здесь http://radiokot.ru/forum/viewtopic.php? ... 8&start=20 в последнем посте архив с исходником и проэктом.
Только отставание не 10, а 2 сек. Тоесть у мк в минуте 62сек, что совпадает с переполнением.

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

Сообщение COKPOWEHEU »

ат90с2313 или AT90S2313?
Аналоговый компаратор или блок сравнения таймера?
Покажите инициализацию в человеческом виде (присвоение регистрам не магических чисел, а использование сдвигов и битовых операций, наличие осмысленных комментариев).
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Z_h_e писал(а):Не во всех процессорах были команды типа TEST.
А если и были, то это всего лишь другая мнемоника все той же команды AND Rx,Rx или ANDI Rx, 0xFF, так что недостающую TEST легко прописать макросом для любого камня :)
Изображение
Вложения
TST.JPG
(16.85 КБ) 970 скачиваний
Изображение
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Правую часть картинки не понял. Поясните, причем здесь команда LSL Rd(ADD Rd,Rd). Например, Rd=$80
Применительно к AVR можно сравнить с 0 регистровые пары R25:R24, XH:XL, YH:YL, ZH:ZL командами

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

 ADIW R24,0
 SBIW ZL,0
Jetetex писал(а):Всем доброго времени суток, помогите с компаатором на ат90с2313. Написал алгоритм с прерыванием по совпадению компаратора, а он почему-то работает по переполнению.
Да и не должен таймер срабатывать по переполнению. По сравнению со значением в OCR1A будет срабатывать.
Jetetex писал(а):...Только отставание не 10, а 2 сек. Тоесть у мк в минуте 62сек, что совпадает с переполнением.
Так и будет. Вы не включили режим CTC1, поэтому только первая секунда будет формироваться правильно.
Спойлер

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

	.INCLUDE "2313def.inc"
.equ	Fo=4000000

.def	temp=r16

.ORG 0
	RJMP	RESET
.ORG 4
Timer1_comp1:
	NOP
	RETI
reset:
	ldi Temp,RamEnd ;инициализация стека
	out SPL,Temp

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

	ldi Temp,0b01111000
	out ddrd,Temp

	ldi Temp,HIGH(Fo/64-1) ;инициализация компаратора
	out OCR1AH,Temp
	ldi Temp,LOW(Fo/64-1)
	out OCR1AL,Temp

;	ldi Temp,0xF4 ;инициализация компаратора
;	out OCR1AH,Temp
;	ldi Temp,0x24
;	out OCR1AL,Temp

	ldi Temp,0b01000000 ;разрешить прерывание компаратора
	out TIMSK,Temp
	OUT	TIFR,Temp

	ldi Temp,0b00001011 ;тактовый сигнал = Fo/64 режим CTC
	out TCCR1B,Temp

	sei

	RJMP	PC
.exit

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

Сообщение Jack_A »

Левая часть иллюстрирует тот факт, что команда TST - не что иное, как команда AND регистра самим с собой. Правая к этому факту отношения не имеет; это пример, что и некоторые другие команды - не что иное, как другая мнемоника уже известной команды. В самом деле, сложить регистр с самим собой = сдвинуть значение на один разряд влево.
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Jack_A писал(а): то это всего лишь другая мнемоника
А я все думал, на кой ляд в AVR куча дублирующих команд, а их оказывается нет. Проверить лень было, вернее все хотел посчитать какое реальное количество команда камня AVR, но так и не посчитал.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Вопрос по компаратору снят. Пока ждал ответа - дотумкал. По недосмотру при обработке прерывания обнулял не тот регистр.

Вместо TCNT1 (значения самого таймера) обнулял OCR1A (значение компаратора). в результате после 1й секунды он считал от 0 до 65536, тоесть 1,048 сек.

Всем спасибо за помощь.

=======
COKPOWEHEU писал(а):ат90с2313 или AT90S2313?
AT90S2313
COKPOWEHEU писал(а):Аналоговый компаратор или блок сравнения таймера?
Даже из приведенного куска кода видно, что используется компаратор первого таймера -

Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp
COKPOWEHEU писал(а):Покажите инициализацию в человеческом виде (присвоение регистрам не магических чисел, а использование сдвигов и битовых операций, наличие осмысленных комментариев).
В архиве (см пост выше) есть исходник, там весь текст программы.

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

Сообщение Vaha »

Kavka - Спасибо за "тынц", - полезная штука (как для меня, распечатал, полистываем :) ).
И на счет директивы .EQU - сперва что присваиваем, потом кому., в моем случае:

.EQU pinRS = portB0

следует обратить внимание на "portB0" - если в программе пишем "portB,0" - через запятую указываем пин, то при присвоении - нужно писать слитно :shock: (долго мучело - мяучело, подсмотрел на просторах "сети" :idea: )
И еще раз спасибо. :beer:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Jetetex писал(а): Даже из приведенного куска кода видно, что используется компаратор первого таймера -
Поскольку нормальной ссылки на код не было и нет, в первую очередь приходится судить по описанию. А под термином "компаратор" в первую очередь понимают именно аналоговый компаратор, а вовсе не блок сравнения таймеров.
Jetetex писал(а): В архиве (см пост выше) есть исходник, там весь текст программы.
Что мешало дать нормальную ссылку на тот код, который вы пытались скомпилировать? Посыл "где-то в той теме, в последнем посте" воспринимаются как "ищите сами, если найдете ошибку - не то нашли". Если имелось в виду вот это, то там всего один файл, отдаленно похожий на код, и тот не исходник. Зачем копировать туда содержимое стандартных заголовочных файлов? Зачем там адреса и коды команд? Куда уползает форматирование? Почему ни одна настройка не сделана по-человечески (со сдвигами, логическими операциями и комментариями)?
Вот, например
Timer1_comp1:
| 000063 E040 | ldi Temp,0 ;обнуление таймера
| 000064 BD4D | out TCNT1H,Temp
| 000065 BD4C | out TCNT1L,Temp
| 000066 3050 | cpi Temp5,0b00000000
| 000067 F011 | breq point_on
| 000068 E050 | ldi Temp5,0b00000000
| 000069 C001 | rjmp Shift
| 00006A E850 | point_on: ldi Temp5,0b10000000
Зачем-то прокомментировано обнуление TCNT1, хотя эта операция и так видна из кода. Зато сравнение Temp5 с 0b00000000 оставлено без внимания. Что такое Temp5? Что такое 0b00000000, что его пришлось записывать в двоичной форме? Только имя метки относительно осмыслено (это включение десятичной точки?).
.
И на счет директивы .EQU - сперва что присваиваем, потом кому., в моем случае:
Вообще-то сначала чему присваивает, потом что, в вашем случае pinRS <- PortB0, то есть присвоить "переменной" pinRS значение PortB0, то есть 0 (не особо понимаю, чем в данном случае константы portB0, pinB0, ddrB0, PB0 и т.п. лучше простого десятичного числа 0, но, видимо, кому-то нравится).
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Прошу прощения. Пересмотрел тот архив и понял что не все положил. :roll:

Проект закончен, осталось только собрать. Если кому интересно, все в архиве (исходник тоже, ПДФ файл - плата). В протеусе все работает, комментарии старался оставлять, но довести до ума никак не соберусь.

Так вот, после сборки возникла проблема - не заводится контроллер. При касании пальцем к 5-й ноге МК как бы заводится, но походу на малых частотах (индикатор моргает поочередно, нарушены знаки), убираешь рука, снова тухнет. Подскажите кто в курсе, куда копать, или где можно найти внятную информацию.
Вложения
Alarm_Clock.rar
(76.49 КБ) 138 скачиваний
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Ответить

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