BASCOM AVR в вопросах и ответах
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Вы меня или не слышите либо понимать вообще не хотите что Вам говорят. Про "погрешность" даже говорить не хочется... Я в курсе что это работа по захвату, в коде, предложенном выше (за который Вы благодарили) еще и подсчет переполнений... Не в этом дело, я говорю, ну разберитесь Вы с работой таймера, пользы куча. Какие 1246мс? Ну подумать же можно немного, если бы между импульсами было такое время (чуть больше 1 секунды) то сколько это оборотов в минуту?
В коде вообще ерунда, Вам надо в прерывании по захвату ЗАБРАТЬ значение регистра, а в основном цикле уже его выводить. Вы же постоянно его зачем-то выводите... Давайте хоть код весь и проект. Частоту тактовую не указали, сколько таймер считает непонятно...
В коде вообще ерунда, Вам надо в прерывании по захвату ЗАБРАТЬ значение регистра, а в основном цикле уже его выводить. Вы же постоянно его зачем-то выводите... Давайте хоть код весь и проект. Частоту тактовую не указали, сколько таймер считает непонятно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
можете написать сюда код? частота 8мгц, мега8...
весь моск сломал...
весь моск сломал...
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
А, понял зачем вы его так выводите, расчета-то пока нет... Смотрите, при тактовой 8 МГц и предделителе 64 один тик таймера будет равен 64/8000000 = 0,008 мс. Ну собственно захватили мы 1000 тиков, например, и знаем сколько это времени прошло между двумя импульсами...
И еще, очищайте дисплей перед обновлением. Если Вы выведете сначала 1000 а потом 100, например, то на индикаторе так и повиснет 1000, потому как 0 от прежнего значения останется незатертым...
И еще, очищайте дисплей перед обновлением. Если Вы выведете сначала 1000 а потом 100, например, то на индикаторе так и повиснет 1000, потому как 0 от прежнего значения останется незатертым...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Magicanin и Мурик: по поводу моего вопроса о выводе переменной типа Single на LCD дисплей со стр.80.
Попробовал использовать оба варианта и оба дали положительный результат:
урезал число V до двух знаков после запятой, а вариант мне показался более красивым, если не нужна большая точность при замере. Для бортового ампервольтметра двух знаков после запятой достаточно. Еще раз спасибо.
Попробовал использовать оба варианта и оба дали положительный результат:
Код: Выделить всё
S=Fusing(V , "#.##")Код: Выделить всё
CONFIG SINGLE = SCIENTIFIC , DIGITS = 2Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):А, понял зачем вы его так выводите, расчета-то пока нет... Смотрите, при тактовой 8 МГц и предделителе 64 один тик таймера будет равен 64/8000000 = 0,008 мс. Ну собственно захватили мы 1000 тиков, например, и знаем сколько это времени прошло между двумя импульсами...
И еще, очищайте дисплей перед обновлением. Если Вы выведете сначала 1000 а потом 100, например, то на индикаторе так и повиснет 1000, потому как 0 от прежнего значения останется незатертым...
приведу весь листинг подпрограммы:
Код: Выделить всё
Sub Tahometer
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Rising
Dim Wtime As Byte
Dim Rpm As Single
Dim Rpm2 As Integer
On Capture1 Captmr
Enable Interrupts
Enable Capture1
Wtime = 100
Do
Waitms Wtime
Locate 1 , 1
Rpm = Capture1 * 0.008
Rpm = Rpm / 0.008
Rpm = 60 / Rpm
Rpm2 = Rpm / 0.000008
Lcd "RPM: " ; Rpm2 ; " "
Loop
Captmr:
Timer1 = 0
Return
End Sub
постоянный вывод не бажит весь код. ведь работает таймер..
меряет на одном таймере по захвату..
и успешно работает: при частоте 10 герц выдает 600 об/мин..
почти самый простой вариант на 16 битном таймере
Re: BASCOM AVR в вопросах и ответах
Начал "играться" с АЦП на своей отладочной плате, и возникла проблемка.
При считывании данных getadc(0) последняя цифра скачет туда сюда постоянно. Опорное брал как с AVCC, так и INTRNAL. По тестеру пульсации небольшие есть напряжения питания самой платы в 4 знаке после запятой. Контроллер ATmega16A
По схеме платы, если смотреть, на ножку AREF подключен конденсатор 0,1мк. На AVCC тоже конденсатор 0,1 мк и ножка подключена к +Vcc через смд дроссель 0805 неизвестного номинала.
Подскажите, с чем связаны такие скачки на считываемых данных АЦП? И как от них избавится?
При считывании данных getadc(0) последняя цифра скачет туда сюда постоянно. Опорное брал как с AVCC, так и INTRNAL. По тестеру пульсации небольшие есть напряжения питания самой платы в 4 знаке после запятой. Контроллер ATmega16A
По схеме платы, если смотреть, на ножку AREF подключен конденсатор 0,1мк. На AVCC тоже конденсатор 0,1 мк и ножка подключена к +Vcc через смд дроссель 0805 неизвестного номинала.
Подскажите, с чем связаны такие скачки на считываемых данных АЦП? И как от них избавится?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Re: BASCOM AVR в вопросах и ответах
у меня есть готовый код. Только я делал для скутера там тахометр с выставляемым пределом превышения оборотов, температура двигателя с выставляемым пределом, вольтметр бортовой сети, емкостной датчик уровня топлива с точностью 100 грамм и угол опережения зажигания. Работает это все уже около 2 лет никаких сбоев не замечал, если интересно могу выложить только во вторник.
- Magicanin
- Нашел транзистор. Понюхал.
- Сообщения: 184
- Зарегистрирован: Чт янв 13, 2011 11:36:16
- Откуда: Красноярский край
Re: BASCOM AVR в вопросах и ответах
serg_svd
Это из-за наводок на входе ацп, используй провода короче или поставь на вход фильтр феритовый с кондером. По питанию фильтр тоже не помешает.
Это из-за наводок на входе ацп, используй провода короче или поставь на вход фильтр феритовый с кондером. По питанию фильтр тоже не помешает.
[size=85][color=#80BF00][b]Извращение это[/b][/color]: программатор - [color=#40BFBF]AVR910 by Prottoss[/color], прошивка - [color=#40BFBF]Doper[/color], драйвер - [color=#40BFBF]Osamu Tamura[/color], называется - [color=#FF0000]STK500[/color]![/size]
Re: BASCOM AVR в вопросах и ответах
Magicanin писал(а):serg_svd
Это из-за наводок на входе ацп, используй провода короче или поставь на вход фильтр феритовый с кондером. По питанию фильтр тоже не помешает.
Плата питается непосредственно от USB. Пробовал внешний БП тоже самое. Надо попробовать зашунтировать сам выход конденсатором наверное. другого выхода, кроме как программно усреднять значения, я не нашел.
Программное усреднение спасает, но хотелось бы победить аппаратно
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- WildCat
- Собутыльник Сэра Мурра
- Сообщения: 2918
- Зарегистрирован: Вт янв 10, 2006 00:26:45
- Откуда: Челябинск
Re: BASCOM AVR в вопросах и ответах
АЦП очень чуткий и будет прыгать постоянно. Нужно тщательно экранировать от помех, если позволяет режим работы, то подтягивать вход конденсатором к земле от ВЧ наводок.
А так чем длиннее провода, тем сильнее будет скакать значение. И опять же, даже наряду с экранированием, программное усреднение даже 3-5 выборок даст очень хороший результат.
А так чем длиннее провода, тем сильнее будет скакать значение. И опять же, даже наряду с экранированием, программное усреднение даже 3-5 выборок даст очень хороший результат.
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Для снижения помех можно так же завести прерывание окончания преобразования АЦП, в котором забирать результат преобразования, в главном же цикле запускать измерение и уходить в спящий режим POWER ADCNOISE, например.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
SyncM писал(а):у меня есть готовый код. Только я делал для скутера там тахометр с выставляемым пределом превышения оборотов, температура двигателя с выставляемым пределом, вольтметр бортовой сети, емкостной датчик уровня топлива с точностью 100 грамм и угол опережения зажигания. Работает это все уже около 2 лет никаких сбоев не замечал, если интересно могу выложить только во вторник.
буду рад увидеть схему и код..
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):Для снижения помех можно так же завести прерывание окончания преобразования АЦП, в котором забирать результат преобразования, в главном же цикле запускать измерение и уходить в спящий режим POWER ADCNOISE, например.
Можно еще и так:
Do
Start ADC
Idle
Stop ADC
.................
.................
.................
Loop
End
А результат забираем в прерывании, как и писал выше edm2007
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
Да, вот еще: я тут давеча интересовался про управление часами PCF8583 по шине I2C. Так вот, кому интересно, я таки их победил. Вот код часов с термометром. Только функции кнопок пока не написаны.
Код: Выделить всё
$regfile = "m16def.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 8
$baud = 19200
$framesize = 24
$lib "mcsbyte.lbx"
'*************************************
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.4 , Db6 = Portb.5 , Db7 = Portb.6
Config Portb.3 = Output , Portb.7 = Output
Config Sda = Porta.4
Config Scl = Porta.5
Config Clock = User
Config 1wire = Portd.7
Config Lcd = 16 * 1
Config Debounce = 50
Config Single = Scientific , Digits = 1
'Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'+++++++++++++++++++++++++++++++++++++
Declare Sub Settime(byval H1 As Byte , Byval M1 As Byte , Byval S1 As Byte )
Declare Sub Gettime()
'*************************************
Dim H As Byte , M As Byte , S As Byte
Dim Znak As String * 1
Dim T As Single , T2 As Single
Dim Byte0 As Byte , Byte1 As Byte
'+++++++++++++++++++++++++++++++++++++
Const Pcf8583w = &HA0
Const Pcf8583r = &HA1
Deflcdchar 0 , 14 , 17 , 17 , 17 , 14 , 32 , 32 , 32
'*************************************
But1 Alias Pind.2
But2 Alias Pind.3
But3 Alias Pind.4
But4 Alias Pind.5
But5 Alias Pind.6
Led1 Alias Portb.3
Rele Alias Portb.7
'*************************************
'Open "comd.1:19200,8,n,1" For Output As #1
'Open "comd.0:19200,8,n,1" For Input As #2
'*************************************
'Enable Interrupts
'*************************************
Znak = "+"
Cursor Off
Call Settime(12 , 0 , 0 )
Do
Debounce But1 , 0 , Knopka1 , Sub
Debounce But2 , 0 , Knopka2 , Sub
Debounce But3 , 0 , Knopka3 , Sub
Debounce But4 , 0 , Knopka4 , Sub
Debounce But5 , 0 , Knopka5 , Sub
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
If Byte1 >= 248 Then ' Проверяем на отрицательную температуру.
Byte0 = &HFF - Byte0 ' 248 в десятичном - 11111000 в двоичном.
Byte1 = &HFF - Byte1 ' Если температура отрицательная - вычитаем из &HFF
Znak = "-"
Else
Znak = "+"
End If
T = Byte0 / 16
T2 = Byte1 * 16
T = T + T2
Call Gettime()
Cls
Locate 1 , 1
Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " " ; Znak ; T ; Chr(0) ; "C"
'Print #1 , Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)
Waitms 250
Loop
'Close #2
'Close #1
End
Knopka1:
Return
Knopka2:
Return
Knopka3:
Return
Knopka4:
Return
Knopka5:
Return
Sub Gettime()
I2cstart 'старт
I2cwbyte Pcf8583w 'адрес записи PCF8583
I2cwbyte 2 'выбираем регистр
I2cstart 'повторяем старт
I2cwbyte Pcf8583r 'адрес чтения PCF8583
I2crbyte S , Ack 'чтение данных
I2crbyte M , Ack
I2crbyte H , Nack
I2cstop
End Sub
Sub Settime(h1 As Byte , M1 As Byte , S1 As Byte )
H1 = Makebcd(h1)
M1 = Makebcd(m1)
S1 = Makebcd(s1)
I2cstart 'старт
I2cwbyte Pcf8583w 'режим записи
I2cwbyte 2 'выбираем регистр секунд
I2cwbyte S1 ' ---------- минут
I2cwbyte M1 ' ---------- часов
I2cwbyte H1
I2cwbyte 0
I2cwbyte 0
I2cstop
End Sub
_printword:Цапу крутить надо!!! Ку или не ку?
- kip96
- Держит паяльник хвостом
- Сообщения: 965
- Зарегистрирован: Ср авг 26, 2009 08:24:50
- Откуда: 1300км от Пупа
Re: BASCOM AVR в вопросах и ответах
И вопросы:
Как стабильность,(чуствительность к расположению кварца), у меня есть платка с такими часиками, так кварц стоит как обычный кондёр.
В протеусе файла нет?
И вообщем:
В чём отличие (преимущество) между Declare Sub и просто Gosub???
Как стабильность,(чуствительность к расположению кварца), у меня есть платка с такими часиками, так кварц стоит как обычный кондёр.
В протеусе файла нет?
И вообщем:
В чём отличие (преимущество) между Declare Sub и просто Gosub???
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Re: BASCOM AVR в вопросах и ответах
В сети нашел тaблэтку для басика, которая превращает беспатную демо версию
BАSCOM-АVR 2.0.5.0 в полнофункциональную, по крайней мере, снимает ограничение на 4 кило кода.
Особо не тестил, но вроде программы созданные в пролеченом басике нормально работают.
Лечится просто. Нужно скопировать лeкарство и папку с установленной демкой басика и запустить тaблетку и нажать на кнопку Uрdate.
http://ifolder.ru/23508666
BАSCOM-АVR 2.0.5.0 в полнофункциональную, по крайней мере, снимает ограничение на 4 кило кода.
Особо не тестил, но вроде программы созданные в пролеченом басике нормально работают.
Лечится просто. Нужно скопировать лeкарство и папку с установленной демкой басика и запустить тaблетку и нажать на кнопку Uрdate.

