hybroid , спасибо большое, все получилось буквально за минуту, аж не верится. До этого два дня не получалось.
Что я сделал: все #define перенес в файл lcd_lib.h, а функции наоборот в файл lcd_lib.c. После этого сразу откомпилировалось и заработало.
С прошивкой имел дело первый раз, решил в готовом проекте перейти с параллельного интерфейса на аппаратный I2C с помощью переходника PCF8574 на дисплей 1602.
И хоть я в основном копипастил, для себя это считаю прогрессом
hosturik писал(а):не перестаю удивляться. Почему после таког выражения v_batt = (150*280) / 128;
в переменной v_batt находится число 65353?
У меня 65353 получается. Все правильно.
150*280=42000
так как знаковое 16-тибитное число может быть только в пределах от +32767 до -32768, то данное число должно интерпертироваться, как отрицательное 65536-42000=23536
-23536/128=-183
Теперь знаком присваивания мы -183 преобразуем в беззнаковое 16-тибитное число. 65536-183=65353
Вывод, пишите U после хотя бы одного из чисел. Например так: (150U*280) / 128
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Да. U - unsigned. L - long. Можно их комбинировать вместе
Добавлено after 3 minutes 40 seconds:
hosturik писал(а):
И то, что у меня v_batt объявлена так: volatile unsigned int v_batt; ничего не дает?
Если бы она участвовало в правой части оператора присваивания, то давало бы, так как когда производится операция между знаковым и беззнаковым целым, до операции знаковое будет преобразовано в беззнаковое.
Но так как оно в правой части оператора присваивания не фигурирует, то и на вычисление выражения в правой части никак не влияет.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Данная запись эквивалентна ADMUX = (1<<REFS0)|(1<<ADLAR);
Указание остальных нулевых битов компилятором будет игнорировано и никакого влияния на результирующий код не оказывает. Приведенная Вами запись используется исключительно для более удобного copy-paste )
Иными словами, сколько ноль не сдвигай, он все равно нулем останется.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Всем доброго времени суток. Решил написать тут.
Задумался я над изготовлением устройства представленного здесь: http://phreakerclub.com/forum/showthread.php?t=29
но не на пик, как там, а на авр, а именно мега8 (понимаю, что жирно, но скопилось у меня их аж 4 штуки). Занимаюсь переписыванием кода под мегу. Очередной затык возник в следующем:
Устройство просто перебирает все комбинации от двенадцати нулей до двенадцати единиц (с выплевыванием в эфир). Поскольку РОН у меги 8-ми битные, а комбинации состоят из 12 бит, то необходимо регистр (из которого методом логического сдвига данные по очереди выдаются в эфир) представить как один 12-ти битный регистр. Знаю, что в меге есть регистровые пары и можно использовать их, НО из спортивного интереса хочется понять какие есть альтернативные методы? У автора не применяются регистровые пары - он использовал пик 18f252, а там я вообще не обнаружил сдвоенные регистры, но каким-то образом данные у него поступают как из одного 16-ти битного регистра. (4 пустых сдвига + 12 бит данных). Прошу помощи опытных котов.
У любого процессора есть флаг переноса, в который попадает старший бит при логическом сдвиге влево или младший бит при логическом сдвиге вправо. И есть команды циклического сдвига, когда в при сдвиге влево в младший бит попадает бит переноса, а при сдвиге вправо в старший бит попадает бит переноса. Используя это можно хоть все регистры объединить в единое целое и сдвигать их совместно.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
спасибо. Полагаю так?
00000000 <----- 10000000
1. Сдвигаем сначала левое значение (где все нули) в бит переноса попадает ноль.
2. Затем этот флаг чистим (для надежности).
3. сдвигаем на один правое значение. Во флаг попала единица.
4. "копируем" эту единицу из флага в младший разряд левого числа и получаем
00000001 00000000
; 16 bit right shift
lsr r20
ror r21
;
; 16 bit left shift
lsl r21
rol r20
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
; 16 bit right shift
lsr r20
ror r21
;
; 16 bit left shift
lsl r21
rol r20
Благодарю. Думаю в моем случае можно сделать так
16 bit left shift
rol r21
rol r20
Потому что мы производим 16 сдвигов и после 16го остановим цикл. У автора применено именно 2 циклических сдвига и благодаря Вам я понял почему так, а не иначе. Сейчас проверю.
Нашел вот это: http://radioskot.ru/publ/raznoe/chasy_r ... 18-1-0-938. Захотелось собрать такие, но проблема в том, что с микроконтроллерами никогда не работал. В связи с этим возникают 2 вопроса:
1. Как программировать микроконтроллер?
2. Как паять SMD компоненты, если есть только паяльник?
Настоящий чайник. Без шуток. Паяльник купил в сентябре. Нихрена не знаю. Прошу не ругаться на мои тупые вопросы.