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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Stass48
Потрогал лапой паяльник
Сообщения: 329
Зарегистрирован: Пн фев 18, 2008 17:48:40

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

Сообщение Stass48 »

Здравствуйте!
Всех с наступающим)

Есть вопросик чисто теоретический (да бы потом не вылезли грабли на практике).

Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок. Известно, что во время срабатывания прерывания, весь код прерывается и начинает выполняться код, который прописан для прерывания. Также, известно, что невозможно выполнить два прерывания одновременно. Так вот вопрос то... Не нарушат ли мои прерывания от кнопок работу протокола i2c и, соответственно, не получу ли я зависание или сбой при работе с датчиком? Ведь я не знаю как это все работает... А вдруг у датчика таймаут есть какой при ожидании ответа от МК (а МК в это время не ответит т. к. занят прерыванием от кнопки), а когда ответит, то уже датчик не поймет что от него хочет МК. Или это все учтено и все будет работать?
Или же для такого обязательно нужно использовать аппаратную i2c (TWI) (ведь аппаратный i2c работает сам по себе и не зависит от программы на низком уровне).

P. S.: Вот например в Ардуино если использовать Analog Write(), говорят, что занят какой-то таймер... То есть, этот таймер уже никак нельзя использовать. А что по i2c в Баскоме?

Спасибо.
The only one thing necessary for the triumph of evil ...is for good people to do nothing.
aleksandr-zh
Сверлит текстолит когтями
Сообщения: 1278
Зарегистрирован: Пн июн 18, 2007 21:51:20

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

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

[uquote="Stass48",url="/forum/viewtopic.php?p=4028784#p4028784"]Здравствуйте!
Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок.[/uquote]

если протокол подразумевает жесткие временные интервалы, то нарушит.

1. если решать "в лоб", то запрещать прерывание в момент обмена (на всё время),
2. убрать кнопки с прерываний, разницы в сотую долю секунды не заметно,
3. аппаратный I2C в АВР (да и не только в оном) кривой и не имеет никакого особого смысла. Делайте программный, особой разницы ни в скорости, ни в простоте кода не будет.
Аватара пользователя
константин_KoSS_89
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Пн дек 29, 2008 01:40:28
Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)

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

Сообщение константин_KoSS_89 »

Здравствуйте, написал программу под камень ATmega328, программа имеет два прерывания по таймерам и сторожевой пёс", общение с внешними устр.ми по протоколам I2C и 1Wire.
Было замечено, что устройство перезагружается (зависает и "пёс" его ресетит). Эти перезагрузки проявляются спонтанно. может раз в неделю, может несколько раз в день. время и дату и кол.во раз я посчитываю.
Вопрос. Как найти место зависания? На устройстве есть UART, может можно метку какую сохранять... Кто имел дело с похожей ситуацией, как решали проблему.
Как вариант отключить watchdog и посмотреть где повиснет...
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Приветствую.

А watchdog на сколько настроен? Не факт ведь, что программа без него виснет, ей всего лишь достаточно где-то задержаться дольше чем положено. Отключите для начала пса конечно, и посмотрите, как устройство себя поведет. И если действительно будут зависания то хоть станет понятнее, в какие моменты они происходят. А так watchdog затирает все улики...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
константин_KoSS_89
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Пн дек 29, 2008 01:40:28
Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)

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

Сообщение константин_KoSS_89 »

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

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

Сообщение edm2007 »

Ну 4 секунды это конечно уже много. Похоже и правда виснет, вряд ли выполнение где-то шляется такое время...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Секретный кот
Поставщик валерьянки для Кота
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки
Контактная информация:

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

Сообщение Секретный кот »

Кстати, о watchdog. Обнаружил, что некоторые устройства с ним всё равно ухитряются намертво зависнуть. В упор не понимаю причины. Такое ощущение, что в них останавливается внутренний тактовый генератор (а такое вообще может быть??).
Также наблюдаются "отвалы" последовательного порта. Когда МК работает, реагирует на остальные прерывания, но перестаёт что-либо принимать или передавать на UART. Правда там ещё драйвер 485 порта висит, может быть это его фокусы.
Даже остановленные часы два раза в сутки показывают правильное время.
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

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

Сообщение Igor_67 »

Всем доброго дня. Пытаюсь запустить прогу, найденную когда-то давно в сети. Управление LCD-индикатором на двух драйверах КР1820ВГ1. С этим кодом отображаются только нули и точка: "000000.00". Хотя это по сути частотомер. Но никакую частоту он не меряет. Что в коде исправить, чтобы измерял частоту?
Спойлер$regfile = "m8535.dat"
$crystal = 11059200
$hwstack = 32
$swstack = 32
$framesize = 40
$baud = 38400

$lib "mcsbyte.lbx"
$lib "mcsbyteint.lbx"

Config Portb = Output

Signal Alias Pind.6
Kn Alias Pind.2
Knr Alias Pind.3
Dn Alias Portb.5
Cl Alias Portb.4
Csml Alias Portb.3
Csst Alias Portb.2

'
Dim I As Byte
Dim Cifri(9) As Byte
Dim A As Word
Dim Overflow As Byte
Dim X As Byte
Dim Cnt As Word
Dim Fr As Long
Dim Flag As Bit
Dim Ph As Word
Dim Pl As Word
Config Timer0 = Timer , Prescale = 1
Enable Interrupts
Enable Timer0

'**********************
Fmetr:
Cifri(1) = 13
Gosub Indicator
Stop Timer1
Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1
On Timer0 Tm0_intsub
On Timer1 Tm1_intsub
Counter1 = 0
Overflow = 0
Cnt = 31250
Flag = 0

'******Initial******
Start Timer0
Start Counter1

'*******Main Loop*****
Main:
Do

If Flag = 1 Then
X = Counter1
Gosub Indicator
Reset Flag
Counter1 = 0
Overflow = 0
Cnt = 31250
Start Timer0
Start Counter1
End If
Debounce Kn , 0 , Pmetr
Loop

Pmetr:
Stop Counter1
Cifri(1) = 12

Config Timer1 = Timer , Prescale = 8
Enable Timer1

Aa:
Do
Gosub Indicator
Stop Timer1
Timer1 = 0
Bitwait Signal , Set
Start Timer1
Bitwait Signal , Reset
Stop Timer1
Ph = Timer1
Timer1 = 2
Start Timer1
Bitwait Signal , Set
Stop Timer1
Pl = Timer1
If Kn = 1 Then Gosub Fmetr
Debounce Knr , 0 , Reg , Sub
Select Case A
Case 1
Cifri(2) = 14
X = Ph
Case 2
Cifri(2) = 15
X = Pl
Case 3
Cifri(2) = 16
Fr = Ph + Pl
If Ph > 100 Then
X = Ph \ 100
Fr = Fr * Ph
Else
Fr = Fr * Ph
Fr = Fr \ 100
End If
End Select

Loop

'************************************************
'*******Counter1 Overflow Interrupt**************
Tm1_intsub:
Incr Overflow
Return

'***********Timer0 Zero Interrupt****************
Tm0_intsub:
If Cnt <> 0 Then
Decr Cnt
Else
Stop Counter1
Stop Timer0
Set Flag
End If

Return

'************End of interrupt*********************
Indicator:
Fr = Overflow * 65536
Fr = Fr + X
I = 0
While I < 7
Incr I
Cifri(i) = Fr Mod 10
Fr = Fr / 10
Wend
'Set Csst
'Set Csml
Reset Csst
Reset Csml
I = Lookup(cifri(1) , Dta)
Gosub Ind
I = Lookup( , Dta)
Gosub Ind
I = Lookup(cifri(3) , Dta)
Gosub Ind
I = Lookup(cifri(4) , Dta)
Gosub Ind
I = Lookup(10 , Dta)
Gosub Ind
'Reset Csst
'Reset Csml
'Set Csst
Set Csst
Set Csml
Reset Csst
I = Lookup(cifri(5) , Dta)
Gosub Ind
I = Lookup(cifri(6) , Dta)
I = I - &H80
Gosub Ind
I = Lookup(cifri(7) , Dta)
Gosub Ind
I = Lookup(cifri(8) , Dta)
Gosub Ind
I = Lookup(11 , Dta)
I = I + Cifri(9)
Gosub Ind
'Reset Csst
Set Csst
Return

Dta:
Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HF0 , &HFF , &H8C , &H8E , &H89 , &HC7 , &H94
' 0 1 2 3 4 5 6 7 8 9 Cs_ml Cs_st P F 14 H 15 L o

Ind:
I = Not I
Shiftout Dn , Cl , I , 1
Return

Reg:
Incr A
If A > 3 Then A = 1
Return
Даташит по КР1820ВГ1 искурил весь напрочь, но что то не особо помогло.

Добавлено after 12 minutes 18 seconds:
Уточнение по теме: индикатор от кассового аппарата "ЭКР-2102". На плате индикатора еще был впаян инвертор К561ЛН2. Я его выпаял и закоротил перемычками входы и выходы бывших инверторов на плате. То есть теперь сигнал получился прямой. Для этого в коде добавлена инверсия: I = Not I в подпрограмме передачи данных в КР1820ВГ1.
Есть подозрение, что надо бы прерывание TIMER1 переделать на захват по входу ICP1. Или как то по-другому можно? Например вход T1 использовать? Как тогда сконфигурировать таймеры?
Может быть вот так сделать?
СпойлерConfig Timer1 = Timer , Prescale = 64 , Capture Edge = Rising