http://ifolder.ru/23508666
- WildCat
- Собутыльник Сэра Мурра
- Сообщения: 2918
- Зарегистрирован: Вт янв 10, 2006 00:26:45
- Откуда: Челябинск
Re: BASCOM AVR в вопросах и ответах
Вопрос о связке ds18b20 + bascom + proteus уже поднимался, но подниму еще раз.
Схема - стандартный 1-wire на portb.0 и LCD. МК = мега8535
Кварц - внешний 8мгц (указан в баскоме и задан в свойствах МК в протеусе)
Код такой:
В середине кода видно, что на экран выводятся два байта. Так вот была проблема что они выводились в виде 101010, когда температура задана 0 градусов. Как только в свойствах термометра изменил Time Slot с 120u до 150u, проблема пропала. Теперь при температуре 0 выводятся все нули, при температуре 1 выводится младший байт 00000001. Вполне логично. Но при температуре в 2 градуса, выводится 00000100, т.е. выдается 4 градуса. И такая проблема сохраняется и дальше. То есть если самый младший бит равен нулю, то этот ноль читается два раза. При температуре в 3 градуса снова читается верно 00000011. А при температуре 4 градуса считывается 00010000, т.е. 16 градусов. При 5 градусах читается 00001001, т.е. отображается 9. И так далее.
В чем может быть проблема? Неверные тайминги? Может, где задержку добавить надо?
Схема - стандартный 1-wire на portb.0 и LCD. МК = мега8535
Кварц - внешний 8мгц (указан в баскоме и задан в свойствах МК в протеусе)
Код такой:
Код: Выделить всё
Dim B0 As Byte
Dim B1 As Byte
Dim T As Byte
Dim Sign As String * 1
Do
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
B0 = 1wread()
B1 = 1wread()
Cls
Locate 1 , 1
Lcd Bin(b0)
Locate 2 , 1
Lcd Bin(b1)
Wait 1
1wreset
If B1 >= 248 Then
B0 = &HFF - B0
B1 = &HFF - B1
Sign = "-"
Else
Sign = "+"
End If
Shift B0 , Left , 5
Shift B1 , Left , 3
T = B0 + B1
Cls
Lcd Sign ; T ; "C"
Waitms 1000
LoopВ середине кода видно, что на экран выводятся два байта. Так вот была проблема что они выводились в виде 101010, когда температура задана 0 градусов. Как только в свойствах термометра изменил Time Slot с 120u до 150u, проблема пропала. Теперь при температуре 0 выводятся все нули, при температуре 1 выводится младший байт 00000001. Вполне логично. Но при температуре в 2 градуса, выводится 00000100, т.е. выдается 4 градуса. И такая проблема сохраняется и дальше. То есть если самый младший бит равен нулю, то этот ноль читается два раза. При температуре в 3 градуса снова читается верно 00000011. А при температуре 4 градуса считывается 00010000, т.е. 16 градусов. При 5 градусах читается 00001001, т.е. отображается 9. И так далее.
В чем может быть проблема? Неверные тайминги? Может, где задержку добавить надо?
Re: BASCOM AVR в вопросах и ответах
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
WildCat, поменяйте Time Slot на 30u. Проблем быть не должно, я уже давно так делаю. Если все тайминги по порядку то 30 - 120 - 480 - 30 - 750 - 10.
И еще, откуда Вы берете вот такое:
Почему именно так? Там же просто все, нулевой байт угоняется на 4 бита ВПРАВО (чтобы убрать десятые и оставить только целые), а первый байт угоняется на 4 бита ВЛЕВО. А у Вас как?
И еще, откуда Вы берете вот такое:
Код: Выделить всё
Shift B0 , Left , 5
Shift B1 , Left , 3
Почему именно так? Там же просто все, нулевой байт угоняется на 4 бита ВПРАВО (чтобы убрать десятые и оставить только целые), а первый байт угоняется на 4 бита ВЛЕВО. А у Вас как?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
WildCat, вот например так можно... Я только одно не сделал, не внес поправку в отрицательную температуру, ну да это Вы легко сделаете. 
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон