BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
Здравствуйте!
Всех с наступающим)
Есть вопросик чисто теоретический (да бы потом не вылезли грабли на практике).
Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок. Известно, что во время срабатывания прерывания, весь код прерывается и начинает выполняться код, который прописан для прерывания. Также, известно, что невозможно выполнить два прерывания одновременно. Так вот вопрос то... Не нарушат ли мои прерывания от кнопок работу протокола i2c и, соответственно, не получу ли я зависание или сбой при работе с датчиком? Ведь я не знаю как это все работает... А вдруг у датчика таймаут есть какой при ожидании ответа от МК (а МК в это время не ответит т. к. занят прерыванием от кнопки), а когда ответит, то уже датчик не поймет что от него хочет МК. Или это все учтено и все будет работать?
Или же для такого обязательно нужно использовать аппаратную i2c (TWI) (ведь аппаратный i2c работает сам по себе и не зависит от программы на низком уровне).
P. S.: Вот например в Ардуино если использовать Analog Write(), говорят, что занят какой-то таймер... То есть, этот таймер уже никак нельзя использовать. А что по i2c в Баскоме?
Спасибо.
Всех с наступающим)
Есть вопросик чисто теоретический (да бы потом не вылезли грабли на практике).
Хочу использовать 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 в вопросах и ответах
[uquote="Stass48",url="/forum/viewtopic.php?p=4028784#p4028784"]Здравствуйте!
Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок.[/uquote]
если протокол подразумевает жесткие временные интервалы, то нарушит.
1. если решать "в лоб", то запрещать прерывание в момент обмена (на всё время),
2. убрать кнопки с прерываний, разницы в сотую долю секунды не заметно,
3. аппаратный I2C в АВР (да и не только в оном) кривой и не имеет никакого особого смысла. Делайте программный, особой разницы ни в скорости, ни в простоте кода не будет.
Хочу использовать i2c для работы с датчиком температуры. Но также, хочу использовать прерывания int0, int1 для кнопок.[/uquote]
если протокол подразумевает жесткие временные интервалы, то нарушит.
1. если решать "в лоб", то запрещать прерывание в момент обмена (на всё время),
2. убрать кнопки с прерываний, разницы в сотую долю секунды не заметно,
3. аппаратный I2C в АВР (да и не только в оном) кривой и не имеет никакого особого смысла. Делайте программный, особой разницы ни в скорости, ни в простоте кода не будет.
- константин_KoSS_89
- Вымогатель припоя
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
Re: BASCOM AVR в вопросах и ответах
Здравствуйте, написал программу под камень ATmega328, программа имеет два прерывания по таймерам и сторожевой пёс", общение с внешними устр.ми по протоколам I2C и 1Wire.
Было замечено, что устройство перезагружается (зависает и "пёс" его ресетит). Эти перезагрузки проявляются спонтанно. может раз в неделю, может несколько раз в день. время и дату и кол.во раз я посчитываю.
Вопрос. Как найти место зависания? На устройстве есть UART, может можно метку какую сохранять... Кто имел дело с похожей ситуацией, как решали проблему.
Как вариант отключить watchdog и посмотреть где повиснет...
Было замечено, что устройство перезагружается (зависает и "пёс" его ресетит). Эти перезагрузки проявляются спонтанно. может раз в неделю, может несколько раз в день. время и дату и кол.во раз я посчитываю.
Вопрос. Как найти место зависания? На устройстве есть UART, может можно метку какую сохранять... Кто имел дело с похожей ситуацией, как решали проблему.
Как вариант отключить watchdog и посмотреть где повиснет...
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Приветствую.
А watchdog на сколько настроен? Не факт ведь, что программа без него виснет, ей всего лишь достаточно где-то задержаться дольше чем положено. Отключите для начала пса конечно, и посмотрите, как устройство себя поведет. И если действительно будут зависания то хоть станет понятнее, в какие моменты они происходят. А так watchdog затирает все улики...
А watchdog на сколько настроен? Не факт ведь, что программа без него виснет, ей всего лишь достаточно где-то задержаться дольше чем положено. Отключите для начала пса конечно, и посмотрите, как устройство себя поведет. И если действительно будут зависания то хоть станет понятнее, в какие моменты они происходят. А так watchdog затирает все улики...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- константин_KoSS_89
- Вымогатель припоя
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
Re: BASCOM AVR в вопросах и ответах
watchdog настроен на 4 сек. Проверю, отключу... Спасибо
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Ну 4 секунды это конечно уже много. Похоже и правда виснет, вряд ли выполнение где-то шляется такое время...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Секретный кот
- Поставщик валерьянки для Кота
- Сообщения: 2106
- Зарегистрирован: Ср сен 17, 2008 14:32:15
- Откуда: Старые Васюки
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Кстати, о watchdog. Обнаружил, что некоторые устройства с ним всё равно ухитряются намертво зависнуть. В упор не понимаю причины. Такое ощущение, что в них останавливается внутренний тактовый генератор (а такое вообще может быть??).
Также наблюдаются "отвалы" последовательного порта. Когда МК работает, реагирует на остальные прерывания, но перестаёт что-либо принимать или передавать на UART. Правда там ещё драйвер 485 порта висит, может быть это его фокусы.
Также наблюдаются "отвалы" последовательного порта. Когда МК работает, реагирует на остальные прерывания, но перестаёт что-либо принимать или передавать на UART. Правда там ещё драйвер 485 порта висит, может быть это его фокусы.
Даже остановленные часы два раза в сутки показывают правильное время.
Re: BASCOM AVR в вопросах и ответах
Всем доброго дня. Пытаюсь запустить прогу, найденную когда-то давно в сети. Управление LCD-индикатором на двух драйверах КР1820ВГ1. С этим кодом отображаются только нули и точка: "000000.00". Хотя это по сути частотомер. Но никакую частоту он не меряет. Что в коде исправить, чтобы измерял частоту?
$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 использовать? Как тогда сконфигурировать таймеры?
Может быть вот так сделать?
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
Вот теперь бы надо как то эти два куска кода подружить между собой 
Спойлер
$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
Добавлено after 12 minutes 18 seconds:
Уточнение по теме: индикатор от кассового аппарата "ЭКР-2102". На плате индикатора еще был впаян инвертор К561ЛН2. Я его выпаял и закоротил перемычками входы и выходы бывших инверторов на плате. То есть теперь сигнал получился прямой. Для этого в коде добавлена инверсия: I = Not I в подпрограмме передачи данных в КР1820ВГ1.
Есть подозрение, что надо бы прерывание TIMER1 переделать на захват по входу ICP1. Или как то по-другому можно? Например вход T1 использовать? Как тогда сконфигурировать таймеры?
Может быть вот так сделать?
Спойлер
Config Timer1 = Timer , Prescale = 64 , Capture Edge = RisingDim 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
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
Всем доброго времени суток. Кто-нибудь имел дело с Китайским модулем MP3-TF-16P. Хочу сделать манок на птицу на Atmega8 и Oled дисплее. Мне-бы хоть пример какой нибудь, пытался с даташита отсылать команды не какой реакции.ПОМОГИТЕ!!!
- andrusha152
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Вс май 15, 2016 19:02:01
- Откуда: Украина
Re: BASCOM AVR в вопросах и ответах
Это тот же DFPlayer_mini. Здесь есть примеры. https://bascomavr.3bb.ru/viewtopic.php?id=2213
Re: BASCOM AVR в вопросах и ответах
Спасибо. Но там на МК я не нашёл только терминал.
-
Novice user
- Мудрый кот
- Сообщения: 1704
- Зарегистрирован: Вт янв 05, 2016 10:14:25
- Откуда: поселок Мелеуз
Re: BASCOM AVR в вопросах и ответах
Ковырял когда то,пример-
циклическое воспроизведение:
Основные комманды-
Еще переводил даташит на русский,но там многое переведено криво
циклическое воспроизведение:
Код: Выделить всё
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 в вопросах и ответах
Здравствуйте, искал на просторах интернета готовые библиотеки для дисплея на контроллере GC9A01. Не нашел. Переделал найденную для SSD1351.
Решил поделиться, берите кому надо.
Использован аппаратный SPI, подключение следующее -
DIN - MOSI контроллера
CLK - CLK контроллера
CS - Portb.0 (можно менять на любой другой)
DC- Portl.0 (можно менять на любой другой)
RST - Portl.1 (можно менять на любой другой)

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

Решил поделиться, берите кому надо.
Использован аппаратный 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 в вопросах и ответах
Удалил,разобрался сам
-
rojnov
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Вс мар 27, 2011 07:48:48
- Откуда: г. Екатеринбург
Re: BASCOM AVR в вопросах и ответах
Всем привет. Хочу снова поднять одну тему, которой я занимался
года два назад. Суть проблемы. Есть аппарат, каретка приводится
в движение мотором и ходит поочередно влево-вправо. В конце
движения - концевики на замыкание.Каретка идет влево, концевик
выключает мотор. Через 30 сек таймер запускает мотор, каретка
идет вправо, правый концевик его выключает. И так по кругу.
Проблема в том, что в момент включения мотора концевик
находится в разомкнутом положении. Никак не могу это победить.
Привожу основной цикл кода. Может, кто посмотрит свежим
взглядом.
года два назад. Суть проблемы. Есть аппарат, каретка приводится
в движение мотором и ходит поочередно влево-вправо. В конце
движения - концевики на замыкание.Каретка идет влево, концевик
выключает мотор. Через 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 в вопросах и ответах
так разные ж концевики....
Режим 1. Ждем таймер.
Режим 2. Начинаем движение вправо, левый концевик игнорируем, мониторим состояние только правого концевика. Крутим, пока правый разомкнут.
Режим 3. Ждем таймер.
Режим 4. Начинаем движение влево, правый концевик игнорируем, мониторим состояние только левого концевика. Крутим, пока левый разомкнут.
Идем в режим 1.
Режим 1. Ждем таймер.
Режим 2. Начинаем движение вправо, левый концевик игнорируем, мониторим состояние только правого концевика. Крутим, пока правый разомкнут.
Режим 3. Ждем таймер.
Режим 4. Начинаем движение влево, правый концевик игнорируем, мониторим состояние только левого концевика. Крутим, пока левый разомкнут.
Идем в режим 1.
- АлександрЛ
- Друг Кота
- Сообщения: 43785
- Зарегистрирован: Пн ноя 30, 2009 03:00:01
- Откуда: Нерезиновая
Re: BASCOM AVR в вопросах и ответах
rojnov писал(а):Суть проблемы. Есть аппарат, каретка приводится
в движение мотором и ходит поочередно влево-вправо. В конце
движения - концевики на замыкание.Каретка идет влево, концевик
выключает мотор. Через 30 сек таймер запускает мотор, каретка
идет вправо, правый концевик его выключает. И так по кругу.
Ваша проблема решается без всяких МК одной релюшкой на переключение, двумями
зы.. Вроде как можно использовать прерывания - есть некоторые "настройки" - прерывание по перепаду из 0 в 1 или наоборот- перепад из 1 в 0..
Тогда, если у вас с концевика идёт 0 или 1- программа на это не реагирует.
-
rojnov
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Вс мар 27, 2011 07:48:48
- Откуда: г. Екатеринбург
Re: BASCOM AVR в вопросах и ответах
Идея интересная. Хотелось бы увидеть схему.Ваша проблема решается без всяких МК одной релюшкой на переключение, двумямиконцевиками на размыкание и 555 таймером..
![]()
Добавлено 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 в вопросах и ответах
А так?
для примера взял аттини2313,добавил зеленый светодиод для отладки
для примера взял аттини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 в вопросах и ответах
Добрый вечер. Попробовал я на макетке предложенный мне
последний вариант. Проблема осталась - реле не хочет
включаться, пока замкнут концевик. А по условиям концевик
замкнут все время до включения реле таймером. Так что вопрос
остается открытым. Жду, может еще кто-нибудь подскажет умную
мысль.
последний вариант. Проблема осталась - реле не хочет
включаться, пока замкнут концевик. А по условиям концевик
замкнут все время до включения реле таймером. Так что вопрос
остается открытым. Жду, может еще кто-нибудь подскажет умную
мысль.


