BASCOM AVR в вопросах и ответах
-
aleksandr-zh
- Сверлит текстолит когтями
- Сообщения: 1278
- Зарегистрирован: Пн июн 18, 2007 21:51:20
Re: BASCOM AVR в вопросах и ответах
про экономию на спичках
я сам выкручивался. Замечено что:
- замена Waitus и им подобных на вставку на ассме значительно экономит память
- использование If и Case Select - разный размер кода
- тоже и для while bitX=Y и Bitwait
-заменить Print "..." на Printbin - разница в объеме
-избегать конвертации типов (явных и не очень), т.е., Str, Val и прочее
я сам выкручивался. Замечено что:
- замена Waitus и им подобных на вставку на ассме значительно экономит память
- использование If и Case Select - разный размер кода
- тоже и для while bitX=Y и Bitwait
-заменить Print "..." на Printbin - разница в объеме
-избегать конвертации типов (явных и не очень), т.е., Str, Val и прочее
Re: BASCOM AVR в вопросах и ответах
Приветствую котов.
Ну вот я и прочел этот форум, все 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
Ну вот я и прочел этот форум, все 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
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
Первое что бросилось в глаза:
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4
Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Это две одинаковые команды, для чего дублировать.
В подпрограмме прерывания не вижу как частота задается...
http://www.forum.radiokot.ru/forum/view ... start=2020 в конце страницы регулировка яркости , может подойдет?
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4
Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Это две одинаковые команды, для чего дублировать.
В подпрограмме прерывания не вижу как частота задается...
http://www.forum.radiokot.ru/forum/view ... start=2020 в конце страницы регулировка яркости , может подойдет?
Re: BASCOM AVR в вопросах и ответах
Это две одинаковые команды, для чего дублировать.
Спасибо amv2000 за поправку, невнимательность, голова кругом идет.
Хочу сказать огромное спасибо edm2007 Михаилу за его сайт. http://www.edm2007.narod.ru/startavr6.html Вот где все очень доходчиво прокомментировано. Жаль что там про кнопки для регулировки частоты нет пока инфы.
Спасибо за проделанную работу.
Спасибо amv2000 за поправку, невнимательность, голова кругом идет.
Хочу сказать огромное спасибо edm2007 Михаилу за его сайт. http://www.edm2007.narod.ru/startavr6.html Вот где все очень доходчиво прокомментировано. Жаль что там про кнопки для регулировки частоты нет пока инфы.
Спасибо за проделанную работу.
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
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
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
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:
Такой метод хорош тем, что генерация импульсов будет стабильной, независимо от того, что мы делаем в основном цикле. Ну а кнопки прикрутить дело не хитрое...
----------
Вы обещали тогда разобраться... Обманули, значится...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):Кнопками меняем частоту в большую или в меньшую сторону.
Ну а кнопки прикрутить дело не хитрое...
А как же частоту выбирать через Select case?
COMPARE1A = &H3D09
COMPARE1A = &H061A
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Я понять не могу, Вы же совсем недавно предлагали топорное:
Тут уж кому как угодно...
Код: Выделить всё
If Plus = 1 Then
.......................
If Minus = 1 Then
.......................
Pwm0a = x
Тут уж кому как угодно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- amv2000
- Опытный кот
- Сообщения: 717
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: BASCOM AVR в вопросах и ответах
Да бегло пробежался, но тяга к непознанному берет своё поэтому стало интересно. Т.е. вместо пременной X - где в примере скважность, присваиваем частоту тогда на выходе Pwm0a = x уже меняется не скважность, а частота..... и далее по тексту.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):Таким образом, изменяя значение в регистре OCR1A мы изменяем частоту сигнала на выходе.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а): Вы обещали тогда разобраться... Обманули, значится...
Михаил и с чего вы взяли что я кого то обманул? Ни кому я не говорил что изучил программирование. Вот и сейчас сижу колдую над вашими проектами, подгоняю под себя. Однако туго продвигается, а надо позарез.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Да шучу я.
Просто Вы писали тогда:
TIP писал(а):edm2007 спасибо за помощь, попробую разобраться что к чему.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
vanyap1
- Электрический кот
- Сообщения: 1048
- Зарегистрирован: Пт июл 30, 2010 11:49:03
- Откуда: Украина
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Никак не пойму какого "лысого" пропадают данные с EEPROM памяти в Atmega8515, вроде ничего необычного. Этой памятью в данного МК раньше не пользовался.
Сделал две переменные типа байт в епроме, записываю туда время по нажатию кнопки и извлекается после подачи питания. После отключения питания минуты на месте, а часы - что попало от 0 до 255.
Переменные -
Если кнопка нажата -
Это - до начала основного цикла -
В чем трабл? Может МК бракованный? Никогда у меня такого не было.
Сделал две переменные типа байт в епроме, записываю туда время по нажатию кнопки и извлекается после подачи питания. После отключения питания минуты на месте, а часы - что попало от 0 до 255.
Переменные -
Код: Выделить всё
Dim Hour_n As Byte , Mine_n As Byte , H_e As Eram Byte , M_e As Eram Byte
Если кнопка нажата -
Код: Выделить всё
H_e = Hour : M_e = Mine
Это - до начала основного цикла -
Код: Выделить всё
Hour_n = H_e
Mine_n = M_eВ чем трабл? Может МК бракованный? Никогда у меня такого не было.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Попробуйте прямую запись / чтение без дополнительных переменных для начала:
А вообще работа с этой памятью имеет свои нюансы, которые нужно учитывать обязательно. Иначе, обязательно получим мусор в итоге.
Код: Выделить всё
Readeeprom Minute , 10 ' считываем значение выдержки из eeprom
Readeeprom Secunde , 20 ' из 10-й ячейки в переменную Minute, из 20-й в Secunde
......................................
Writeeeprom Minute , 10 ' запись в eeprom нового значения выдержки
Writeeeprom Secunde , 20 ' содержимое Minute в 10-ю ячейку, содержимое Secunde - в 20-ю
А вообще работа с этой памятью имеет свои нюансы, которые нужно учитывать обязательно. Иначе, обязательно получим мусор в итоге.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
vanyap1
- Электрический кот
- Сообщения: 1048
- Зарегистрирован: Пт июл 30, 2010 11:49:03
- Откуда: Украина
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Так мусора вроде нет, но появились вопросы:
Можно ячейки нумеровать последовательно - 1,2,3...?
И если мой МК имеет 512 байт памяти, то это значит что я могу записать туда 64 значения, тоесть 64 8-битных ячеек?
Или одна ячейка = один бит?
Можно ячейки нумеровать последовательно - 1,2,3...?
И если мой МК имеет 512 байт памяти, то это значит что я могу записать туда 64 значения, тоесть 64 8-битных ячеек?
Или одна ячейка = один бит?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Одна ячейка = один байт. Отсюда ограничение - значение не должно быть более 255. Нумеровать можно начиная с 1, запросто.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
vanyap1
- Электрический кот
- Сообщения: 1048
- Зарегистрирован: Пт июл 30, 2010 11:49:03
- Откуда: Украина
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Спасибо, так действительно удобнее.
Подскажите пожалуйста еще, какая функция обратная этой - "Makeint"
Подскажите пожалуйста еще, какая функция обратная этой - "Makeint"
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Для того чтобы разбить двухбайтное число, есть HIGH() и LOW().
Код: Выделить всё
Dim A As Byte , B As Byte , C As Word
C = &H14F3
A = High(c) ' возвращает старший байт - &H14 (20)
B = Low(c) ' возвращает младший байт - &HF3 (243)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
-
vanyap1
- Электрический кот
- Сообщения: 1048
- Зарегистрирован: Пт июл 30, 2010 11:49:03
- Откуда: Украина
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Значит таким образом мне и получится записать что то побольше в епром.
А если собственно не мудрить и записать данные из переменной типа Word в данную ячейку, другая часть слова не заполнит последующую ячейку?
А если собственно не мудрить и записать данные из переменной типа Word в данную ячейку, другая часть слова не заполнит последующую ячейку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
vanyap1 писал(а):А если собственно не мудрить и записать данные из переменной типа Word
Нет. Я же говорю, значение не должно превышать FF. Если Вы хотите писать переменную типа Word, то пишите как и делали ранее, через Eram. Там уже Bascom сам все раскидает по ячейкам.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон