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

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

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

Сообщение edm2007 »

Вы меня или не слышите либо понимать вообще не хотите что Вам говорят. Про "погрешность" даже говорить не хочется... Я в курсе что это работа по захвату, в коде, предложенном выше (за который Вы благодарили) еще и подсчет переполнений... Не в этом дело, я говорю, ну разберитесь Вы с работой таймера, пользы куча. Какие 1246мс? Ну подумать же можно немного, если бы между импульсами было такое время (чуть больше 1 секунды) то сколько это оборотов в минуту?

В коде вообще ерунда, Вам надо в прерывании по захвату ЗАБРАТЬ значение регистра, а в основном цикле уже его выводить. Вы же постоянно его зачем-то выводите... Давайте хоть код весь и проект. Частоту тактовую не указали, сколько таймер считает непонятно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
AVRDaemon
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб дек 06, 2008 13:48:59

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

Сообщение AVRDaemon »

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

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

Сообщение edm2007 »

А, понял зачем вы его так выводите, расчета-то пока нет... Смотрите, при тактовой 8 МГц и предделителе 64 один тик таймера будет равен 64/8000000 = 0,008 мс. Ну собственно захватили мы 1000 тиков, например, и знаем сколько это времени прошло между двумя импульсами...

И еще, очищайте дисплей перед обновлением. Если Вы выведете сначала 1000 а потом 100, например, то на индикаторе так и повиснет 1000, потому как 0 от прежнего значения останется незатертым...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
dhouse
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт апр 16, 2010 12:30:03

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

Сообщение dhouse »

Magicanin и Мурик: по поводу моего вопроса о выводе переменной типа Single на LCD дисплей со стр.80.
Попробовал использовать оба варианта и оба дали положительный результат:

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

S=Fusing(V , "#.##")
урезал число V до двух знаков после запятой, а вариант

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

CONFIG SINGLE = SCIENTIFIC , DIGITS = 2
мне показался более красивым, если не нужна большая точность при замере. Для бортового ампервольтметра двух знаков после запятой достаточно. Еще раз спасибо.
AVRDaemon
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб дек 06, 2008 13:48:59

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

Сообщение AVRDaemon »

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 битном таймере
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Начал "играться" с АЦП на своей отладочной плате, и возникла проблемка.
При считывании данных getadc(0) последняя цифра скачет туда сюда постоянно. Опорное брал как с AVCC, так и INTRNAL. По тестеру пульсации небольшие есть напряжения питания самой платы в 4 знаке после запятой. Контроллер ATmega16A
По схеме платы, если смотреть, на ножку AREF подключен конденсатор 0,1мк. На AVCC тоже конденсатор 0,1 мк и ножка подключена к +Vcc через смд дроссель 0805 неизвестного номинала.
Подскажите, с чем связаны такие скачки на считываемых данных АЦП? И как от них избавится?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
SyncM
Открыл глаза
Сообщения: 62
Зарегистрирован: Вт ноя 03, 2009 07:44:57

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

Сообщение SyncM »

у меня есть готовый код. Только я делал для скутера там тахометр с выставляемым пределом превышения оборотов, температура двигателя с выставляемым пределом, вольтметр бортовой сети, емкостной датчик уровня топлива с точностью 100 грамм и угол опережения зажигания. Работает это все уже около 2 лет никаких сбоев не замечал, если интересно могу выложить только во вторник.
Аватара пользователя
Magicanin
Нашел транзистор. Понюхал.
Сообщения: 184
Зарегистрирован: Чт янв 13, 2011 11:36:16
Откуда: Красноярский край

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

Сообщение Magicanin »

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]
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

Magicanin писал(а):serg_svd
Это из-за наводок на входе ацп, используй провода короче или поставь на вход фильтр феритовый с кондером. По питанию фильтр тоже не помешает.

Плата питается непосредственно от USB. Пробовал внешний БП тоже самое. Надо попробовать зашунтировать сам выход конденсатором наверное. другого выхода, кроме как программно усреднять значения, я не нашел.
Программное усреднение спасает, но хотелось бы победить аппаратно
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

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

Сообщение WildCat »

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

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

Сообщение edm2007 »

Для снижения помех можно так же завести прерывание окончания преобразования АЦП, в котором забирать результат преобразования, в главном же цикле запускать измерение и уходить в спящий режим POWER ADCNOISE, например.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
AVRDaemon
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб дек 06, 2008 13:48:59

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

Сообщение AVRDaemon »

SyncM писал(а):у меня есть готовый код. Только я делал для скутера там тахометр с выставляемым пределом превышения оборотов, температура двигателя с выставляемым пределом, вольтметр бортовой сети, емкостной датчик уровня топлива с точностью 100 грамм и угол опережения зажигания. Работает это все уже около 2 лет никаких сбоев не замечал, если интересно могу выложить только во вторник.

буду рад увидеть схему и код..
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

edm2007 писал(а):Для снижения помех можно так же завести прерывание окончания преобразования АЦП, в котором забирать результат преобразования, в главном же цикле запускать измерение и уходить в спящий режим POWER ADCNOISE, например.

Можно еще и так:
Do
Start ADC
Idle
Stop ADC
.................
.................
.................
Loop
End
А результат забираем в прерывании, как и писал выше edm2007
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Да, вот еще: я тут давеча интересовался про управление часами 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 в вопросах и ответах

Сообщение kip96 »

И вопросы:
Как стабильность,(чуствительность к расположению кварца), у меня есть платка с такими часиками, так кварц стоит как обычный кондёр.
В протеусе файла нет?
И вообщем:
В чём отличие (преимущество) между Declare Sub и просто Gosub???
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Kotэ
Родился
Сообщения: 5
Зарегистрирован: Пт май 13, 2011 18:45:36

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

Сообщение Kotэ »

В сети нашел тaблэтку для басика, которая превращает беспатную демо версию
BАSCOM-АVR 2.0.5.0 в полнофункциональную, по крайней мере, снимает ограничение на 4 кило кода. :))
Особо не тестил, но вроде программы созданные в пролеченом басике нормально работают.
Лечится просто. Нужно скопировать лeкарство и папку с установленной демкой басика и запустить тaблетку и нажать на кнопку Uрdate. :kill:

http://ifolder.ru/23508666
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

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

Сообщение WildCat »

Вопрос о связке ds18b20 + bascom + proteus уже поднимался, но подниму еще раз.

Схема - стандартный 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. И так далее.
В чем может быть проблема? Неверные тайминги? Может, где задержку добавить надо?
AVRDaemon
Открыл глаза
Сообщения: 54
Зарегистрирован: Сб дек 06, 2008 13:48:59

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

Сообщение AVRDaemon »

Kotэ писал(а):В сети нашел тaблэтку для басика...

http://ifolder.ru/23508666


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

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

Сообщение edm2007 »

WildCat, поменяйте Time Slot на 30u. Проблем быть не должно, я уже давно так делаю. Если все тайминги по порядку то 30 - 120 - 480 - 30 - 750 - 10.

И еще, откуда Вы берете вот такое:

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

Shift B0 , Left , 5
Shift B1 , Left , 3


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

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

Сообщение edm2007 »

WildCat, вот например так можно... Я только одно не сделал, не внес поправку в отрицательную температуру, ну да это Вы легко сделаете. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

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