Таки непонятно, у вас переменная в bcd формате или двоичном. Потому могут быть варианты.Seriyvolk писал(а):Может кто скажет, как это проще делается?
Ассемблер (ASM) для AVR в вопросах и ответах
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
А что может быть не понятно?
В регистре торчит число, 0b00001111, мне нужно вместо этого числа на дисплей вывести "15". Вопрос - как? И аналогично с числами от 0b00000000 до 0b01100011 Пример доступного мне способа вывода я привёл.
В регистре торчит число, 0b00001111, мне нужно вместо этого числа на дисплей вывести "15". Вопрос - как? И аналогично с числами от 0b00000000 до 0b01100011 Пример доступного мне способа вывода я привёл.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Спросили же, bcd или двоичный? Если 0b00001111 - это 15, то в двоичном. В bcd это будет выглядеть как 0b00010101 (0001 = 1, 0101 = 5, итого 1 и 5, т.е. 15)Seriyvolk писал(а):А что может быть не понятно?
Просто некоторые функции, которые вы не сами писали, могут использовать именно bcd, а к нему ещё надо преобразовать число.
Ну раз это так называется, то мне нужно двоичный код в регистре перегнать в этот "BCD". Дальше я сам разберусь.
Всем спасибо, задачу решил сам.
Всем спасибо, задачу решил сам.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Нарыл крайне интересный для меня кусочек кода
Но непонятна одна запись... LDI r18,-1+'0'
Это значит загрузили в R18 минус единицу, а +'0' - это что и зачем?
Но непонятна одна запись... LDI r18,-1+'0'
Это значит загрузили в R18 минус единицу, а +'0' - это что и зачем?
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- Реклама
-1+'0' - загрузить код символа "0" -1,Seriyvolk писал(а):Но непонятна одна запись... LDI r18,-1+'0'
А откуда загрузить? Нужно писать какую-то таблицу?
Вот весь кусок кода
Вот весь кусок кода
Код: Выделить всё
Hex2Ascii: LDI r18,-1+'0'
bcd1: INC r18
SUBI r16,100
BRCC bcd1
LDI r17,10+'0'
bcd2: DEC r17
SUBI r16,-10
BRCS bcd2
SBCI r16,-'0'
RETПрибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Оно ни откуда не грузится, это просто код символа из стандартной таблицы ASCII, это препроцессор и так знает. А запись -1+'0' переведется препроцессором в число 47.
Во! О том, что проц и так знает - я как раз и не знал... Теперь всё более-менее стало понятно. Спасибо!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Это знает не проц, а компилятор, который формирует непосредственный операнд команды из данной строки исходника. И будет там написано -1+'0' или же '/' или же 0x2F -- константа получится одна и та же, и проц никогда не узнает, как именно было в исходнике 
Ну что-же, очередной вопрос 
В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
В тини2313 есть 16-разрядный таймер. Можно ли его заставить тикать с предделителем 1024, да так, чтобы при значении 10800 срабатывало прерывание?
Что-то с даташитом я так и не смог разобраться, как именно это сделать. Если у кого-то есть, то очень желателен пример инициализации и запуска таймера в таком режиме.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Как то так
Код: Выделить всё
LDI YH,HIGH(10800)
LDI YL,LOW(10800) ;число сравнения
OUT OCR1AH,YH
OUT OCR1AL,YL
LDI R16,0b00001101
OUT TCCR1B,R16 ;тактовый сигнал Fclk/1024, режим CTC
Что-то не стартует...
В прерываниях прописано:
В коде запускаю таймер так:
А не стартует... Может упустил я чего?
В прерываниях прописано:
Код: Выделить всё
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RJMP TIMER_INTERRUPTКод: Выделить всё
LDI R16,1<<OCIE1A
OUT TIMSK,R16 Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
А глобальные прерывания разрешили?
sei
sei
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Да, разрешены конечно. В конце инициализации. Сейчас ещё для надёжности запустил поиск "CLI" по всему проекту - нет в нём такой команды, нигде.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Тогда вы что-то упускаете из виду.
Увы, телепатией не обладаю.
Удачи!
Увы, телепатией не обладаю.
Удачи!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Да, спасибо, удача очень понадобится. Особенно учитывая, что этот код в симуляторе как положено, прерывание вызывает, а в реальном железе прерывание не происходит. Я в принципе и весь проект выложить могу, но комментов там пока очень мало.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Выкладывайте. Будет проще разобраться. Сейчас прогнал для верности в студии. При тактовой 8МГц каждые 1,38с происходит прерывание. Пардон, картинка приведена для числа сравнения 6666
Код инициализации, но с числом 10800
Спойлер
Спойлер
Код: Выделить всё
GO:
LDI R16,RAMEND
OUT SPL,R16 ; инициализация стека
CLR ZH
CLT
LDI YH,HIGH(10800)
LDI YL,LOW(10800) ;число сравнений компаратора
OUT OCR1AH,YH
OUT OCR1AL,YL
LDI R16,1<<OCIE1A
OUT TIMSK,R16 ;разрешить прерывание компаратора Timer1_compA
OUT TIFR,R16
LDI R16,0b00001101
; LDI R16,9
OUT TCCR1B,R16 ;тактовый сигнал Fo/1024
SEI ; разрешение глобальных прерываний
WAIT:
BRTC WAIT
CLI
CLT
.............
.............
.............WDT на более короткое время не включен? Или работаете с таймером Т0 и чистите предделитель битом PSR10 GTCCR, а он у tiny2313 один.Seriyvolk писал(а):... в реальном железе прерывание не происходит.
Да, спасибо за поддержку! В симмуляторе, как оказалось, у меня прерывание тоже работает. Ну и с железом разобрался. Ночь большая была. Проблема не совсем лежала на поверхности, а была закопана глубоко в коде.
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня!
Дело было в макросе задержки и используемых им регистрах. Макрос использует R16, R17 и R19! А мне всё время казалось, что не R19, а R18. Поэтому R19 был отведён под независимый регистр флагов.
При входе в макрос эти 3 переменные сохранялись в стек, при выходе - извлекались. И вся программа в принципе довольно неплохо работала, до того, как включил прерывания. А в прерывании как раз этот R19 (флаг) и изменялся. В итоге ни задержки, ни независимый флаговый регистр не работали правильно, вызывая такие страшные глюки.
Перенёс флаговый регистр в R23 - и всё сразу заработало как нужно!
В любом случае всем спасибо за помощь и что не бросаете меня!
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Решил я уйти от записей вида 0b01010101 к более читаемым типа (1<<bit). Но чего-то я не догоняю.
Например,
Заместо WDCE и WDE компилятор из инклудового файла возьмёт цифры (числа), соответствующие порядковым номерам этих бит в регистре (WDTCR).
Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
А такая контрукция
Эквивалентна ldi r16, 0?
Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
Например,
Код: Выделить всё
ori r16, (1<<WDCE)|(1<<WDE)Единицы сдвинутся на соотв. позиции и логически сложатся, а на месте остальных бит будут нули?
А такая контрукция
Код: Выделить всё
ldi r16, (0<<WDE)Можно задавать свои номера битам через .EQU? Вынести их в отдельный файл (например, для управления периферией) и подключать через .include?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]


