BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
aleksandr-zh
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

Re: BASCOM AVR в вопросах и ответах

Сообщение aleksandr-zh »

про экономию на спичках
я сам выкручивался. Замечено что:
- замена Waitus и им подобных на вставку на ассме значительно экономит память
- использование If и Case Select - разный размер кода
- тоже и для while bitX=Y и Bitwait
-заменить Print "..." на Printbin - разница в объеме
-избегать конвертации типов (явных и не очень), т.е., Str, Val и прочее
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

Re: BASCOM AVR в вопросах и ответах

Сообщение 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
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: BASCOM AVR в вопросах и ответах

Сообщение amv2000 »

Первое что бросилось в глаза:
Set Pinc.5 ' подтягиваем кнопки к питанию
Set Pinc.4

Pinc.5 = 1 ' включаем внутренний подтягивающий резистор
Pinc.4 = 1 ' включаем внутренний подтягивающий резистор
Это две одинаковые команды, для чего дублировать.
В подпрограмме прерывания не вижу как частота задается...
http://www.forum.radiokot.ru/forum/view ... start=2020 в конце страницы регулировка яркости , может подойдет?
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

Re: BASCOM AVR в вопросах и ответах

Сообщение TIP »

Это две одинаковые команды, для чего дублировать.

Спасибо amv2000 за поправку, невнимательность, голова кругом идет.
Хочу сказать огромное спасибо edm2007 Михаилу за его сайт. http://www.edm2007.narod.ru/startavr6.html Вот где все очень доходчиво прокомментировано. Жаль что там про кнопки для регулировки частоты нет пока инфы.
Спасибо за проделанную работу.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: BASCOM AVR в вопросах и ответах

Сообщение 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
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение 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:

Изображение

Такой метод хорош тем, что генерация импульсов будет стабильной, независимо от того, что мы делаем в основном цикле. Ну а кнопки прикрутить дело не хитрое...

----------

Вы обещали тогда разобраться... Обманули, значится...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: BASCOM AVR в вопросах и ответах

Сообщение amv2000 »

edm2007 писал(а):Кнопками меняем частоту в большую или в меньшую сторону.
Ну а кнопки прикрутить дело не хитрое...

А как же частоту выбирать через Select case?
COMPARE1A = &H3D09
COMPARE1A = &H061A
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Я понять не могу, Вы же совсем недавно предлагали топорное: :tea:

Код: Выделить всё

If Plus = 1 Then
.......................
If Minus = 1 Then
.......................
Pwm0a = x


Тут уж кому как угодно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: BASCOM AVR в вопросах и ответах

Сообщение amv2000 »

Да бегло пробежался, но тяга к непознанному берет своё поэтому стало интересно. Т.е. вместо пременной X - где в примере скважность, присваиваем частоту тогда на выходе Pwm0a = x уже меняется не скважность, а частота..... и далее по тексту.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

edm2007 писал(а):Таким образом, изменяя значение в регистре OCR1A мы изменяем частоту сигнала на выходе.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
TIP
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс июл 03, 2011 06:27:35

Re: BASCOM AVR в вопросах и ответах

Сообщение TIP »

edm2007 писал(а): Вы обещали тогда разобраться... Обманули, значится...


Михаил и с чего вы взяли что я кого то обманул? Ни кому я не говорил что изучил программирование. Вот и сейчас сижу колдую над вашими проектами, подгоняю под себя. Однако туго продвигается, а надо позарез.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Да шучу я. :)) Просто Вы писали тогда:

TIP писал(а):edm2007 спасибо за помощь, попробую разобраться что к чему.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

Никак не пойму какого "лысого" пропадают данные с EEPROM памяти в Atmega8515, вроде ничего необычного. Этой памятью в данного МК раньше не пользовался.
Сделал две переменные типа байт в епроме, записываю туда время по нажатию кнопки и извлекается после подачи питания. После отключения питания минуты на месте, а часы - что попало от 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 в вопросах и ответах

Сообщение edm2007 »

Попробуйте прямую запись / чтение без дополнительных переменных для начала:

Код: Выделить всё

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 в вопросах и ответах

Сообщение vanyap1 »

Так мусора вроде нет, но появились вопросы:
Можно ячейки нумеровать последовательно - 1,2,3...?
И если мой МК имеет 512 байт памяти, то это значит что я могу записать туда 64 значения, тоесть 64 8-битных ячеек?
Или одна ячейка = один бит?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Одна ячейка = один байт. Отсюда ограничение - значение не должно быть более 255. Нумеровать можно начиная с 1, запросто.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

Спасибо, так действительно удобнее.
Подскажите пожалуйста еще, какая функция обратная этой - "Makeint"
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение 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)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

Значит таким образом мне и получится записать что то побольше в епром.

А если собственно не мудрить и записать данные из переменной типа Word в данную ячейку, другая часть слова не заполнит последующую ячейку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

vanyap1 писал(а):А если собственно не мудрить и записать данные из переменной типа Word


Нет. Я же говорю, значение не должно превышать FF. Если Вы хотите писать переменную типа Word, то пишите как и делали ранее, через Eram. Там уже Bascom сам все раскидает по ячейкам.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

Вернуться в «AVR»