BASCOM AVR в вопросах и ответах
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
Ого вы мне тут расписали, прям целая книга. Большее спасибо.
Завтра попробую в протеусе посмотреть как пашет.
Скажите а нет никакой книги почитать про баском. А то только начинаю разбираться. Хотел на С попробовать, но там как то все усложнено
Кинул в протеус прошивку но сработки нет. Я так понял что если на ацп идет (примерно) больше 2.5в то ждем 2сек и запускаем таймер и подаем 1 на выход порта 1. Если не трудно гляньте в протеусе (кинул файл), а то у меня что т все на месте стоит (может я не так делаю)
Завтра попробую в протеусе посмотреть как пашет.
Скажите а нет никакой книги почитать про баском. А то только начинаю разбираться. Хотел на С попробовать, но там как то все усложнено
Кинул в протеус прошивку но сработки нет. Я так понял что если на ацп идет (примерно) больше 2.5в то ждем 2сек и запускаем таймер и подаем 1 на выход порта 1. Если не трудно гляньте в протеусе (кинул файл), а то у меня что т все на месте стоит (может я не так делаю)
- Вложения
-
- !23.zip
- (25.28 КБ) 153 скачивания
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Пмогите пожалуйста с оптимизацией кода.
Проект - стрелочный тахометр на аттини25.
Почему тинька 25? - потому что валяется без дела плата от фонарика фос3, а там как раз тинька, и детали так расположены что схомотехнику менять не придётся.
цель: берем импульсы датчика хола и выводим их на стрелку. В качестве указателя - стандартный тахометрный миллиамперметр, от honda cb400/
Раз тах стрелочный и тем более используется на мотоцикле то важна скорость работы.
Алгоритм: меряем время между импульсами и преобразуем его в значения шим.
Так как в attiny25 места мало, то код нужен как можно проще, а я такого неумею(
Вот собственно сама программа:
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize = 32
Config Timer1 = Timer , Prescale = 64 'таймер 1 для подсчета тиков для измерения времени между импульсами
Config Timer0 = Pwm , Compare B Pwm = Clear Down , Prescale = 64 'таймер 0 - шим
Config Portb.1 = Output 'выход шима
Config Pinb.2 = Input 'вход для импульсов
Dim A As Word
Dim Wtime As Single
Dim Timercounter As Byte
Dim Freq As Word
Dim Freq2 As Word
Dim S As Single
Dim N As Byte
Dim M As Word
On Int0 Stopbutton:
On Timer1 Pulse:
Enable Interrupts
Enable Int0
Enable Timer1
Stop Timer1
Timercounter = 0
Do
Freq2 = Freq 'рисваиваем Значение Freq Переменной Freq2 - количество тиков таймера между одним импульсом
If Freq2 < 400 Then ' Если Количество Тиков Таймера Мало(частота Входящих Импульсов Более 350 Гц)
Freq2 = 400 'То Больше Переменную Не Уменьшаем
End If
If Freq2 > 41500 Then 'если количество тиков велико(частота меньше 3 гц)
Freq2 = 41500 'то больше тики не увеличиваем
End If
Wtime = Freq2 * 8 'считаем время между импульсами в микросекундах(количество тиков умножаем на время одного тика)
S = 1000000 / Wtime 'Считаем частоту импульсов в герцах путём деления одной секунды на время между импульсами.
If S > 255 And Freq2 > 400 Then 'если частота выше 255гц и время между импульсами не слишком велико(частота ниже 350 гц)
S = 255 'то частоту оставляем 255 гц
Elseif Freq2 < 400 Then 'иначе если время между импульсами велико(частота более 350гц)
S = 3 'то частоту сбрасываем до 3х гц
End If
M = S 'присваиваем переменной частоту, для избавления от дробной части
N = Lookup(m , Calibrovka) 'в зависимости от частоты присваиваем переменной скважности шима калибровочную величину
Loop
Stopbutton: 'Программа Обработки Прерывания По Приходу Импульса
Stop Timer1 'Останавливаем Таймер0
Timercounter = Timer1 'присваеваем переменной таймерконтер количество тиков таймера.
Freq = Timercounter + A 'складываем кол-во тиков таймера и его переполнений и присваиваем это значение переменной freq -
'получаем количество тиков таймера между импульсами.
Timer1 = 0 'Обнуляем Таймер0
A = 0 'Обнуляем Количество Переполнений Таймера
Start Timer1 'Запускаем Таймер0
Gifr = 64
Pwm0b = N 'Присваиваем Шиму Нужную Скважность
Return
Pulse: 'Программа Обработки Прерывания Переполнения Таймера '
A = A + 255 'Считаем Количество Переполнений Таймера В Тиках
Return
End
Calibrovka:
Data 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 18 , 19 , 20 , 20 , 21 , 21 , 22 , 22 , 23 , 23 , 24 , 24 , 25 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33
Data 34 , 35 , 36 , 38 , 39 , 40 , 41 , 43 , 44 , 45 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80
Data 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120
Data 121 , 122 , 123 , 124 , 125 , 126 , 127 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 136 , 137 , 138 , 139 , 140 , 141 , 142 , 143 , 144 , 145 , 146 , 147 , 148 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 156 , 157 , 158 , 159 , 160
Data 161 , 162 , 163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 177 , 178 , 179 , 180 , 181 , 182 , 183 , 184 , 185 , 186 , 187 , 188 , 189 , 190 , 191 , 192 , 193 , 194 , 195 , 196 , 197 , 198 , 199 , 200
Data 201 , 202 , 203 , 304 , 205 , 206 , 207 , 208 , 209 , 210 , 211 , 212 , 213 , 214 , 215 , 216 , 217 , 218 , 219 , 220 , 221 , 222 , 223 , 224 , 225 , 226 , 227 , 228 , 229 , 230
Data 231 , 232 , 233 , 234 , 235 , 236 , 237 , 238 , 239 , 240 , 241 , 242 , 243 , 244 , 245 , 246 , 247 , 248 , 249 , 248 , 249 , 250 , 251 , 252 , 252 , 253 , 253 , 254 , 254 , 255
В протеусе вроде всё работает без нареканий, в железе еще не пробовал.
Так как угол поворота стрелки в отношении шима нелинейный, добавлены калибровочные данные DATA calibrovka
Проект - стрелочный тахометр на аттини25.
Почему тинька 25? - потому что валяется без дела плата от фонарика фос3, а там как раз тинька, и детали так расположены что схомотехнику менять не придётся.
цель: берем импульсы датчика хола и выводим их на стрелку. В качестве указателя - стандартный тахометрный миллиамперметр, от honda cb400/
Раз тах стрелочный и тем более используется на мотоцикле то важна скорость работы.
Алгоритм: меряем время между импульсами и преобразуем его в значения шим.
Так как в attiny25 места мало, то код нужен как можно проще, а я такого неумею(
Вот собственно сама программа:
Спойлер
$regfile = "attiny25.dat"$crystal = 8000000
$hwstack=40
$swstack=16
$framesize = 32
Config Timer1 = Timer , Prescale = 64 'таймер 1 для подсчета тиков для измерения времени между импульсами
Config Timer0 = Pwm , Compare B Pwm = Clear Down , Prescale = 64 'таймер 0 - шим
Config Portb.1 = Output 'выход шима
Config Pinb.2 = Input 'вход для импульсов
Dim A As Word
Dim Wtime As Single
Dim Timercounter As Byte
Dim Freq As Word
Dim Freq2 As Word
Dim S As Single
Dim N As Byte
Dim M As Word
On Int0 Stopbutton:
On Timer1 Pulse:
Enable Interrupts
Enable Int0
Enable Timer1
Stop Timer1
Timercounter = 0
Do
Freq2 = Freq 'рисваиваем Значение Freq Переменной Freq2 - количество тиков таймера между одним импульсом
If Freq2 < 400 Then ' Если Количество Тиков Таймера Мало(частота Входящих Импульсов Более 350 Гц)
Freq2 = 400 'То Больше Переменную Не Уменьшаем
End If
If Freq2 > 41500 Then 'если количество тиков велико(частота меньше 3 гц)
Freq2 = 41500 'то больше тики не увеличиваем
End If
Wtime = Freq2 * 8 'считаем время между импульсами в микросекундах(количество тиков умножаем на время одного тика)
S = 1000000 / Wtime 'Считаем частоту импульсов в герцах путём деления одной секунды на время между импульсами.
If S > 255 And Freq2 > 400 Then 'если частота выше 255гц и время между импульсами не слишком велико(частота ниже 350 гц)
S = 255 'то частоту оставляем 255 гц
Elseif Freq2 < 400 Then 'иначе если время между импульсами велико(частота более 350гц)
S = 3 'то частоту сбрасываем до 3х гц
End If
M = S 'присваиваем переменной частоту, для избавления от дробной части
N = Lookup(m , Calibrovka) 'в зависимости от частоты присваиваем переменной скважности шима калибровочную величину
Loop
Stopbutton: 'Программа Обработки Прерывания По Приходу Импульса
Stop Timer1 'Останавливаем Таймер0
Timercounter = Timer1 'присваеваем переменной таймерконтер количество тиков таймера.
Freq = Timercounter + A 'складываем кол-во тиков таймера и его переполнений и присваиваем это значение переменной freq -
'получаем количество тиков таймера между импульсами.
Timer1 = 0 'Обнуляем Таймер0
A = 0 'Обнуляем Количество Переполнений Таймера
Start Timer1 'Запускаем Таймер0
Gifr = 64
Pwm0b = N 'Присваиваем Шиму Нужную Скважность
Return
Pulse: 'Программа Обработки Прерывания Переполнения Таймера '
A = A + 255 'Считаем Количество Переполнений Таймера В Тиках
Return
End
Calibrovka:
Data 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 18 , 19 , 20 , 20 , 21 , 21 , 22 , 22 , 23 , 23 , 24 , 24 , 25 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33
Data 34 , 35 , 36 , 38 , 39 , 40 , 41 , 43 , 44 , 45 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80
Data 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120
Data 121 , 122 , 123 , 124 , 125 , 126 , 127 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 136 , 137 , 138 , 139 , 140 , 141 , 142 , 143 , 144 , 145 , 146 , 147 , 148 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 156 , 157 , 158 , 159 , 160
Data 161 , 162 , 163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 177 , 178 , 179 , 180 , 181 , 182 , 183 , 184 , 185 , 186 , 187 , 188 , 189 , 190 , 191 , 192 , 193 , 194 , 195 , 196 , 197 , 198 , 199 , 200
Data 201 , 202 , 203 , 304 , 205 , 206 , 207 , 208 , 209 , 210 , 211 , 212 , 213 , 214 , 215 , 216 , 217 , 218 , 219 , 220 , 221 , 222 , 223 , 224 , 225 , 226 , 227 , 228 , 229 , 230
Data 231 , 232 , 233 , 234 , 235 , 236 , 237 , 238 , 239 , 240 , 241 , 242 , 243 , 244 , 245 , 246 , 247 , 248 , 249 , 248 , 249 , 250 , 251 , 252 , 252 , 253 , 253 , 254 , 254 , 255
В протеусе вроде всё работает без нареканий, в железе еще не пробовал.
Так как угол поворота стрелки в отношении шима нелинейный, добавлены калибровочные данные DATA calibrovka
Re: BASCOM AVR в вопросах и ответах
To ev3658
Век живи, век учись
Я чевой-то не понял. Глаза протери.
Век живи, век учись
Я чевой-то не понял. Глаза протери.
- ev3658
- Слесарь-программист
- Сообщения: 341
- Зарегистрирован: Вт сен 11, 2012 23:08:28
- Откуда: город Кстово Нижегородская обл.
Re: BASCOM AVR в вопросах и ответах
koms48 писал(а):Я чевой-то не понял.
Да я про VAR в цикле, не знал, что так можно, думал занятое слово в операторе.
Re: BASCOM AVR в вопросах и ответах
imon220, твои метания не понятны. То мороженое, по пирожное, то "что-то не работает". Что не работает?? Выложь всё вместе, хотелки, исходник и протеус. Потом спрошай.
- Tankor
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Вт май 03, 2011 10:13:12
- Откуда: Россия, Татарстан
Re: BASCOM AVR в вопросах и ответах
Tankor писал(а):max50 писал(а):Так попробуйте:
Daysmonth = 31
Case 2 : Month_disp_str = "дeіpa»З" 'февраля
Daysmonth = _year And &H03 'проверяем на високосный год
If Daysmonth = 0 Then 'если год високосный (переменная Daysmonth = 0)
Daysmonth = 29 'то переменная Daysmonth = 29
Else 'иначе
Daysmonth = 28 'переменная Daysmonth = 28
End If
Благодарю за помощь. Потихоньку становится понятно работа этой микросхемой. По Вашему коду вопрос- а разве ds3231 не знает о количестве дней в месяце и о высокосном годе?
Сам задал вопрос и отвечу. Из даташита: The RTC maintains seconds, minutes, hours, day, date,
month, and year information. The date at the end of the
month is automatically adjusted for months with fewer
than 31 days, including corrections for leap year.
Поэтому программную коррекцию делать не нужно
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
koms48 писал(а):imon220, твои метания не понятны. То мороженое, по пирожное, то "что-то не работает". Что не работает?? Выложь всё вместе, хотелки, исходник и протеус. Потом спрошай.
ev3658 мне, можно сказать, написал исходник. Вот файлы протеуса, исходник bascom.
Сейчас вроде реле включается (когда темнеет), но почему-то не выкл по истечении заданного времени.
Должно- темнеет вкл реле (на опр время и выкл) и так каждый день.
- Вложения
-
- !23.zip
- (25.97 КБ) 169 скачиваний
Re: BASCOM AVR в вопросах и ответах
Как-то так. R1 - подстроечное 470 ком примерно.
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
Спасибо. Вроде все работает. Если не сложно можно ответить на немного вопросов по коду
L1 = Getadc(1) 1-это номер АЦП с которого мы считываем (ведь у нас Portb.2), не должно ли быть 2
If L1 >= 200 Then Если у нас с ацп больше 200или = (например больше 1.5в0 то тогда
Gosub Delay4 (что такое Gosub) - все отключаем и ждем 4 часа
'gosub Delay10 '+ 10 часов, чтобы окончательно рассвело, а то опять включится
Delay4: 'wait 4 hour немного обьяснить что к чему
Portb.1 = 1
For D = 1 To 144
Wait 100
Next D
Portb.1 = 0
Return
Код: Выделить всё
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 10
$swstack = 20
$framesize = 30
Config Portb.1 = Output
Config Portb.2 = Input
Portb.2 = 0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim L1 As Word
Dim D As Byte
Dim T As Byte
Start Adc
L1 = Getadc(1)
Do
L1 = Getadc(1)
If L1 >= 200 Then
Gosub Delay4
'gosub Delay10 '+ 10 часов, чтобы окончательно рассвело, а то опять включится
End If
Loop
End
Delay4: 'wait 4 hour
Portb.1 = 1
For D = 1 To 144
Wait 100
Next D
Portb.1 = 0
Return
Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
L1 = Getadc(1) 1-это номер АЦП с которого мы считываем (ведь у нас Portb.2), не должно ли быть 2
If L1 >= 200 Then Если у нас с ацп больше 200или = (например больше 1.5в0 то тогда
Gosub Delay4 (что такое Gosub) - все отключаем и ждем 4 часа
'gosub Delay10 '+ 10 часов, чтобы окончательно рассвело, а то опять включится
Delay4: 'wait 4 hour немного обьяснить что к чему
Portb.1 = 1
For D = 1 To 144
Wait 100
Next D
Portb.1 = 0
Return
Re: BASCOM AVR в вопросах и ответах
imon220 писал(а):L1 = Getadc(1) 1-это номер АЦП с которого мы считываем (ведь у нас Portb.2), не должно ли быть 2
Нет, не должно. Цифра 1 в параметре это не номер порта, а номер канала АЦП.
imon220 писал(а):что такое Gosub
Это команда вызова подпрограммы. В данном случае с именем Delay4.
imon220 писал(а):Delay4: 'wait 4 hour немного обьяснить что к чему
Portb.1 = 1
For D = 1 To 144
Wait 100
Next D
Portb.1 = 0
Return
Порт В.1 устанавливается в единицу. Потом запускается цикл. В цикле осуществляется задержка на 100 секунд. И так 144 раза. В результате получаем время выполнения цикла 100*144=14400 секунд. Или 240 минут (14400/60). Или 4 часа (240/60). Потом порт В.1 устанавливаем в "0".
Как видите, все просто.
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
Тоесть Gosub и далее у нас может идти любое имя
If L1 >= 200 Then если так, то тогда выполнить условие
Delay4: 'wait 4 hour
Portb.1 = 1
For D = 1 To 144 здесь у нас может идти от 1 и до 255
Wait 100
Next D после задержки мы переходим
Portb.1 = 0 на выключение
Return и возвращаемся???
Delay10: Как у нас запускается это ( когда у нас порт 0), мы должны выполнить эту функцию?
For D = 1 To 36 Здесь у нас может быть 1 до 111 'wait 10 hour
Wait 1000
Next D
Return возвращаемся к If L1 >= 200 Then (наесть началу )
Dim T As Byte это условие нам не нужно
If L1 >= 200 Then если так, то тогда выполнить условие
Delay4: 'wait 4 hour
Portb.1 = 1
For D = 1 To 144 здесь у нас может идти от 1 и до 255
Wait 100
Next D после задержки мы переходим
Portb.1 = 0 на выключение
Return и возвращаемся???
Delay10: Как у нас запускается это ( когда у нас порт 0), мы должны выполнить эту функцию?
For D = 1 To 36 Здесь у нас может быть 1 до 111 'wait 10 hour
Wait 1000
Next D
Return возвращаемся к If L1 >= 200 Then (наесть началу )
Dim T As Byte это условие нам не нужно
Re: BASCOM AVR в вопросах и ответах
1. Тоесть Gosub и далее у нас может идти любое имя
не любое, а определённое в программе, в данном случае такое. Если хочешь, можешь хреном_моржовым обозвать.
2. Да возвращаемся, погорели примерно 4 часа, и хватит.
3. Delay10: Как у нас запускается это ( когда у нас порт 0), мы должны выполнить эту функцию?
Наступило темно, свет зажегся, погорел 4 часа, смотрит, мля, темно и ишшо вкл на 4ч. Так что после отработки 4-х часов ждем 10 часов в отключении, по любому солнышко вылезет. Запускается просто, раскомментируй Delay10. Будет 4ч свету и 10ч тьмы до новых сумерек.
Кто сказал что частота 8000000? И не вздумай фуз DIV8 включать. Двое суток светить будет.
Хелп и даташит же под носом, азы детские спрашиваешь.
не любое, а определённое в программе, в данном случае такое. Если хочешь, можешь хреном_моржовым обозвать.
2. Да возвращаемся, погорели примерно 4 часа, и хватит.
3. Delay10: Как у нас запускается это ( когда у нас порт 0), мы должны выполнить эту функцию?
Наступило темно, свет зажегся, погорел 4 часа, смотрит, мля, темно и ишшо вкл на 4ч. Так что после отработки 4-х часов ждем 10 часов в отключении, по любому солнышко вылезет. Запускается просто, раскомментируй Delay10. Будет 4ч свету и 10ч тьмы до новых сумерек.
Кто сказал что частота 8000000? И не вздумай фуз DIV8 включать. Двое суток светить будет.
Хелп и даташит же под носом, азы детские спрашиваешь.

- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
Может быть и детские, но вот полгода назад я даже не знак как программатор к мк подключить, а тут уже такое.
Рисовал схему и подумал проверить все наверняка. Уменьшил время в прошивке и закинул в протеус.
Заметил что функция не выполняется. То есть время прошло, светодиод моргнул и все(опять время прошло,св-д моргнул). Как светлеет он гаснет. Тоесть почти все идеально работает, но получается по истечении 4часов свет будет гореть, пока не рассветает.
Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
А да если раскоментировать gosub delay10 то светодиод не загорается
ev3658- ваша прошивка тоже работает (там ацп номер поменять надо было), но тоже получается что по истечении 4ч он включается опять, попробовал просто поставить задержку, но тогда не вкл
Рисовал схему и подумал проверить все наверняка. Уменьшил время в прошивке и закинул в протеус.
Заметил что функция не выполняется. То есть время прошло, светодиод моргнул и все(опять время прошло,св-д моргнул). Как светлеет он гаснет. Тоесть почти все идеально работает, но получается по истечении 4часов свет будет гореть, пока не рассветает.
Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
А да если раскоментировать gosub delay10 то светодиод не загорается
ev3658- ваша прошивка тоже работает (там ацп номер поменять надо было), но тоже получается что по истечении 4ч он включается опять, попробовал просто поставить задержку, но тогда не вкл
Re: BASCOM AVR в вопросах и ответах
Откуда ж я знаю какое ты время поставил. Влепи временно вместо 4ч минуту, вместо 10ч 3 минуты и проверяй.
Должен на 1мин загореться и на 3 потухнуть.
Должен на 1мин загореться и на 3 потухнуть.
Re: BASCOM AVR в вопросах и ответах
imon220 писал(а):Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
Большие задержки в подпрограмме (Wait 1000-это 1000 секунд).Пока не истекут 1000 секунд,программа будет ждать и ничего не делать.Может лучше использовать таймер?
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
koms48 писал(а): Должен на 1мин загореться и на 3 потухнуть.
Блин сегодня откомпилировал, и поставил маленькое время как в прошлый раз и все работает.(я ставил 1мин раб 2нет) Не знаю, бывает протеус глючит, часть схемы удалишь и дорисуешь вроде заработает.
Может лучше использовать таймер?
Да я думаю нечего страшного (пусть стоит). Она будет работать на одно реле для света.
Re: BASCOM AVR в вопросах и ответах
imon220 писал(а): Да я думаю нечего страшного (пусть стоит). Она будет работать на одно реле для света.
Хозяин-барин
- imon220
- Потрогал лапой паяльник
- Сообщения: 326
- Зарегистрирован: Сб июл 27, 2013 03:46:14
- Откуда: Р Крым
Re: BASCOM AVR в вопросах и ответах
Ну это понятно. Я как бы только начинаю учить программирование, а людей не охота дергать постоянно( а сделайте мне так, нет лучше так).
Я погонял немного в протеусе, вроде все нормально. Мне больше всего главное чтоб откл, для этого и делал. А то включаю свет на заднем дворе, а выкл забываю.
Я погонял немного в протеусе, вроде все нормально. Мне больше всего главное чтоб откл, для этого и делал. А то включаю свет на заднем дворе, а выкл забываю.
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Друзья, помогите разобратся с проблемой.
Делаю стрелочный тахометр на аттини25. Управление стрелкой - аппаратный шим, механизм стрелки - тахометр от мотоцикла(в виде милиамперметра подобному шестерочному ТХ-193), импульсы берутся с датчика холла, импульсы подаются на вход прерывания INT0, по прерыванию замеряется время между импульсами, высчитывается частота и выводится в виде шим на стрелку.
Устройство вроде бы работает, но есть глюки которые никак не могу понять.
Основной глюк -частые прыжки стрелки почти до конца шкалы при малых оборотах, при нарастании оборотов прыжки становятся меньше, при оборотх чуть выше середины шкалы прыжки переходят в плавание стрелки. И самый прикол в том что эти прыжки и плавания стрелки не на всём диапазоне оборотов, а только на некоторых значениях: например на оборотах до 1000 прыжки частые, до 1500 реже, до 2000 вообще нету, около 2500 снова появляются, при 3000 опять пропадают и так далее.
Второй глюк - после приветствия(когда при включении устройства стрелка плавно доходит до конца шкалы и обратно) после включения прерываний стрелка опять же делает скачок до середины шкалы.
И третий глюк - когда вместо датчика на вход импульсов просто подать низкий уровень (землю) стрелка прыгает до упора и держится там полсекунды, хотя программно вообще не должна.
Код прилагаю ниже, и схему в протеусе.
Кстати в протеусе таких глюков нет.
И еще глюк с плаванием стрелки появлялся когда при отладке подключал ко входу тахометра генератор импульсов из атмеги8, и плавание было опять же при определенной частоте.
Делаю стрелочный тахометр на аттини25. Управление стрелкой - аппаратный шим, механизм стрелки - тахометр от мотоцикла(в виде милиамперметра подобному шестерочному ТХ-193), импульсы берутся с датчика холла, импульсы подаются на вход прерывания INT0, по прерыванию замеряется время между импульсами, высчитывается частота и выводится в виде шим на стрелку.
Устройство вроде бы работает, но есть глюки которые никак не могу понять.
Основной глюк -частые прыжки стрелки почти до конца шкалы при малых оборотах, при нарастании оборотов прыжки становятся меньше, при оборотх чуть выше середины шкалы прыжки переходят в плавание стрелки. И самый прикол в том что эти прыжки и плавания стрелки не на всём диапазоне оборотов, а только на некоторых значениях: например на оборотах до 1000 прыжки частые, до 1500 реже, до 2000 вообще нету, около 2500 снова появляются, при 3000 опять пропадают и так далее.
Второй глюк - после приветствия(когда при включении устройства стрелка плавно доходит до конца шкалы и обратно) после включения прерываний стрелка опять же делает скачок до середины шкалы.
И третий глюк - когда вместо датчика на вход импульсов просто подать низкий уровень (землю) стрелка прыгает до упора и держится там полсекунды, хотя программно вообще не должна.
Код прилагаю ниже, и схему в протеусе.
Кстати в протеусе таких глюков нет.
И еще глюк с плаванием стрелки появлялся когда при отладке подключал ко входу тахометра генератор импульсов из атмеги8, и плавание было опять же при определенной частоте.
-
Slawakuzmich
- Открыл глаза
- Сообщения: 50
- Зарегистрирован: Чт мар 10, 2011 20:29:23
- Откуда: Челяб. обл, Троицкий район
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Код: Выделить всё
$regfile = "attiny25.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize = 32
Config Timer1 = Timer , Prescale = 64 'таймер 1 для подсчета тиков для измерения времени между импульсами
Config Timer0 = Pwm , Compare B Pwm = Clear Down , Prescale = 64 'таймер 0 - шим
Config Portb.1 = Output 'выход шима
Config Pinb.2 = Input 'вход для импульсов
Config Int0 = Rising
Dim A As Word
Dim Wtime As Single
Dim Timercounter As Byte
Dim Freq As Word
Dim Freq2 As Word
Dim S As Single
Dim N As Byte
Dim M As Word
Disable Interrupts 'отключаем прерывания
Disable Int0
For M = 1 To 260
N = Lookup(m , Calibrovka) 'подпрограмма махания стрелкой до упора и обратно при включении прибора."приветствие"
Pwm0b = N
Waitms 3
Next M
For M = 260 To 1 Step -1
N = Lookup(m , Calibrovka)
Pwm0b = N
Waitms 3
Next M
Pwm0b = 0
On Int0 Stopbutton:
On Timer1 Pulse:
enable Interrupts
Enable Int0 ' включаем прерывания
Enable Timer1
Stop Timer1
Timercounter = 0
Freq = 41500
Do
If A > 41500 Then 'если количество переполнений таймера1 велико(частота входящих импульсов меньше 3гц)
Stop Timer1
Freq = 41500 'то останавливаем таймер, присваеваем пременной фрек время которое равно 3 гц.
Timer1 = 0 'обнуляем таймер и его переполнения.
A = 0
End If
Freq2 = Freq 'рисваиваем Значение Freq Переменной Freq2 - количество тиков таймера между одним импульсом
If Freq2 < 400 Then ' Если Количество Тиков Таймера Мало(частота Входящих Импульсов Более 350 Гц)
Freq2 = 41500 'то скидываем частоту на минимум
End If
If Freq2 > 41500 Then 'если количество тиков велико(частота меньше 3 гц)
Freq2 = 41500 'то больше тики не увеличиваем
End If
Wtime = Freq2 * 8 'считаем время между импульсами в микросекундах(количество тиков умножаем на время одного тика)
S = 1000000 / Wtime 'Считаем частоту импульсов в герцах путём деления одной секунды на время между импульсами.
If S > 283 Then S = 283 'если частота выше 255гц и время между импульсами не слишком велико(частота ниже 350 гц)
M = S 'присваиваем переменной частоту, для избавления от дробной части
N = Lookup(m , Calibrovka) 'в зависимости от частоты присваиваем переменной скважности шима калибровочную величину
Pwm0b = N
'присваиваем шиму нужную скважность
Loop
Stopbutton: 'Программа Обработки Прерывания По Приходу Импульса
Stop Timer1 'Останавливаем Таймер0
Timercounter = Timer1 'присваеваем переменной таймерконтер количество тиков таймера.
Freq = Timercounter + A 'складываем кол-во тиков таймера и его переполнений и присваиваем это значение переменной freq -
'получаем количество тиков таймера между импульсами.
Timer1 = 0 'Обнуляем Таймер0
A = 0 'Обнуляем Количество Переполнений Таймера
Start Timer1 'Запускаем Таймер0
Gifr = 64
Return
Pulse: 'Программа Обработки Прерывания Переполнения Таймера '
A = A + 255 'Считаем Количество Переполнений Таймера В Тиках
Return
End
Calibrovka:
Data 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 18 , 18 , 18 , 19 , 19 , 19 , 20 , 20 , 20 , 21 , 21 , 22 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34
Data 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 72 , 73
Data 74 , 75 , 76 , 77 , 77 , 78 , 78 , 79 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 108 , 109
Data 109 , 110 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120 , 121 , 122 , 123 , 124 , 126 , 127 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 135 , 136 , 137 , 138 , 139 , 140 , 141 , 142 , 142 , 143 , 144 , 145 , 146
Data 147 , 148 , 149 , 149 , 150 , 151 , 152 , 153 , 154 , 155 , 155 , 156 , 156 , 157 , 158 , 159 , 160 , 161 , 162 , 163 , 163 , 164 , 165 , 166 , 167 , 168 , 169 , 170 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 176 , 177 , 177 , 178 , 179
Data 180 , 181 , 182 , 182 , 183 , 183 , 184 , 185 , 186 , 187 , 188 , 188 , 189 , 189 , 190 , 191 , 192 , 193 , 194 , 195 , 195 , 196 , 196 , 197 , 198 , 199 , 200 , 201 , 201 , 202 , 202 , 203 , 204 , 205 , 205 , 206 , 206 , 207 , 207 , 208
Data 209 , 210 , 211 , 212 , 212 , 213 , 214 , 215 , 216 , 217 , 218 , 219 , 220 , 220 , 221 , 221 , 222 , 223 , 224 , 226 , 227 , 229 , 230 , 232 , 234 , 235 , 236 , 237 , 238 , 239 , 239 , 240 , 240 , 241 , 242 , 243 , 244 , 246 , 247 , 249
Data 250 , 251 , 252- Вложения
-
- ъ.rar
- (14.45 КБ) 181 скачивание