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

Обсуждаем контроллеры компании Atmel.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

akl писал(а):uk8amk А что такое ADUM485?

опечатка
okean220
Родился
Сообщения: 13
Зарегистрирован: Вт янв 18, 2011 00:00:18

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

Сообщение okean220 »

нужна помощь .как можно вывести поочерёдно на индикатор значения B = Getadc(0) отдельно от значения А . заранее спасибо. плюс файл .
Acp:
Start Adc


A = Getadc(5)
B = Getadc(0)

M1 = A * 5
M2 = M1
M3 = M1


M1 = M1 / 1000
N1 = Abs(m1) '

M2 = M2 Mod 1000
M2 = M2 / 100
N2 = Abs(m2)

M3 = M3 Mod 100
M3 = M3 / 10
N3 = Abs(m3)
Вложения
фен .0.rar
(1.17 КБ) 261 скачивание
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Заведите счетчик, по которому будет меняться благ. Флагом может служить переменная типа БИТ.
По состоянию блага приравнивайте для М1 - А или В
Как то так..

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

dim counter as word , flag as bit

do
incr counter
if counter = 500 then : toggle flag: counter = 0 : end if

A = Getadc(5)
B = Getadc(0)
if flag = 1 then : M1 = A * 5 : else : M1 = B  * 5 : end if
M2 = M1
M3 = M1


M1 = M1 / 1000
N1 = Abs(m1) '

M2 = M2 Mod 1000
M2 = M2 / 100
N2 = Abs(m2)

M3 = M3 Mod 100
M3 = M3 / 10
N3 = Abs(m3)
loop
okean220
Родился
Сообщения: 13
Зарегистрирован: Вт янв 18, 2011 00:00:18

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

Сообщение okean220 »

сильно мерцают цифры на индикаторе.при таком варианте кода.
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Не знаю, у меня такой вариант в часах уже 5 лет работает.
Код ниже.
Понимаю, что код может показаться не оптимальным, но он рабочий, без таймеров и прерываний.

Спойлер

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

$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32


Config Sda = Porta.1 : Config Scl = Porta.0
Ddrb = 255
Config Portd.3 = Output                                     'ok
Config Portd.4 = Output                                     'ok
Config Portd.5 = Output                                     'ok
Config Portd.6 = Output                                     'ok

Dim N(4) As Byte

Dim Index As Byte

Dim Seco As Byte , Mine As Byte , Hour As Byte

Dim Count As Byte , T As Byte , C As Byte
Dim Disp As String * 4
Dim W(4) As String * 1
Dim Pak(4) As String * 2
Dim T1 As Byte , Byte0 As Byte , Byte1 As Byte
Dim T2 As Byte
Dim Viv As Bit

Config 1wire = Portd.2
'Seco = 0
'Seco = Makebcd(seco) : Mine = Makebcd(43) : Hour = Makebcd(20)
'I2cstart
'I2cwbyte &HA2
'I2cwbyte &H03
'I2cwbyte Seco
'I2cwbyte Mine
'I2cwbyte Hour
'I2cstop



'1:
Do
I2cstart                                                    'Чтение времени
I2cwbyte &HA2
I2cwbyte &H02
I2cstart
I2cwbyte &HA3
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop
Seco = Makedec(seco) : Mine = Makedec(mine) : Hour = Makedec(hour)
If Count < Seco Then : Incr C                               'Каждую секунду увеличиваем значение флага С

If C = 1 Then                                               'если с = 1 то -
1wreset                                                     'Запрос на преобразование температуры
   1wwrite &HCC
   1wwrite &H44
End If

If C = 2 Then                                               'если с = 2 то -
1wreset                                                     'Чтение температурры
   1wwrite &HCC
   1wwrite &HBE
   Byte0 = 1wread()
   Byte1 = 1wread()
   T1 = Byte0 / 16
   T2 = Byte1 * 16
   T1 = T1 + T2
End If

If C = 5 Then : Viv = 1 : End If                            'флаг для вывода температурры(1 сек)
If C = 6 Then : Viv = 0 : C = 0 : End If                    'сброс флага вывода температурры
End If

