Mikhail писал(а):Я использовал этот кусок кода для датчика. И при симуляции в протеусе выдает ошибку (мк давит землю а датчик держит высокий уровень. Или наоборот.), и считывает все единицы.
Ну в код сейчас вчитываться у меня нет настроения
Не очень понятно "мк давит землю а датчик держит высокий уровень. Или наоборот.".
Я Делал на 8-ой Меге и все тайминги отмерял в тактах (1 такт = 1 мкс при работе от встроенного генератора 1 МГц). А, скажем, в АВР Студии прогоняли? Считывание информации происходит именно в рекомендованные моменты времени?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да, код читать не охота. Для начала - проверьте тактовую, наличие и номинал PULLUP.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Можно ли в 8-битном контроллере оперировать 16-разрядными двоичными числами? Т.е. десятичными числами больше 255.
Поясню.
Есть некое десятичное число от 0 до 36000. Его я записываю в двух РОН. В одном мл. байт, в другом старший.
Дальше мне надо преобразовать его в двоично-десятичный код.
Для этого мне надо как-то вычесть из пятизначного десятичного числа сначала 10 000, потом 1 000, потом 100 и т.д. и считать сколько раз я вычту до получени отрицательного числа. Ну, это к примеру, можно, наверно, и по-другому как-то.
Могу ли я записать например в регистр X (состоящий из двух РОН) записать нужное мне для вычитаемое, в Y десятичное число и просто использовать команду вычитания из одного регистра другого?
Может имеет смысл использовать 16-битный контроллер? Насколько они дороже вообще?
I know what you're thinking. "Did he fire six shots or only five?"...
...you've got to ask yourself one question: "Do I feel lucky?" Well, do ya, punk?
Можно делать сложение/вычитание 16-разрядных чисел.
Сложение уже знаете add, adc
Вычитание можно реализовать либо командой sbiw, тогда это регистровые пары от 24 и выше,
либо "спаркой"
Т.е. вычитаем из младшего регистра значение младшего байта числа, а затем вычитаем с заемом из старшего регистра старшую часть числа (в данном примере это 10000).
МК большей разрядности стоит использовать лишь тогда, когда не хватает возможностей имеющихся.
А насколько я понял Вы еще стартуете, так что перестаньте бегать и освойте одну архитектуру. А когда станете разбираться досконально - тогда и решите вопрос перехода/освоения других типов МК
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
GP1 писал(а):warrior2031
на оф.сайте ATMELа есть такая фигня, AVR204, там как раз то что тебе нужно.
Большое спасибо за подсказку.
Тут Рассматривали эту же программу, но готовую в коде. Попробовал понять принцип - и разум мой зашел в тупик, к сожалению. Если есть такая возможность поясните.
.equ AtBCD0 =13 ;address of tBCD0
.equ AtBCD2 =15 ;address of tBCD1
.def tBCD0 =r13 ;BCD value digits 1 and 0
.def tBCD1 =r14 ;BCD value digits 3 and 2
.def tBCD2 =r15 ;BCD value digit 4
.def fbinL =r16 ;binary value Low byte
.def fbinH =r17 ;binary value High byte
.def cnt16a =r18 ;loop counter
.def tmp16a =r19 ;temporary value
;***** Code
bin2BCD16:
ldi cnt16a,16 ;Init loop counter
clr tBCD2 ;clear result (3 bytes)
clr tBCD1
clr tBCD0
clr ZH ;clear ZH (not needed for AT90Sxx0x)
bBCDx_1:lsl fbinL ;shift input value
rol fbinH ;through all bytes
rol tBCD0 ;
rol tBCD1
rol tBCD2
dec cnt16a ;decrement loop counter
brne bBCDx_2 ;if counter not zero
ret ; return
Ну, тут всё понятно.
bBCDx_2:ldi r30,AtBCD2+1 ;Z points to result MSB + 1 вот это что? Z указывает на результат наиболее значимого байта +1. Вижу что в ZL загрузили 16 зачем?
bBCDx_3:
ld tmp16a,-Z ;get (Z) with pre-decrement Вот это что? загружают в регистр значение из ячейки памяти с адресом 0F?
;----------------------------------------------------------------
;For AT90Sxx0x, substitute the above line with:
;
; dec ZL
; ld tmp16a,Z
;
;----------------------------------------------------------------
subi tmp16a,-$03 ;add 0x03
sbrc tmp16a,3 ;if bit 3 not clear
st Z,tmp16a ; store back
ld tmp16a,Z ;get (Z)
subi tmp16a,-$30 ;add 0x30
sbrc tmp16a,7 ;if bit 7 not clear
st Z,tmp16a ; store back
cpi ZL,AtBCD0 ;done all three?
brne bBCDx_3 ;loop again if not
rjmp bBCDx_1
И здесь что и зачем происходит тоже не понимаю
I know what you're thinking. "Did he fire six shots or only five?"...
...you've got to ask yourself one question: "Do I feel lucky?" Well, do ya, punk?
Не ломай моск
Разбирался давненько, так что, что-почем сейчас и не вспомню.
Но если невтерпеж - загрузи в симулятор и погоняй, программа рабочая, я ее везде, где требуются BCD числа, леплю без переделок.
зы там должна быть одноименная pdf-ка с описанием алгоритмов.
GP1 писал(а):
Не ломай моск
Разбирался давненько, так что, что-почем сейчас и не вспомню.
Но если невтерпеж - загрузи в симулятор и погоняй, программа рабочая, я ее везде, где требуются BCD числа, леплю без переделок.
зы там должна быть одноименная pdf-ка с описанием алгоритмов.
Да pdf смотрел. Что делают они пишут, но почему они делают именно это - не понятно.
Наверно, ты прав, загружу в AVR studio и буду гонять, думаю, так проще будет понять.
А пока в виде макроса её добавлю в код сразу, чтобы быстрее доделать полную программу.
Спасибо за помощь и внимание всем ответившим.
I know what you're thinking. "Did he fire six shots or only five?"...
...you've got to ask yourself one question: "Do I feel lucky?" Well, do ya, punk?
Жень, по моему вся беда твоя в том что у тебя на все прерывания один выход. Обрати внимание что код приведенный ранее не соответствует тому что видно на картине
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
а почему?
ведь я проверяю значение регистра ПИН Д (он напрямую связан с внешним миром) а на ножке у меня подется 1, потом мы эту 1 заносим в РОН, проверяем условие, и переходим в случае ее истинности на мигание светодиодами...
Не умеешь - не берись, но не взявшись не научишься...
Дак мне это и надо:)
я как хочу.
Включили питание. Нажали на ресет.
Нажали кнопку- светодиоды мигают всегда, отображая дв. счетную последовательность...
Только вот в железе вывод, на который идет сигнал с кнопки, находится в 3 состоянии, и от наводки (трогание пальцем, отверткой), запускает мигание светодиодов... Что я не так сделал?
Не умеешь - не берись, но не взявшись не научишься...