LDI r16, 255-((1<<Bit1)|(1<<Bit2))
И всё равно указанные биты запишутся нулями.
Наверное, проще так LDI r16, ~((1<<Bit1)|(1<<Bit2))Seriyvolk писал(а):LDI r16, 255-((1<<Bit1)|(1<<Bit2))
http://chipenable.ru/index.php/programm ... ast-1.htmlSeriyvolk писал(а):по работе с датчиком температуры 18В20
Сброс датчика низким уровнем на шине на время >480мкс -> отпускание линии -> через 60 мкс опрос низкого уровня от датчика при его наличии -> если низкого уровня нет, то нет и датчика; если есть, то дождаться когда датчик отпустит линию -> выдать команду SKIP ROM (0xCC) -> выдать команду начала измерения температуры Convert T (0x44); при паразитном питании подключить линию к питанию и выдержать паузу; при постоянном питании окончание преобразования можно контролировать появлением 1 на шине -> сбросить датчик -> выдать команду SKIP ROM (0xCC) -> выдать команду чтения памяти (0xBE) -> прочитав 2 байта температуры сбросить датчик. Обмен ведётся байтами младшими битами вперёд.Seriyvolk писал(а):... Нужна ли датчику начальная инициализация... какая должна быть последовательность команд для простого считывания температуры? (датчик один)
Не помню уже, но вроде при передаче бита. Да и код работы с ним не весь мой, сам алгоритм слизан у ARVSeriyvolk писал(а):Датчику ведь даже между битами не нужны такие точные интервалы, там вродя от 1 до 12 uS окно
Код: Выделить всё
//------------------------------------------------------------------------------
;-----------------------------------------------
; PUSH_KEY - процедура чтения клавиатуры
;-----------------------------------------------
PUSH_KEY:
IN R16,PIND
ANDI R16,0b00011111
PUSH R16
ldi DelayBuf,255 ;формируем задержку времени 640 мкс
rcall delay
IN R16,PIND
ANDI R16,0b00011111
POP R17
CPSE R16,R17
RET
CPI R16,0b00011111
BREQ EXIT
SBRS R16,Plus
RCALL TimePlus
SBRS R16,Minus
RCALL TimeMinus
SBRS R16,Enter
RJMP Run_Stop
SBRS R16,Preset
RJMP Preset_Load_Store
EXIT: CBR FLAG,1<<PushedKey
CLR HoldCount
EndPK: RET
TimePlus:
SBRC FLAG,Run ; Если мы попали сюда и таймер запущен
RET ; то просто выходим
CPI HTime,99
BRSH EndTP
ADIW HTime:LTime,1
CPI LTime,60
BRLO EndTP
LDI LTime,255
ADIW HTime:LTime,1
EndTP: SBR FLAG,(1<<TimeUpdate)|(1<<PushedKey)
RET
TimeMinus:
SBRC FLAG,Run ; Если мы попали сюда и таймер запущен
RET ; то просто выходим
CPSE LTime,Zero
RJMP TimeMinusINT
CPSE HTime,Zero
RJMP TimeMinusINT
RJMP EndTM
TimeMinusINT:
SBIW HTime:LTime,1
CPI LTime,60
BRLO EndTM
LDI LTime,59
EndTM: SBR FLAG,(1<<TimeUpdate)|(1<<PushedKey)
RETМожно скопировать текст сообщения, удалить его и написать новое, вставив туда текст старого и добавив нового текста.Seriyvolk писал(а):но если я поправлю предыдущий - его никто не почитает...
EORgrinya писал(а):(исключающее ИЛИ) под ATmega8
Эээ, какое смещение? 9 бит = 512 градусов, 9-й бит в старшем байте, остальные 8 — в младшем.vik1977ck писал(а):Старший байт,младший байт и смещение?
Да... вот смотрите- измерил я с помощью АЦП температуру - например 2,507 вольт -там термопара через ОУ- и вот теперь мне нужно сделать из этого числа температуру- перевести в градусы - я знаю что при 2,507 -это 366 градусов по Цельсию- сравнить с константой которая внесена в ОЗУ- типа ограничение при котором выключиться симистор и вывести показания на 4-рядный семи сегментный дисплей- вот тут и попал в засаду- умственную..Gudd-Head писал(а):Эээ, какое смещение? 9 бит = 512 градусов, 9-й бит в старшем байте, остальные 8 — в младшем.vik1977ck писал(а):Старший байт,младший байт и смещение?
Да на ассемблере пишу- как-то с самого начала у меня с СИ и с PIC не срослось...pyzhman писал(а):Нужно складывать это значение в переменную, размерность которой превышает байтовую величину. Например integer. На у если на ассемблере (на что очень смахивает запрос), то ручками/лапками.