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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

:shock: :shock: :shock:
Каким образом из 8 у тебя получается 2???


Все понял!

вот блин, сам же написал "формат BCD"
сделай так:

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

     ldi   tmp,0x18
..................
..................
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

GP1 писал(а):to MTF
1. Судя по коду ты собираешься выводить индикацию в обработчике прерывания T0_OVF, ИМХО это ламерство, без обид, в прерывании формируй флаг, а всю обработку в основном теле программы.

В чем таки заключается ламерство, уважаемый GP1? Встречал проф. программы в которых основное тело как раз и состоит из обработчика прерывания. И что в этом не так?
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Прерывания должны быть короткими.Чем дольше система находится вне основного цикла, тем хуже.
Если обработка прерывания может содержать пару команд, то конечно лучше пусть там и будут (типа прочитать и записать). А если код больше 8..10 команд, то лучше в обработке прерываний выставить признак того, что нужно выполнить некий код обработки и вернуться в основной цикл, в котором определяется переход на этот самый код обработки.
Еще раз повторюсь, механизм (так его назовем) прерываний - придуман для исключительных ситуаций. И чем быстрее система вернется в нормальное состояние, тем лучше.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

Нет, Вы меня не убедили.
Все это условности, основной цикл - не основной цикл. Все определяется данной конкретной целесообразностью. Ну например, мы занимаемся динамической индикацией и по приходу прерывания по таймеру выполняем кучу полезных дел. Как то: выводим очередной разряд на индикатор, опрашиваем клавиатуру, проверяем и обрабатываем датчики, работаем с синхронными устройствами типа 1-wire, и т.д. и т.п. и если есть время уходим в Ваш любимый основной цикл. Там можно поработать с чем-нибудь асинхронным типа I2C и т.п. А Вы предлагаете, чтобы в основном цикле я только и занимался проверкой: а как поживает мой любимый флаг (признак), откинулся или еще нет? :dont_know:
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

разбираюсь с flash переделал процедуру display

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

.equ   OutPort    =  PORTB
.equ   dg1   =pb1
.equ   dg2   =pb0
.def    tmp       =  r16
.def    tmp1         =  r17 ;
;****************
.equ   pin_dat   =pd5         ;*** оч.рекомендую делать именно так
.equ   pin_clk   =pd6
.def   n   =<какой нибудь регистр>
.def   flags   =r19         ;*** определяем регистр флагов
.equ   tind   =7      ;*** и назначаем флаг индикации



.dseg     ;SRAM memory segment
disp :      .byte   2      ; буфер для индикации

.cseg
disp_pos:   .db   0xF7 ,  0xFB    ;   позиция  для инд 

     ; цифры      "0"       "1"      "2"      "3"      "4"      "5"      "6"      "7"      "8"      "9" 
table_code: .db 0xDB , 0x48 , 0xE3 , 0xEA , 0x78 , 0xBA , 0xBB , 0xC8 , 0xFB , 0xFA



;=================
T0_OVF:
.......................
.......................
   sbr   flags,tind         ;*** установить бит, время индикации истекло
   reti
;================ INDICATION =====
display:
          clr     n         ;
next_digit:

;---------- OFF IND ----------
          in           tmp ,  portb      ;чтение portB       ;*** здесь все норм.
          ori          tmp ,  0x03      ;в 1 pb0 , pb1
          out         portb, tmp        ;погасить  индикатор
;----------
          ldi          ZL , disp_pos*2    ; загр в Z поз индик
          ldi          XL , disp              ;  загр в  X буфер disp 
          mov       tmp , n 
          add        ZL , tmp
          add        XL , tmp
          ld           tmp , X
         
;---------- Вывод в 74LS164 ----------
         ldi           tmp1 , 8   ;8 bits
LS164:
         cbi          portd, pin_dat       ;*** сбрасываем пин в 0
         lsl           tmp                       ;***выдавливаем бит в СY
         brcc        ls164_0
         sbi          portd, pin_dat       ;*** устанавливаем в 1 если CY=1
