про экономию на спичках
я сам выкручивался. Замечено что:
- замена Waitus и им подобных на вставку на ассме значительно экономит память
- использование If и Case Select - разный размер кода
- тоже и для while bitX=Y и Bitwait
-заменить Print "..." на Printbin - разница в объеме
-избегать конвертации типов (явных и не очень), т.е., Str, Val и прочее
Приветствую котов.
Ну вот я и прочел этот форум, все 130 страниц. Кое что конечно понял, но не все. Да это наверно и не возможно за столь короткий срок. Научился мигать светодиодом и не одним. Но….. то что мне нужно так и не усвоил. Конечно программа в законченном виде которую хочется написать, как я понял довольно сложная.
Для начала. Имеем один светодиод и две кнопки. Частота мигания светодиода должна укладываться в интервал от 5 Гц до 400 Гц. Кнопками меняем частоту в большую или в меньшую сторону. Желательно еще и скважность импульсов менять тоже кнопками, но это уже на будущее. Кто силен в программировании помогите. Светодиод это так для наглядности, на самом деле там будет подключаться большая индуктивность. Вот что пока удалось самому написать.
$regfile = "m8def.dat"
$crystal = 4000000
Config Portd.0 = Output ' порт d.0 на выход - подключаем к нему светодиод
Config Pinc.5 = Input ' порт c.5 на вход - подключаем к нему кнопку
Config Pinc.4 = Input ' порт c.4 на вход - подключаем к нему кнопку
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4
Dig1 Alias Portd.0 ' присваиваем имя Dig1 выводу 0 порта D
Dig2 Alias Pinc.5 ' присваиваем имя Dig2 выводу 5 порта С
Dig3 Alias Pinc.4 ' присваиваем имя Dig3 выводу 4 порта С
Первое что бросилось в глаза:
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4
Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Это две одинаковые команды, для чего дублировать.
В подпрограмме прерывания не вижу как частота задается... http://www.forum.radiokot.ru/forum/view ... start=2020 в конце страницы регулировка яркости , может подойдет?
Спасибо amv2000 за поправку, невнимательность, голова кругом идет.
Хочу сказать огромное спасибо edm2007 Михаилу за его сайт. http://www.edm2007.narod.ru/startavr6.html Вот где все очень доходчиво прокомментировано. Жаль что там про кнопки для регулировки частоты нет пока инфы.
Спасибо за проделанную работу.
amv2000, дело-то в том, что там таймер работает в режиме ШИМ. А это изменение скважности при постоянной частоте. У нас же первоначально задача:
TIP писал(а):Кнопками меняем частоту в большую или в меньшую сторону.
TIP, спасибо за отзыв. Вы же спрашивали уже по этой теме. И я ведь подробно расписал как можно на таймере регулировку частоты организовать. Совсем недавно ведь было...
'**********[Псевдокоманды управления]**************
$regfile = "m8def.dat" ' тип МК
$crystal = 1000000 ' выбор кристала
'**********[Инициализация прерываний]**************
Config Timer1 = Timer , Prescale = 64 , Compare A = Toggle , Clear Timer = 1
COMPARE1A = &H3D09
'**********[Начало основной программы]**************
Do ' пустой цикл
Loop
Собственно, всё. Таймер настраивается в режим СТС (сброс по совпадению с регистром сравнения).
В двух словах: Таймер Т1 считает от 0 и до значения, расположеного в регистре OCR1A (COMPARE1A). После чего на выводе 15 (OC1A) МК Atmega8 уровень меняется на противоположный. Затем счет начинается с нуля, и все повторяется снова. Таким образом, изменяя значение в регистре OCR1A мы изменяем частоту сигнала на выходе.
COMPARE1A = &H3D09:
COMPARE1A = &H061A:
Такой метод хорош тем, что генерация импульсов будет стабильной, независимо от того, что мы делаем в основном цикле. Ну а кнопки прикрутить дело не хитрое...
Да бегло пробежался, но тяга к непознанному берет своё поэтому стало интересно. Т.е. вместо пременной X - где в примере скважность, присваиваем частоту тогда на выходе Pwm0a = x уже меняется не скважность, а частота..... и далее по тексту.
edm2007 писал(а): Вы обещали тогда разобраться... Обманули, значится...
Михаил и с чего вы взяли что я кого то обманул? Ни кому я не говорил что изучил программирование. Вот и сейчас сижу колдую над вашими проектами, подгоняю под себя. Однако туго продвигается, а надо позарез.
Никак не пойму какого "лысого" пропадают данные с EEPROM памяти в Atmega8515, вроде ничего необычного. Этой памятью в данного МК раньше не пользовался.
Сделал две переменные типа байт в епроме, записываю туда время по нажатию кнопки и извлекается после подачи питания. После отключения питания минуты на месте, а часы - что попало от 0 до 255.
Переменные -
Readeeprom Minute , 10 ' считываем значение выдержки из eeprom
Readeeprom Secunde , 20 ' из 10-й ячейки в переменную Minute, из 20-й в Secunde
....................
Writeeeprom Minute , 10 ' запись в eeprom нового значения выдержки
Writeeeprom Secunde , 20 ' содержимое Minute в 10-ю ячейку, содержимое Secunde - в 20-ю
А вообще работа с этой памятью имеет свои нюансы, которые нужно учитывать обязательно. Иначе, обязательно получим мусор в итоге.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Так мусора вроде нет, но появились вопросы:
Можно ячейки нумеровать последовательно - 1,2,3...?
И если мой МК имеет 512 байт памяти, то это значит что я могу записать туда 64 значения, тоесть 64 8-битных ячеек?
Или одна ячейка = один бит?
vanyap1 писал(а):А если собственно не мудрить и записать данные из переменной типа Word
Нет. Я же говорю, значение не должно превышать FF. Если Вы хотите писать переменную типа Word, то пишите как и делали ранее, через Eram. Там уже Bascom сам все раскидает по ячейкам.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон