Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт сен 29, 2006 13:05:25

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

in Temp1,PinA

какие в Temp1 биты равны "1" ???
как это узнать??
побитно перебирать сотни комбинаций как-то тяжеловато
я могу получать вот такие данные
0b00100110,
0b00001000
кусок кода скиньте плз (если не проблемно) буду очень рад

Пт сен 29, 2006 14:14:56

пока не ответили шепну - посмотри страницы 5 - обе части.

Пт сен 29, 2006 16:17:27

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

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

- как выяснить что больше Temp4 или Temp5 ?????
и ... можно сдавать программу в прошивку

Пт сен 29, 2006 19:30:52

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

тут же вроде народ на АСМе пишет.... АУ ?????

Вс окт 01, 2006 21:06:42

На асме не скажу, но идея у меня такая: методом последовательного приближения. Т.е.
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)

Вс окт 01, 2006 21:53:08

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

Си изучать не нужно - просто открыть любой пример компилятора и добавить свое выражение в прогу.

Вс окт 01, 2006 22:55:42

или ещё мысль: сдвигать вправо и смотреть чётное или нет

Пн окт 02, 2006 11:59:07

спасибо всем что не оставили
за выходные не нытьем так каканием вот что получилось
Код:
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 (похоже наш протокол, т.к. не встречался раньше с ним.

Вт окт 03, 2006 10:03:18

Вообще в асме есть специальные комманды... переход если больше, если меньше... равно не равно... :cry:

Вт окт 03, 2006 12:31:55

а какие?
подскажи плз
просто это все что я нашел,
может чего на свежачка подскажешь...?

Вт окт 03, 2006 13:23:07

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

инструкции хорошо описаны на gaw.ru по-русски
и в помощи по АСМу в VMLAB

Вт окт 03, 2006 14:02:23

угу, спасибо
век живи век учись
тут новый вариант
Код:
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


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

ХОТЯ, если есть варианты жду ОТВЕТов...

Ср окт 04, 2006 15:04:14

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