ls164_0:
         sbi          portd,  pin_clk   ;CLOCK strobe for 74LS164
         cbi          portd,  pin_clk   ;CLOCK strobe for 74LS164
         dec         tmp1      ;dec
         brne       LS164      ;если не 0  то LS164

;*** в регистре нужный код , приступаем к индикации
;*** сбрасываем флаг индикации
         cbi         flags , tind
;---------- ON IND ----------
         in          tmp ,  portb    ;чтение portB       ;*** здесь все норм.
         lpm
         and       tmp ,  r0         ;  pb0 или  pb1   disp_pos
         out        portb, tmp      ;  включ  индикатор
;----------
tind1:
         sbis       flags,tind      ;*** и ждем переполнения счетчика
         rjmp      tind1
         inc         n
         cpi         n , 1
         brne      next_digit       
ret
;=================


Вот основной цикл !!!!

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

; main prog
.......................
.......................
; загрузка в буфер disp  числа 10     
    ldi     XL  ,  disp    ;  загр disp  в  X
    ldi     tmp ,  1       
    rcall  bcd_disp
    ldi     tmp ,  0
    rcall  bcd_disp
M1:   
   
    call   display         ;***вызов процедуры индикации
.......................
.......................
   rjmp   M1

bcd_disp:   ; преобр в семисегментный  код
   push   tmp
   andi    tmp 
   ldi       ZL , table_code*2
   add     ZL , tmp
   lpm
   st        X+ , r0   ;запись  в  disp  кода   
   pop     tmp
   ret



Вопрос :
1 . проблема в bcd_disp почему то не по порядку , а как вздумается
записывается в буфер DISP , коды table_code ?????

2 . вторая проблема никак не пойму как преобразовать числа > 9 (пример из avr204 не понял), для записи в буфер disp как двух байтные ???
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

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

Сообщение smac »

IM1 писал(а):Нет, Вы меня не убедили.
Все это условности, ...

Когда вы выполняете кучу дел в прерывании остальные прерывания как правило нервно курят в сторонке, так и данные какие-либо можно пропустить. В этих случаях "особо дальновидные товарищи" начинаю говорит о вложенных прерываниях и т. п. Вложенные прерывания - штука, может быть и хорошая, но нужна крайне редко, при Вашем же подходе, наверняка решением будут как раз они. В результате стек залезает на область переменных, после чего никто и ничто не спасет программу от былинного облома.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

IM1 писал(а):Нет, Вы меня не убедили.
Все это условности, основной цикл - не основной цикл. Все определяется данной конкретной целесообразностью. Ну например, мы занимаемся динамической индикацией и по приходу прерывания по таймеру выполняем кучу полезных дел. Как то: выводим очередной разряд на индикатор, опрашиваем клавиатуру, проверяем и обрабатываем датчики, работаем с синхронными устройствами типа 1-wire, и т.д. и т.п. и если есть время уходим в Ваш любимый основной цикл. Там можно поработать с чем-нибудь асинхронным типа I2C и т.п. А Вы предлагаете, чтобы в основном цикле я только и занимался проверкой: а как поживает мой любимый флаг (признак), откинулся или еще нет? :dont_know:
тут все дело в системе оценок... когда вы собираетесь починить часы, вы запасаетесь пинцетом и лупой, а 300 лет назад мастер располагал кусачками и молотком... да, были левши и тогда, которые могли починить часы, но согласитесь, что это скорее исключение, чем правило...

так и с прерываниями и основным циклом. если вы не владеете навыками программирования в достаточной мере, чтобы распределить задачи по основному циклу и прерываниям, вы, конечно, станете отстаивать свой подход - пихать все куда попало, лишь бы работало... да, покуда работает - этот подход имеет право на жизнь... но все-таки есть ряд писаных и неписаных правил, по которым строятся программы... и основа тут не достижение работоспособности, а достижение ГАРАНТИИ работоспособности, что, согласитесь, не одно и то же...