Count = Seco
If Viv = 0 Then                                             'Формирование строки для отображение часов
Pak(1) = Str(hour)                                          'переводим байтовую переменную в строковую
Pak(1) = Format(pak(1) , "00")                              'форматируем строковую переменную до вида - "НН"
Pak(2) = Str(mine)                                          'переводим байтовую переменную в строковую
Pak(2) = Format(pak(2) , "00")                              'форматируем строковую переменную до вида - "ММ"
Disp = Pak(1) + Pak(2)                                      'Составляем строковую переменную для вывода - "ННММ"
Else                                                        'Формирование строки для отображение температурры
Pak(1) = Str(t1)                                            'переводим байтовую переменную в строковую
'Pak(1) = Format(pak(1) , "00")
Disp = " " + Pak(1) + "^"                                   'форматируем строковую переменную до вида - " ТT^".(^-знак градуссы С)
End If

For Index = 1 To 4                                          'Разбор строки на разряды ы вавод на дисплей
W(index) = Mid(disp , Index , 1)
N(index) = Val(w(index))
If W(index) = " " Then : N(index) = 10 : End If
If W(index) = "^" Then : N(index) = 11 : End If
Next Index
Set Portd.6 : Portb = Lookup(n(1) , P) : Waitms 1 : Reset Portd.6
Set Portd.5 : Portb = Lookup(n(2) , P) : Waitms 1 : Reset Portd.5
Set Portd.4 : Portb = Lookup(n(3) , P) : Waitms 1 : Reset Portd.4
Set Portd.3 : Portb = Lookup(n(4) , P) : Waitms 1 : Reset Portd.3
Loop
P:
Data &B11010111 , &B10000100 , &B11001011 , &B11001110 , &H9C , &H5E , &H5F , &HC4 , &HDF , &HDE , &H00 , &HD8
okean220
Родился
Сообщения: 13
Зарегистрирован: Вт янв 18, 2011 00:00:18

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

Сообщение okean220 »

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

Добавлено after 57 minutes 40 seconds:
вторая версия прошивки.в ней нет значения установки при нажатия на кнопку.

https://www.youtube.com/watch?v=NVF4AUaZjsA
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Сделал небольшой эксперимент. Помигал светодиодом.
Понадобилось узнать разницу в частоте мигания при разных подходах к делу.
Использовал BascomAVR и AVR Studio7.
Все остальное на скринах.
Изображение Изображение
Изображение Изображение

Странно что toggle в баскоме отрабатывает медленнее чем set reset.
Примечательно что выходной HEX баскома = 192 байта, а студии - 142 байта.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Здравствуйте.

vanyap1 писал(а):Странно что toggle в баскоме отрабатывает медленнее чем set reset.


Если посмотреть на дизасм, то становится понятно, почему так происходит:

Изображение

А для инверсии бита в Си, можно сделать так:

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

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

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

Сообщение vanyap1 »

Дизасм с кода баскома и студии должен быть одинаковым при простом Set, Reset bit. Кажется, но сейчас посмотрю.
Но видно что код баскома делает мигание это с частотой 2,4 МГц, а студия 2,66МГц.
IDok
Встал на лапы
Сообщения: 122
Зарегистрирован: Ср фев 01, 2017 17:57:15

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

Сообщение IDok »

здрассьте, уважаемые. решил вот открыть для себя чудный мир микроконтроллеров и сходу заимел прикладную задачу, с которой и прошу помощи. итак, задача - линейка из 9 (лучше 11) светодиодов, поочередно вспыхивающих и плавно гаснущих. т.е. форма сигнала по сути - убывающая пила. из гугля я понял, что надо лудить ШИМ, но аппаратный ШИМ весь на таймерах, а где их взять такую палестину? не лучше ли будет использовать программный ШИМ, благо кроме этой задачи МК больше ничего делать не будет (ну почти. там еще пара фенечек). так как я твердо решил стоять на бейсике, то на нем и стою, но вот примеров программного ШИМа на нем не нашел. не подкинете хоть на 1-2 канала, а дальше я может и сам справлюсь?
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Вот тут. Если что не понятно - спрашивайте.
IDok
Встал на лапы
Сообщения: 122
Зарегистрирован: Ср фев 01, 2017 17:57:15

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

Сообщение IDok »

vem566 спасибо, вечерком обкатаю в симулякре

Добавлено after 7 hours 22 minutes 12 seconds:
долго смотрел в код, пока он не начал смотреть в меня. но вопросы остались:
Config Portd.2 = Output : Led Alias Portd.2
Config Timer0 = Timer , Prescale = 1 : On Timer0 Pulse : Enable Timer0 : Enable Interrupts
Dim Z As Byte , Y As Integer

Do
Y = 10
Loop
End

Pulse:
Incr Z
If Z >= Y Then : Reset Led : Z = 0
Else : Set Led : End If
Return