Dim Tmrcnt As Word
Dim Period As Single
Dim F1 As Single
Dim F As Word

Const T = 5.88e-6

On Capture1 Freqin

Tmrcnt = 0
Waitms 50
Enable Interrupts
Enable Capture1
. . .
. . .
Do
If Tmrcnt = 0 Then
F = 0
Else
Period = Tmrcnt * T
F1 = 1 / Period
F = Abs(f1)
End If
'

' тут будет вызов подпрограммы вывода на индикацию
Loop

Freqin:
Tmrcnt = Timer1
Timer1 = 0
Return

End
Вот теперь бы надо как то эти два куска кода подружить между собой :shock:
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
selco
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пн июл 25, 2011 14:24:34

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

Сообщение selco »

Всем доброго времени суток. Кто-нибудь имел дело с Китайским модулем MP3-TF-16P. Хочу сделать манок на птицу на Atmega8 и Oled дисплее. Мне-бы хоть пример какой нибудь, пытался с даташита отсылать команды не какой реакции.ПОМОГИТЕ!!!
Аватара пользователя
andrusha152
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс май 15, 2016 19:02:01
Откуда: Украина

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

Сообщение andrusha152 »

Это тот же DFPlayer_mini. Здесь есть примеры. https://bascomavr.3bb.ru/viewtopic.php?id=2213
Аватара пользователя
selco
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пн июл 25, 2011 14:24:34

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

Сообщение selco »

Спасибо. Но там на МК я не нашёл только терминал.
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

Ковырял когда то,пример-
циклическое воспроизведение:

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

Printbin &H7E; &HFF; &H06;&H11; &H00; &H00; &H01; &HEF
Основные комманды-

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

0x01 Следующая песня.
0x02 Последняя песня.
0x03 Указать дорожку(NUM) 0-2999
0x04 Громкость+
0x05 Громкость-
0x06 Укажите громкость 0-30
0x07 Обозначение EQ(0/1/2/3/4/5) Normal/Pop/Rock/Jazz/Classic/Base
0x08 Укажите режим воспроизведения (0/1/2/3) Петли / папки петли/одиночные петли/случайные
0x09 Обозначение оборудования (0/1/2/3/4) U/TF/AUX/SLEEP/FLASH
0x0A В сон -- потребление низкой мощности
0x0B Нормальная работа
0x0C Сброс микросхемы
0x0D Играть
0x0E Пауза.
0x0F Задает воспроизведение папки 1-10(требуется настройка)
0x10 Настройки PA {DH=1:Open PA}{DL: установка усиления, 0-31}
0x11 Воспроизведение петли {1: loop}{0: остановить loop}
Еще переводил даташит на русский,но там многое переведено криво
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

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

Сообщение vanyap1 »

Здравствуйте, искал на просторах интернета готовые библиотеки для дисплея на контроллере GC9A01. Не нашел. Переделал найденную для SSD1351.
Решил поделиться, берите кому надо.
Использован аппаратный SPI, подключение следующее -
DIN - MOSI контроллера
CLK - CLK контроллера
CS - Portb.0 (можно менять на любой другой)
DC- Portl.0 (можно менять на любой другой)
RST - Portl.1 (можно менять на любой другой)

Изображение Изображение Изображение

Цель - использование круглых дисплеев, очень они красиво показывают.

Такие тоже будут работать -
Изображение
Вложения
GC9A01.7z
(163.49 КБ) 445 скачиваний
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

Удалил,разобрался сам
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Всем привет. Хочу снова поднять одну тему, которой я занимался

года два назад. Суть проблемы. Есть аппарат, каретка приводится

в движение мотором и ходит поочередно влево-вправо. В конце

движения - концевики на замыкание.Каретка идет влево, концевик

выключает мотор. Через 30 сек таймер запускает мотор, каретка

идет вправо, правый концевик его выключает. И так по кругу.

Проблема в том, что в момент включения мотора концевик

находится в разомкнутом положении. Никак не могу это победить.

Привожу основной цикл кода. Может, кто посмотрит свежим

взглядом.

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

Do

If V = 30 Then                                              'таймер отсчитал заданное время
   If L_end = 0 Then                                        'сработал левый концевик
      If R_end = 1 Then                                     'правый концевик разомкнут
         Set Rele                                           'реле включило мотор
         Set Red                                            'загорелся светодиод
      End If
   End If

   If R_end = 0 Then                                        'сработал правый концевик
      If L_end = 1 Then                                     ' левый концевик разомкнут
         Set Rele                                           'реле включило мотор
         Set Red                                            'загорелся светодиод
      End If
   End If

   If L_end = 1 Then                                        'каретка - в промежуточном положении
      If R_end = 1 Then
          Set Rele
          Set Red
      End If
   End If
   V = 0
End If

If L_end = 0 Then                                           'сработал левый концевик
   Reset Rele                                               'выключение мотора и диода
   Reset Red
End If

If R_end = 0 Then                                           'сработал правый концевик
   Reset Rele                                               'выключение мотора и диода
   Reset Red
End If

Loop

Timecount:                                                  'счетчик времени таймера
Incr V
Return
Аватара пользователя
GoldenAndy
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA
Контактная информация:

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

Сообщение GoldenAndy »

так разные ж концевики....
Режим 1. Ждем таймер.
Режим 2. Начинаем движение вправо, левый концевик игнорируем, мониторим состояние только правого концевика. Крутим, пока правый разомкнут.
Режим 3. Ждем таймер.
Режим 4. Начинаем движение влево, правый концевик игнорируем, мониторим состояние только левого концевика. Крутим, пока левый разомкнут.
Идем в режим 1.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Аватара пользователя
АлександрЛ
Друг Кота
Сообщения: 43783
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

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

Сообщение АлександрЛ »

rojnov писал(а):Суть проблемы. Есть аппарат, каретка приводится

в движение мотором и ходит поочередно влево-вправо. В конце

движения - концевики на замыкание.Каретка идет влево, концевик

выключает мотор. Через 30 сек таймер запускает мотор, каретка

идет вправо, правый концевик его выключает. И так по кругу.
:facepalm:
Ваша проблема решается без всяких МК одной релюшкой на переключение, двумями :))) концевиками на размыкание и 555 таймером.. :dont_know:

зы.. Вроде как можно использовать прерывания - есть некоторые "настройки" - прерывание по перепаду из 0 в 1 или наоборот- перепад из 1 в 0.. :dont_know:
Тогда, если у вас с концевика идёт 0 или 1- программа на это не реагирует.
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Ваша проблема решается без всяких МК одной релюшкой на переключение, двумями :))) концевиками на размыкание и 555 таймером.. :dont_know:
Идея интересная. Хотелось бы увидеть схему.

Добавлено after 35 minutes 18 seconds:
Переделал я немного код, убрал все лишнее. В принципе у меня

теперь так и есть - запуск мотора после проверки разомкнутости

концевика. Но все равно при замкнутом концевике мотор не хочет

запускаться. Инж
дикаторный светик коротко моргнет и тухнет. И все. Никак не

могу понять, чего ему не хватает.

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

Do

If V = 30 Then                                              'таймер отсчитал заданное время
   If R_end = 1 Then                                        'правый концевик разомкнут
         Set Rele                                           'реле включило мотор
         Set Red                                            'загорелся светодиод
   End If

   If L_end = 1 Then                                        ' левый концевик разомкнут
         Set Rele                                           'реле включило мотор
         Set Red                                            'загорелся светодиод
   End If

   If L_end = 1 Then                                        'каретка - в промежуточном положении
      If R_end = 1 Then
          Set Rele
          Set Red
      End If
   End If
   V = 0
End If

If L_end = 0 Then                                           'сработал левый концевик
   Reset Rele                                               'выключение мотора и диода
   Reset Red
End If

If R_end = 0 Then                                           'сработал правый концевик
   Reset Rele                                               'выключение мотора и диода
   Reset Red
End If

Loop

Timecount:                                                  'счетчик времени таймера
Incr V
Return
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

Сообщение Novice user »

А так?
для примера взял аттини2313,добавил зеленый светодиод для отладки

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

$Regfile="attiny2313a.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32
L_end alias pinb.0:config PORTB.0=input:portb.0=1
R_end alias pinb.1:config PORTB.1=input:portb.1=1
Rele alias portb.2:config PORTB.2=output
Red alias portb.3:config PORTB.3=output
green alias portb.4:config PORTB.4=output  'светодиод,пока идет отсчет времени горит,по истечении 30 сек гаснет-для отладки
' настраиваем таймер
Config Timer1 = Timer , Prescale = 64
On Timer1 Timecount
timer1=3036
Enable Timer1
Enable Interrupts
dim v as byte


Do
 'обнуляем время,выключаем реле и светодиод
   v=0
   Reset Rele                                               'выключение мотора и диода
   Reset Red
   set green
'ждем когда истечет время
   while v<30
   wend

'время истекло
   reset green                                        'выключаем светодиод зеленый
   Set Rele                                           'реле включило мотор
   Set Red                                            'загорелся светодиод
'ждем замыкания концевиков
   while R_end = 1 and L_end=1
   wend

Loop
Timecount:                                                  'счетчик времени таймера
timer1=3036
Incr V
Return
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Добрый вечер. Попробовал я на макетке предложенный мне

последний вариант. Проблема осталась - реле не хочет

включаться, пока замкнут концевик. А по условиям концевик

замкнут все время до включения реле таймером. Так что вопрос

остается открытым. Жду, может еще кто-нибудь подскажет умную

мысль.
Ответить

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