я встречал проекты, где динамическая индикация делалась в основном цикле, а измерение и формирование символов для вывода делались по прерываниям... не смотря на то, что это были реально работающие проекты, я никогда не поставил бы их ряд "образцов для подражания". поймите меня верно :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

ARV, Meteor, спасибо за поддержку! :beer:

MTF, сейчас немного занят, восстанавливаю комп, 2 дня назад мать погорела :( , как разгребусь обязательно посмотрю, а пока извиняйте :dont_know:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

ARV писал(а):...я встречал проекты, где динамическая индикация делалась в основном цикле, а измерение и формирование символов для вывода делались по прерываниям... не смотря на то, что это были реально работающие проекты, я никогда не поставил бы их ряд "образцов для подражания". поймите меня верно :)

Все верно, уважаемый ARV. И не такое можно увидеть, все имеет место быть. Но это все крайние методы программирования, как правило все достаточно насыщено: и тело и прерывания.
Просто я не согласен с мнением GP1 (а также Meteor): если не выскакиваешь как ошпареный из прерывания, то ламер. Почему не лох или не осел? :evil: И почему по мнению Meteor_а прерывания - это исключительная ситуация, что в них такого особенного для Вас?
P.S. Естественно, что автор должен быть хозяином в своей программе и тем более должен максимально защитить ее от любых (мыслимых и немыслимых) чрезвычайных ситуаций, ИМХО.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Мяу, GP1!
IM1 писал(а):И почему по мнению Meteor_а прерывания - это исключительная ситуация, что в них такого особенного для Вас?

Прерывания предполагают уход от выполнения основной программы на обработку событий либо весьма редких, либо мало предсказуемых, например делаем системное время с периодом 1мс, время основного цикла при этом 100 мкс, или ждем принятия байта из ПК (кто сказал вообще что он придет?), либо нажатия кнопки (не собираюсь нажимать в течение ближайшего часа). И что будем в таких ситуациях опрашивать линии, регистры и смотреть за состоянием таймеров? А если во время отработки времени, примем байт и нажмем на кнопку? Что в такой ситуации делать, особенно если "кнопарь" у нас - импульсный сигнал длительностью 4 мкс к примеру и ловим передний фронт?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

Meteor писал(а): ...А если во время отработки времени, примем байт и нажмем на кнопку? Что в такой ситуации делать, особенно если "кнопарь" у нас - импульсный сигнал длительностью 4 мкс к примеру и ловим передний фронт?

Ну в таком случае, только стреляться :) .
Вы интересно рассуждаете, типа: а вдруг что-то такое каак выскочит и такого натворит :shock:! Я уже говорил, что автор есть хозяин положения и для каждого конкретного случая и него будет конкретный способ обработки, и "а вдруг" он не допустит. И естественно прерывание от 4 мкс кнопки у него будет самым приоритетным (если ему перепадет такое счастье, как эта кнопка).
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

IM1 писал(а):Но это все крайние методы программирования, как правило все достаточно насыщено: и тело и прерывания.
Просто я не согласен с мнением GP1 (а также Meteor): если не выскакиваешь как ошпареный из прерывания, то ламер. Почему не лох или не осел? :evil: И почему по мнению Meteor_а прерывания - это исключительная ситуация, что в них такого особенного для Вас?
P.S. Естественно, что автор должен быть хозяином в своей программе и тем более должен максимально защитить ее от любых (мыслимых и немыслимых) чрезвычайных ситуаций, ИМХО.

