как в АСМе узнать какие биты в данном РОНе =1?

Обсуждаем контроллеры компании Atmel.
Ответить
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

как в АСМе узнать какие биты в данном РОНе =1?

Сообщение CyberMerlin »

кто сталкивался помогите плз

in Temp1,PinA

какие в Temp1 биты равны "1" ???
как это узнать??
побитно перебирать сотни комбинаций как-то тяжеловато
я могу получать вот такие данные
0b00100110,
0b00001000
кусок кода скиньте плз (если не проблемно) буду очень рад
Аватара пользователя
avr123.nm.ru
Вечно гонимый
Сообщения: 331
Зарегистрирован: Пн сен 04, 2006 20:25:28
Откуда: самоучитель по микроконтроллерам
Контактная информация:

Сообщение avr123.nm.ru »

пока не ответили шепну - посмотри страницы 5 - обе части.
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

Сообщение CyberMerlin »

я понял что надо массивом проверять, только не въехать так сразу
и ктому же там на С всё
опять же если я начну изучать С у меня времени реально уйдет очень много

а я сейчас почти все сделал осталось разобраться с этим вопросом и
ЕЩЕ ОДНИМ ВОПРОСОМ:

- как выяснить что больше Temp4 или Temp5 ?????
и ... можно сдавать программу в прошивку
Аватара пользователя
avr123.nm.ru
Вечно гонимый
Сообщения: 331
Зарегистрирован: Пн сен 04, 2006 20:25:28
Откуда: самоучитель по микроконтроллерам
Контактная информация:

Сообщение avr123.nm.ru »

надо поискать подходящую инструкцию или вычесть одно из другого и посмотреть больше ли нуля ?

тут же вроде народ на АСМе пишет.... АУ ?????
Аватара пользователя
P S
Открыл глаза
Сообщения: 62
Зарегистрирован: Вс авг 20, 2006 21:04:41
Откуда: Москва
Контактная информация:

Сообщение P S »

На асме не скажу, но идея у меня такая: методом последовательного приближения. Т.е.
a:=Temp1; bit[1]....bit[7]:=0;
if a>=128 then begin bit7:=1; a:=a-128 end;
if a>=64 then begin bit6:=1; a:=a-64 end;
if a>=32 then begin bit5:=1; a:=a-32 end;
if a>=16 then begin bit4:=1; a:=a-16 end;
if a>=8 then begin bit3:=1; a:=a-8 end;
if a>=4 then begin bit2:=1; a:=a-4 end;
if a>=2 then begin bit1:=1; a:=a-2 end;
if a>=1 then bit0:=1

Где-то так. Это идея, которую можно ещё оптимизировать под свои цели. А вообще так работают многие АЦП 8)
МуррррК
Аватара пользователя
avr123.nm.ru
Вечно гонимый
Сообщения: 331
Зарегистрирован: Пн сен 04, 2006 20:25:28
Откуда: самоучитель по микроконтроллерам
Контактная информация:

Сообщение avr123.nm.ru »

сделайте в компиляторе CVAVR и посмотрите листинг на АСМе. делайте так же.

Си изучать не нужно - просто открыть любой пример компилятора и добавить свое выражение в прогу.
Аватара пользователя
P S
Открыл глаза
Сообщения: 62
Зарегистрирован: Вс авг 20, 2006 21:04:41
Откуда: Москва
Контактная информация:

Сообщение P S »

или ещё мысль: сдвигать вправо и смотреть чётное или нет
МуррррК
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

Сообщение CyberMerlin »

спасибо всем что не оставили
за выходные не нытьем так каканием вот что получилось

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

Start:
   in Temp1,PinA
   cpse Temp1,0   ;данные есть?? в порту А
   rjmp Not_Zero   ;если НЕ НОЛЬ в порту А
   rjmp Zero   ;если НОЛЬ в порту А
 ret
   Opros_1:
      cpse Temp2,0   ;ОПРОС первый?
      rcall Opros_2   ; если ОПРОС не первый      --переход
      inc Temp2   ; если ОПРОС первый      увеличиваем счетчик ОПРОСОВ
      rcall Delay   ;-----задержка
    ret
   Not_Zero:   ; ---==// поступили данные на входе ПОРТА *А* \\==---
      inc Temp5   ;увеличим счетчик ЕДИНИЦ
      rcall Opros_1
      rjmp Start            ;--go to Start--
   Zero:      ; ---==// нет данных на входе ПОРТА *А* \\==---
      inc Temp4
      rcall Compare_T45   ;проверяем, если у нас были ЕДИНИЦЫ - РеСтарт!!!
      rcall Opros_1
      rjmp Start            ;--go to Start--
   Opros_2:
      cpse Temp2,1   ;ОПРОС второй?
      rcall Shag_PB   ; ОПРОС третий!!      --переход
    ret
