Страница 1 из 1
как в АСМе узнать какие биты в данном РОНе =1?
Добавлено: Пт сен 29, 2006 13:05:25
CyberMerlin
кто сталкивался помогите плз
in Temp1,PinA
какие в Temp1 биты равны "1" ???
как это узнать??
побитно перебирать сотни комбинаций как-то тяжеловато
я могу получать вот такие данные
0b00100110,
0b00001000
кусок кода скиньте плз (если не проблемно) буду очень рад
Добавлено: Пт сен 29, 2006 14:14:56
avr123.nm.ru
пока не ответили шепну - посмотри страницы 5 - обе части.
Добавлено: Пт сен 29, 2006 16:17:27
CyberMerlin
я понял что надо массивом проверять, только не въехать так сразу
и ктому же там на С всё
опять же если я начну изучать С у меня времени реально уйдет очень много
а я сейчас почти все сделал осталось разобраться с этим вопросом и
ЕЩЕ ОДНИМ ВОПРОСОМ:
- как выяснить что больше Temp4 или Temp5 ?????
и ... можно сдавать программу в прошивку
Добавлено: Пт сен 29, 2006 19:30:52
avr123.nm.ru
надо поискать подходящую инструкцию или вычесть одно из другого и посмотреть больше ли нуля ?
тут же вроде народ на АСМе пишет.... АУ ?????
Добавлено: Вс окт 01, 2006 21:06:42
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
Где-то так. Это идея, которую можно ещё оптимизировать под свои цели. А вообще так работают многие АЦП

Добавлено: Вс окт 01, 2006 21:53:08
avr123.nm.ru
сделайте в компиляторе CVAVR и посмотрите листинг на АСМе. делайте так же.
Си изучать не нужно - просто открыть любой пример компилятора и добавить свое выражение в прогу.
Добавлено: Вс окт 01, 2006 22:55:42
P S
или ещё мысль: сдвигать вправо и смотреть чётное или нет
Добавлено: Пн окт 02, 2006 11:59:07
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 (похоже наш протокол, т.к. не встречался раньше с ним.
Добавлено: Вт окт 03, 2006 10:03:18
Mamonth
Вообще в асме есть специальные комманды... переход если больше, если меньше... равно не равно...

Добавлено: Вт окт 03, 2006 12:31:55
CyberMerlin
а какие?
подскажи плз
просто это все что я нашел,
может чего на свежачка подскажешь...?
Добавлено: Вт окт 03, 2006 13:23:07
avr123.nm.ru
они начинаются на BR т.е. "бранч" - ветвление.
инструкции хорошо описаны на gaw.ru по-русски
и в помощи по АСМу в VMLAB
Добавлено: Вт окт 03, 2006 14:02:23
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
в принципе, здесь другим манером сделать как мне кажется нельзя
это наиболее оптимальный вариант
ХОТЯ, если есть варианты жду ОТВЕТов...
Добавлено: Ср окт 04, 2006 15:04:14
CyberMerlin
помогите плз
сколько я могу Регистров общего Н использовать под свои нужды в ATmega 162????
я сейчаст семь с R16 по R24 использую
и мне не хватает жестко.
могу ли использовать первые 15 регистров???? R1-R15???