я ни на никого не навешиваю ярлыков - лох или гуру... но, скажем, не смотря на принципиальную возможность ездить повсюду задним ходом, все-таки это скорее из разряда извращения, нежели нормальной практики - думаю, не один прохожий повертит пальцем у виска, увидев, как кто-то поехал в магазин задним ходом :))) так и с прерываниями. продолжу водительскую аналогию. водитель автобуса изредка прерывает свою основную деятельноть, чтобы объявить остановку или выдать билет. если такие отвлечения редки и кратковременны - это никак не сказывается на качестве исполнения его основной функции - ведения автобуса. но ежели он 80% времени станет выдавать билеты, то его надо назвать не водителем, а кондуктором - согласитесь, что по основной функции мы присваиваем должность. так и с прерываниями: они по своему определению не должны существенно нарушать ход (время, цикличность и т.п.) основных работ программы. и, соответственно, если это не так, следует задуматься о правильности выбранного подхода.

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

Мой уютный бложик... заходите!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

ARV писал(а):...я ни на никого не навешиваю ярлыков - лох или гуру... но, скажем, не смотря на принципиальную возможность ездить повсюду задним ходом, все-таки это скорее из разряда извращения, нежели нормальной практики - думаю, не один прохожий повертит пальцем у виска, увидев, как кто-то поехал в магазин задним ходом :))) так и с прерываниями.[/quote"]
GP1 писал(а):to MTF
1. Судя по коду ты собираешься выводить индикацию в обработчике прерывания T0_OVF, ИМХО это ламерство, без обид, в прерывании формируй флаг, а всю обработку в основном теле программы.

Речь совсем не о Вас, уважаемый ARV. Я уже писал, что это мое мнение (ИМХО) на замечание GP1 to MTF, при этом никого не хотел обидеть. И речь GP1 шла о динам. индикации, а это как раз тот случай когда можно чуток проехать задним ходом вместо того, чтобы объезжать целый квартал. Но это опять ИМХО, а так пишите как хотите :) .
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

GP1 нашел как преобразовывать числа >9

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

.def    fbin        = r16   
.def    fbcdl       = r16   
.def    fbcdh      = r17   

; main prog
.......................
.......................
; загрузка в буфер disp  числа 10     
    ldi     fbin , 10
    rcall   bin2bcd8

    ldi     XL  ,  disp    ;  загр disp  в  X
    ldi     tmp ,  fbcdL      ; 0
    rcall  bcd_disp
    ldi     tmp ,  fbcdH      ; 1
    rcall  bcd_disp
M1:   
   
    call   display         ;***вызов процедуры индикации
.......................
.......................
   rjmp   M1

bin2bcd8:     ;преобразование в 2 bcd
       clr     fBCDH   
BCD8_1:
       subi   fbin , 10   ;fBCDH = fBCDH - 1
       brcs   BCDb8_2   ;if carry not set
       inc     fBCDH
       rjmp  BCDb8_1   ; loop again
BCD8_2:
       subi   fbin , -10   ;    result = result + 10
       ret         ;else return

bcd_disp:   ; преобр в семисегментный  код
   push   tmp
   andi    tmp 
   ldi       ZL , table_code*2
   add     ZL , tmp
   lpm
   st        X+ , r0   ;запись  в  disp  кода   
   pop     tmp
   ret


но так и осталась проблема в bcd_disp , коды table_code записывается в буфер DISP , почему то не по порядку , а как вздумается ?????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

to MTF
Смотрю ты слегка :))) облегчил мой код, поэтому для пущего взаимопонимания
колись чем пользуешься: мк, частота мк, среда разработки, симулятор.
И будем дальше разбираться. :tea:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

Добрый день GP1
До этого с регистрами X Y Z не приходилось работать , на данный момент немного разобрался , но не до конца собственно поэтому и обратился за помощью :?


1. контроллер attiny2313
2. частота 4МГЦ
3. AVR studio 4
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Твоя главная ошибка - загрузка только младшего регистра из пары Z, X, Y, т.к. верхний адрес флеша равен 0x3FF то одним регистром не отделаешься. :wink:
если помнишь у меня была загрузка и ZL и ZH
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

Переделал!!!


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

.equ   OutPort    =  PORTB
.equ   dg1   =pb1
.equ   dg2   =pb0
.def    tmp       =  r16
.def    tmp1         =  r17 ;
;****************
.equ   pin_dat   =pd5         ;*** оч.рекомендую делать именно так
.equ   pin_clk   =pd6
.def   n   =<какой нибудь регистр>
.def   flags   =r19         ;*** определяем регистр флагов
.equ   tind   =7      ;*** и назначаем флаг индикации



.dseg     ;SRAM memory segment
disp :      .byte   2      ; буфер для индикации

.cseg
disp_pos:   .db   0xF7 ,  0xFB    ;   позиция  для инд 

     ; цифры      "0"       "1"      "2"      "3"      "4"      "5"      "6"      "7"      "8"      "9" 
table_code: .db 0xDB , 0x48 , 0xE3 , 0xEA , 0x78 , 0xBA , 0xBB , 0xC8 , 0xFB , 0xFA



;=================
T0_OVF:
.......................
.......................
   sbr   flags,tind         ;*** установить бит, время индикации истекло
   reti
;================ INDICATION =====
display:
          clr     n         ;
next_digit:

;---------- OFF IND ----------
          in           tmp ,  portb      ;чтение portB       ;*** здесь все норм.
          ori          tmp ,  0x03      ;в 1 pb0 , pb1
          out         portb, tmp        ;погасить  индикатор
;----------
          ldi          ZL , disp_pos*2    ; загр в Z поз индик
          ldi          ZH , disp_pos*2     
          ldi          XL , disp              ;  загр в  X буфер disp 
          ldi          XH , disp               
          mov       tmp , n 
;          clr          tmp1
          ldi          tmp1 , 0
          add        ZL , tmp
          add        XL , tmp
          adc        ZH , tmp1 ; 
          adc        XH , tmp1 ;
          ld           tmp , X

;---------- Вывод в 74LS164 ----------
         ldi           tmp1 , 8   ;8 bits
LS164:
         cbi          portd, pin_dat       ;*** сбрасываем пин в 0
         lsl           tmp                       ;***выдавливаем бит в СY
         brcc        ls164_0
         sbi          portd, pin_dat       ;*** устанавливаем в 1 если CY=1
ls164_0:
         sbi          portd,  pin_clk   ;CLOCK strobe for 74LS164
         cbi          portd,  pin_clk   ;CLOCK strobe for 74LS164
         dec         tmp1      ;dec
         brne       LS164      ;если не 0  то LS164

;*** в регистре нужный код , приступаем к индикации
;*** сбрасываем флаг индикации
         cbi         flags , tind
;---------- ON IND ----------
         in          tmp ,  portb    ;чтение portB       ;*** здесь все норм.
         lpm
         and       tmp ,  r0         ;  pb0 или  pb1   disp_pos
         out        portb, tmp      ;  включ  индикатор
;----------
tind1:
         sbis       flags,tind      ;*** и ждем переполнения счетчика
         rjmp      tind1
         inc         n
         cpi         n , 1
         brne      next_digit       
ret
;=================




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

.def    fbin        = r20   
.def    fbcdl       = r20   
.def    fbcdh      = r21   

; main prog
.......................
.......................
; загрузка в буфер disp  числа 10     
    ldi     fbin , 10
    rcall   bin2bcd8

    ldi     XL  ,  disp    ;  загр disp  в  X
    ldi     XH  ,  disp    ;  загр disp  в  X

    ldi     tmp ,  fbcdL      ; 0
    rcall  bcd_disp
    ldi     tmp ,  fbcdH      ; 1
    rcall  bcd_disp
M1:   
   
    call   display         ;***вызов процедуры индикации
.......................
.......................
   rjmp   M1

bin2bcd8:     ;преобразование в 2 bcd
       clr     fBCDH   