што должен делать в данном случае цикл Do\Loop и где в теле программы вызов подпрограммы Pulse?
Radan
Мучитель микросхем
Сообщения: 465
Зарегистрирован: Ср июн 21, 2006 08:24:32
Откуда: Лисичанск
Контактная информация:

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

Сообщение Radan »

IDok писал(а):што должен делать в данном случае цикл Do\Loop и где в теле программы вызов подпрограммы Pulse?



В Do\Loop вы должны менять значение яркости переменной Y.
Pulse срабатывает по таймеру 0 - On Timer0 Pulse
IDok
Встал на лапы
Сообщения: 122
Зарегистрирован: Ср фев 01, 2017 17:57:15

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

Сообщение IDok »

Radan писал(а):
В Do\Loop вы должны менять значение яркости переменной Y.
Pulse срабатывает по таймеру 0 - On Timer0 Pulse

тысяча извинений, я сварщик пока не настоящий, но я там вижу бесконечный пустой цикл без надежды на выход и до подпрограммы дело не доходит :(
да и симулятор Баскома тоже по циклу крутится и не хочет выходить
Аватара пользователя
Bear2011
Друг Кота
Сообщения: 13253
Зарегистрирован: Ср апр 06, 2011 09:58:13
Откуда: Кузбасс

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

Сообщение Bear2011 »

симулятор Баскома тоже по циклу крутится и не хочет выходить


А это в Proteus'e смотреть надо.
Radan
Мучитель микросхем
Сообщения: 465
Зарегистрирован: Ср июн 21, 2006 08:24:32
Откуда: Лисичанск
Контактная информация:

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

Сообщение Radan »

IDok писал(а):тысяча извинений, я сварщик пока не настоящий


Здесь рабочий девайс с ШИМом - http://bascom.at.ua/publ/1-1-0-9
IDok
Встал на лапы
Сообщения: 122
Зарегистрирован: Ср фев 01, 2017 17:57:15

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

Сообщение IDok »

А это в Proteus'e смотреть надо.

шайтанская кегля! работает! О_О
Здесь рабочий девайс с ШИМом

барин, я там половины слов не понимаю! :cry: но все равно спасибо, буду на мелкой проге отрабатывать. ну и риторический вопрос - два эффекта одновременно (на разных выходах, ессно) я ж не запущу, да? пошаговость, как она есть?
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

IDok писал(а): два эффекта одновременно (на разных выходах, ессно) я ж не запущу, да?

Почему? В приведенном примере 8 работает. Если, конечно, МК будет чем то еще занят, то эта самая "занятость" может тормозить, но в целом все работает.
Если частота МК 8 МГц, таймер срабатывает по переполнению(можно сократить время срабатывания), то есть в 256 раз медленнее. Получается 31250 Гц. Дискретность ШИМа то же 256. Частота мигания диодов 122 Герца, что глазом не заметно.
Ну и можно дальше развлекаться. Частоту поднять до 16-20 МГц, таймер заставить срабатывать по совпадению, дискретность ШИМа уменьшить до 64 градаций яркости. Этим можно еще удвоить каналы.
Аватара пользователя
svic
Друг Кота
Сообщения: 5837
Зарегистрирован: Ср ноя 17, 2010 23:10:55
Откуда: Ижевск LO66NU
Контактная информация:

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

Сообщение svic »

Привет! Намедни была нужда поиграться с вводом/выводом, так в шпорах нета обнаружил нестыковку -
одне пишут:
К примеру нам надо сконфигурировать порт B таким образом


CONFIG PORTB = OUTPUT
CONFIG PORTB.3 = INPUT
CONFIG PORTB.4 = INPUT
CONFIG PORTB.5 = INPUT
То есть – 3,4 и 5 выводы порта настроены на вход, а остальные на выход. С помощью DDR то же самое можно сделать одной строчкой… вот так…

DDRB=&B11100011

другие:
Можно также устанавливать направление соответствующих линий порта с помощью установки регистра DDRB. Для примера инструкция:

DDRB = &B00001111

повлечет запись числа 15 в регистр направления порта B, и 4 старших бита (PORTB.7 до PORTB.4) будут выходами, а 4 младшие (PORTB.3 до PORTB.0) входами.

или вовсе:
это все можно настроить через специальный регистр DDR, настройка займет всего одну строчку кода:

DDRB = 11101011 '2 и 4 ножки порта B сконфигурированы на вход, остальные - на выход

Вопрос - какой из вариантов правильный? :dont_know: :))) :)))
В начале жизнь мучает вопросами, в конце - ответами...
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

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

Сообщение vem566 »

Работать это будет одинаково, так что как хочется, так и пишите.
Ответить

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