;*************************************************
;СРАВНЕНИЕ ПЕРЕМЕННЫХ нолЕВЫХ и единиц
   Compare_T45:      ;уходит на СТАРТ, если НОЛей ((1) или (2 и 1-единица))
      cp Temp4,Temp5      ;--это у нас для все остальных подпрограмм
      breq Clr_S
      cpi Temp5,1   ;ЭТО у нас для если все НОЛики и 1 иголочка!!!
      breq Clr_S
    ret
     Clr_S:
        rcall Clear_S
        Rcall Delay
        rjmp Start
;**************-конец сравнения-******************
   Clear_s:            ;Clear RON 4,5,2
        ldi Temp4,0   ;в НОЛЬ --счетчик "нулей"
        ldi Temp5,0   ;в НОЛЬ --счетчик "единиц"
        ldi Temp2,0   ;в НОЛЬ --счетчик "опросов"
     ret

Мрррррр рррр
жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
ТЯПЕРИЧА другой ВОПРОС
как мне передать регистры скажем R21,22,23 (РОН) Блоку Управления??
Характеристика обмена:
- скорость обмена 19200 бит\с
- проверка четности - нет
- один стартовый бит
- два стоп бита
- режим обмена - RTU
связь с использованием протокола MODBUS (похоже наш протокол, т.к. не встречался раньше с ним.
Аватара пользователя
Mamonth
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Вообще в асме есть специальные комманды... переход если больше, если меньше... равно не равно... :cry:
Today fine night...
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

Сообщение CyberMerlin »

а какие?
подскажи плз
просто это все что я нашел,
может чего на свежачка подскажешь...?
Аватара пользователя
avr123.nm.ru
Вечно гонимый
Сообщения: 331
Зарегистрирован: Пн сен 04, 2006 20:25:28
Откуда: самоучитель по микроконтроллерам
Контактная информация:

Сообщение avr123.nm.ru »

они начинаются на BR т.е. "бранч" - ветвление.

инструкции хорошо описаны на gaw.ru по-русски
и в помощи по АСМу в VMLAB
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

Сообщение CyberMerlin »

угу, спасибо
век живи век учись
тут новый вариант

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

Start:
   in Temp1,PinA
   ldi Temp3,0
   cpse Temp1,Temp3   ;данные есть?? в порту А
   rjmp Not_Zero      ;если НЕ НОЛЬ в порту А
   rjmp Zero      ;если НОЛЬ в порту А
 ret
   Opros_1:
      ldi Temp3,0
      cpse Temp2,Temp3;ОПРОС первый?
      rcall Opros_2   ; если ОПРОС не первый      --переход
      inc Temp2   ; если ОПРОС первый      увеличиваем счетчик ОПРОСОВ
      rcall Delay   ;-----задержка
    ret
   Not_Zero:   ; ---==// поступили данные на входе ПОРТА *А* \\==---
      inc Temp5   ;увеличим счетчик ЕДИНИЦ
      rcall Opros_1
      rjmp Start            ;--go to Start--
   Zero:      ; ---==// нет данных на входе ПОРТА *А* \\==---
      inc Temp4
      rcall Compare_T45   ;проверяем, если у нас были ЕДИНИЦЫ - РеСтарт!!!
      rcall Opros_1
      rjmp Start            ;--go to Start--
   Opros_2:
      ldi Temp3,1
      cpse Temp2,Temp3   ;ОПРОС второй?
      rcall Shag_PB      ; ОПРОС третий!!      --переход
    ret
   Shag_PB:
      cpi Temp0,0      ;здесь мы пытаемся начать работу с Портом В
      breq Temp0_Step      ;присвоить Порту В 0b0001000 & Go to !!!-Start-!!!
      cpi Temp1,0      ;в порту А   ПУСТО??
      breq Temp0_Step      ;в Порту А данных нет --проверяем следующий столбец
      rjmp Identifer      ;идентифицируем нажатую кнопушку
;*************************************************
;СРАВНЕНИЕ ПЕРЕМЕННЫХ нyлЕВЫХ и единиц
   Compare_T45:      ;уходит на СТАРТ, если НОЛей ((1) или (2 и 1-единица))
      cp Temp4,Temp5   ;--это у нас для все остальных подпрограмм
      brsh Clr_S
      cpi Temp5,1   ;ЭТО у нас для если все НОЛики и 1 иголочка!!!
      breq Clr_S
    ret
     Clr_S:
        rcall Clear_S
        Rcall Delay
        rjmp Start
;**************-конец сравнения-******************
   Clear_s:      ;Clear RON 4,5,2
        ldi Temp4,0   ;в НОЛЬ --счетчик "нулей"
        ldi Temp5,0   ;в НОЛЬ --счетчик "единиц"
        ldi Temp2,0   ;в НОЛЬ --счетчик "опросов"
     ret


в принципе, здесь другим манером сделать как мне кажется нельзя
это наиболее оптимальный вариант

ХОТЯ, если есть варианты жду ОТВЕТов...
CyberMerlin
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)
Контактная информация:

Сообщение CyberMerlin »

помогите плз
сколько я могу Регистров общего Н использовать под свои нужды в ATmega 162????
я сейчаст семь с R16 по R24 использую
и мне не хватает жестко.
могу ли использовать первые 15 регистров???? R1-R15???
Ответить

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