BCD8_1:
       subi   fbin , 10   ;fBCDH = fBCDH - 1
       brcs   BCDb8_2   ;if carry not set
       inc     fBCDH
       rjmp  BCDb8_1   ; loop again
BCD8_2:
       subi   fbin , -10   ;    result = result + 10
       ret         ;else return

bcd_disp:   ; преобр в семисегментный  код
   push   tmp
   push   tmp1
   andi    tmp 
   clr      tmp1
   ldi       ZL , table_code*2
   ldi       ZH , table_code*2
   add     ZL , tmp
   adc     ZH , tmp1
   lpm
   st        X+ , r0   ;запись  в  disp  кода   
   pop     tmp
   pop     tmp1
   ret



опять не получилось , все тоже самое
на индикаторе показывает почему то 2 единицы а не 10

такое ощущение что в буфере DISP записывается две 11 а не 10 :shock:

Так как не силен в регистрах X Y Z возник вопрос:
зачем обязательно надо грузить старший разряд регистров X Y Z ?????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Опять те же грабли:

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

;----------
          ldi          ZL , disp_pos*2    ; загр в Z поз индик
          ldi          ZH , disp_pos*2     
          ldi          XL , disp              ;  загр в  X буфер disp 
          ldi          XH , disp               
          mov       tmp , n 
;          clr          tmp1
          ldi          tmp1 , 0
          add        ZL , tmp
          add        XL , tmp
          adc        ZH , tmp1 ; 
          adc        XH , tmp1 ;
          ld           tmp , X


ты забыл про волшебные слова low() и high().
и честно говоря не догоняю алгоритма работы твоей программы :dont_know:
в моем примере точно по-другому было.
не торопись, набросай на бумажке алгоритм, погоняй по нему с карандашом в руке, а потом уж код набивай, и все встанет на свои места

зы: код выкладывай в упакованном виде, а то злые модераторы почикаю и тебя и меня за одно :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

:oops: да действительно забыл про low и high

Алгоритм следующий:

.cseg
disp_pos: .db 0xFE , 0xFD ; позиция для инд

в disp_pos у меня код для передачи в порт B для включения разряда индикатора

0 0xFE ;0b11111110 pb0 1 разряд
1 0xFD ;0b11111101 pb1 2 разряд



.dseg ;SRAM memory segment
disp : .byte 2 ;

disp буфер для индикации 2- х цифр


описание процедуры display
clr n ; n счетчик разрядов (у нас два ) max n = 1 ; изначально = 0
next_digit:
;---------- OFF IND ----------
in tmp , portb ;чтение portB ;
ori tmp , 0x03 ;в 1 pb0 , pb1
out portb, tmp ;погасить индикатор

1 .в регистр Z загружаю позиции для вкл индикаторов
ldi ZL , low ( disp_pos*2) ; загр в Z поз индик
ldi ZH ,high( disp_pos*2 )

2. в регистр X загружаю буфер индикатора
ldi XL , disp ; загр в X буфер disp
ldi XH , disp

3. записываю в tmp номер разряда 0 или 1
mov tmp , n
clr tmp1

4. ставим указатель на 0 или 1 в зависимости от того какой инд должен светится
add ZL , tmp ; ставим указатель
add XL , tmp
adc ZH , tmp1 ;
adc XH , tmp1 ;

5. загружаю в tmp регистр X (буфер disp 1 или 2 цифра)
ld tmp , X ; в tmp теперь код цифры для вывода в ls164


---------- в ls164----------
...........
........
..........
----------

6. сбр флаг
cbi flags , tind

7. вкл индикатор (нужный разряд хранится в регистре Z )
;---------- ON IND ----------
in tmp , portb ; чтение portB ;здесь все норм.
lpm
and tmp , r0 ; pb0 или pb1 disp_pos
out portb, tmp ; включ индикатор
;----------

tind1:
sbis flags,tind ; ждем переполнения счетчика
rjmp tind1
inc n
cpi n , 1
brne next_digit ; след индикатор
Ответить

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