Страница 130 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн апр 30, 2012 18:19:14
aleksandr-zh
про экономию на спичках
я сам выкручивался. Замечено что:
- замена Waitus и им подобных на вставку на ассме значительно экономит память
- использование If и Case Select - разный размер кода
- тоже и для while bitX=Y и Bitwait
-заменить Print "..." на Printbin - разница в объеме
-избегать конвертации типов (явных и не очень), т.е., Str, Val и прочее
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт май 04, 2012 17:30:22
TIP
Приветствую котов.
Ну вот я и прочел этот форум, все 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 порта С
Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Config Debounce = 50 ' антидребезг
Config Timer1 = Timer , Prescale = 64
Dim Num As Byte
Portd.0 = 1
Num = 0
On Timer1 Leds Nosave
Enable Interrupts ' разрешаем прерывания
Enable Timer1 ' и Timer1 в частности
Start Timer1
Do
Portd.0 = 1
Waitms 50
Portd.0 = 0
Loop
Leds:
Incr Num
If Num = 100 Then
Toggle Portd.0
Num = 0
End If
Return
End
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 07:19:36
amv2000
Первое что бросилось в глаза:
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4
Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Это две одинаковые команды, для чего дублировать.
В подпрограмме прерывания не вижу как частота задается...
http://www.forum.radiokot.ru/forum/view ... start=2020 в конце страницы регулировка яркости , может подойдет?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 08:05:50
TIP
Это две одинаковые команды, для чего дублировать.
Спасибо amv2000 за поправку, невнимательность, голова кругом идет.
Хочу сказать огромное спасибо edm2007 Михаилу за его сайт.
http://www.edm2007.narod.ru/startavr6.html Вот где все очень доходчиво прокомментировано. Жаль что там про кнопки для регулировки частоты нет пока инфы.
Спасибо за проделанную работу.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 08:40:57
amv2000
TIP писал(а):Жаль что там про кнопки для регулировки частоты нет пока инфы.
В конце страницы не смотрели:
Do
If Plus = 1 Then
Waitms 50
X = X + 1
End If
If Minus = 1 Then
Waitms 50
X = X - 1
End If
Pwm0a = x
Locate 1 , 6
Lcd X
Loop
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 09:46:13
edm2007
amv2000 писал(а):может подойдет?
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:
Такой метод хорош тем, что генерация импульсов будет стабильной, независимо от того, что мы делаем в основном цикле. Ну а кнопки прикрутить дело не хитрое...
---------------------------------------------------------------------------------------------------------
Вы обещали тогда разобраться... Обманули, значится...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 12:40:09
amv2000
edm2007 писал(а):Кнопками меняем частоту в большую или в меньшую сторону.
Ну а кнопки прикрутить дело не хитрое...
А как же частоту выбирать через Select case?
COMPARE1A = &H3D09
COMPARE1A = &H061A
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 13:06:53
edm2007
Я понять не могу, Вы же совсем недавно предлагали топорное:
Код: Выделить всё
If Plus = 1 Then
.....
If Minus = 1 Then
.....
Pwm0a = x
Тут уж кому как угодно...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 13:24:57
amv2000
Да бегло пробежался, но тяга к непознанному берет своё поэтому стало интересно. Т.е. вместо пременной X - где в примере скважность, присваиваем частоту тогда на выходе Pwm0a = x уже меняется не скважность, а частота..... и далее по тексту.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 13:27:25
edm2007
edm2007 писал(а):Таким образом, изменяя значение в регистре OCR1A мы изменяем частоту сигнала на выходе.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 17:09:57
TIP
edm2007 писал(а): Вы обещали тогда разобраться... Обманули, значится...
Михаил и с чего вы взяли что я кого то обманул? Ни кому я не говорил что изучил программирование. Вот и сейчас сижу колдую над вашими проектами, подгоняю под себя. Однако туго продвигается, а надо позарез.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 05, 2012 17:16:45
edm2007
Да шучу я.

Просто Вы писали тогда:
TIP писал(а):edm2007 спасибо за помощь, попробую разобраться что к чему.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 17:41:52
vanyap1
Никак не пойму какого "лысого" пропадают данные с EEPROM памяти в Atmega8515, вроде ничего необычного. Этой памятью в данного МК раньше не пользовался.
Сделал две переменные типа байт в епроме, записываю туда время по нажатию кнопки и извлекается после подачи питания. После отключения питания минуты на месте, а часы - что попало от 0 до 255.
Переменные -
Код: Выделить всё
Dim Hour_n As Byte , Mine_n As Byte , H_e As Eram Byte , M_e As Eram Byte
Если кнопка нажата -
Это - до начала основного цикла -
В чем трабл? Может МК бракованный? Никогда у меня такого не было.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 19:49:56
edm2007
Попробуйте прямую запись / чтение без дополнительных переменных для начала:
Код: Выделить всё
Readeeprom Minute , 10 ' считываем значение выдержки из eeprom
Readeeprom Secunde , 20 ' из 10-й ячейки в переменную Minute, из 20-й в Secunde
....................
Writeeeprom Minute , 10 ' запись в eeprom нового значения выдержки
Writeeeprom Secunde , 20 ' содержимое Minute в 10-ю ячейку, содержимое Secunde - в 20-ю
А вообще работа с этой памятью имеет свои нюансы, которые нужно учитывать обязательно. Иначе, обязательно получим мусор в итоге.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 20:56:10
vanyap1
Так мусора вроде нет, но появились вопросы:
Можно ячейки нумеровать последовательно - 1,2,3...?
И если мой МК имеет 512 байт памяти, то это значит что я могу записать туда 64 значения, тоесть 64 8-битных ячеек?
Или одна ячейка = один бит?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:05:14
edm2007
Одна ячейка = один байт. Отсюда ограничение - значение не должно быть более 255. Нумеровать можно начиная с 1, запросто.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:16:14
vanyap1
Спасибо, так действительно удобнее.
Подскажите пожалуйста еще, какая функция обратная этой - "Makeint"
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:26:34
edm2007
Для того чтобы разбить двухбайтное число, есть HIGH() и LOW().
Код: Выделить всё
Dim A As Byte , B As Byte , C As Word
C = &H14F3
A = High(c) ' возвращает старший байт - &H14 (20)
B = Low(c) ' возвращает младший байт - &HF3 (243)
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:31:25
vanyap1
Значит таким образом мне и получится записать что то побольше в епром.
А если собственно не мудрить и записать данные из переменной типа Word в данную ячейку, другая часть слова не заполнит последующую ячейку?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 06, 2012 21:36:51
edm2007
vanyap1 писал(а):А если собственно не мудрить и записать данные из переменной типа Word
Нет. Я же говорю, значение не должно превышать FF. Если Вы хотите писать переменную типа Word, то пишите как и делали ранее, через Eram. Там уже Bascom сам все раскидает по ячейкам.