Ого вы мне тут расписали, прям целая книга. Большее спасибо.
Завтра попробую в протеусе посмотреть как пашет.
Скажите а нет никакой книги почитать про баском. А то только начинаю разбираться. Хотел на С попробовать, но там как то все усложнено
Кинул в протеус прошивку но сработки нет. Я так понял что если на ацп идет (примерно) больше 2.5в то ждем 2сек и запускаем таймер и подаем 1 на выход порта 1. Если не трудно гляньте в протеусе (кинул файл), а то у меня что т все на месте стоит (может я не так делаю)
Пмогите пожалуйста с оптимизацией кода.
Проект - стрелочный тахометр на аттини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
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
imon220, твои метания не понятны. То мороженое, по пирожное, то "что-то не работает". Что не работает?? Выложь всё вместе, хотелки, исходник и протеус. Потом спрошай.
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.
Поэтому программную коррекцию делать не нужно
koms48 писал(а):imon220, твои метания не понятны. То мороженое, по пирожное, то "что-то не работает". Что не работает?? Выложь всё вместе, хотелки, исходник и протеус. Потом спрошай.
ev3658 мне, можно сказать, написал исходник. Вот файлы протеуса, исходник bascom.
Сейчас вроде реле включается (когда темнеет), но почему-то не выкл по истечении заданного времени.
Должно- темнеет вкл реле (на опр время и выкл) и так каждый день.
$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
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".
Как видите, все просто.
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 (наесть началу )
1. Тоесть Gosub и далее у нас может идти любое имя
не любое, а определённое в программе, в данном случае такое. Если хочешь, можешь хреном_моржовым обозвать.
2. Да возвращаемся, погорели примерно 4 часа, и хватит.
3. Delay10: Как у нас запускается это ( когда у нас порт 0), мы должны выполнить эту функцию?
Наступило темно, свет зажегся, погорел 4 часа, смотрит, мля, темно и ишшо вкл на 4ч. Так что после отработки 4-х часов ждем 10 часов в отключении, по любому солнышко вылезет. Запускается просто, раскомментируй Delay10. Будет 4ч свету и 10ч тьмы до новых сумерек.
Кто сказал что частота 8000000? И не вздумай фуз DIV8 включать. Двое суток светить будет.
Хелп и даташит же под носом, азы детские спрашиваешь.
Может быть и детские, но вот полгода назад я даже не знак как программатор к мк подключить, а тут уже такое.
Рисовал схему и подумал проверить все наверняка. Уменьшил время в прошивке и закинул в протеус.
Заметил что функция не выполняется. То есть время прошло, светодиод моргнул и все(опять время прошло,св-д моргнул). Как светлеет он гаснет. Тоесть почти все идеально работает, но получается по истечении 4часов свет будет гореть, пока не рассветает.
Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
А да если раскоментировать gosub delay10 то светодиод не загорается
ev3658- ваша прошивка тоже работает (там ацп номер поменять надо было), но тоже получается что по истечении 4ч он включается опять, попробовал просто поставить задержку, но тогда не вкл
imon220 писал(а):
Delay10:
For D = 1 To 36 'wait 10 hour
Wait 1000
Next D
Return
Большие задержки в подпрограмме (Wait 1000-это 1000 секунд).Пока не истекут 1000 секунд,программа будет ждать и ничего не делать.Может лучше использовать таймер?
koms48 писал(а): Должен на 1мин загореться и на 3 потухнуть.
Блин сегодня откомпилировал, и поставил маленькое время как в прошлый раз и все работает.(я ставил 1мин раб 2нет) Не знаю, бывает протеус глючит, часть схемы удалишь и дорисуешь вроде заработает.
Может лучше использовать таймер?
Да я думаю нечего страшного (пусть стоит). Она будет работать на одно реле для света.
Ну это понятно. Я как бы только начинаю учить программирование, а людей не охота дергать постоянно( а сделайте мне так, нет лучше так).
Я погонял немного в протеусе, вроде все нормально. Мне больше всего главное чтоб откл, для этого и делал. А то включаю свет на заднем дворе, а выкл забываю.
Друзья, помогите разобратся с проблемой.
Делаю стрелочный тахометр на аттини25. Управление стрелкой - аппаратный шим, механизм стрелки - тахометр от мотоцикла(в виде милиамперметра подобному шестерочному ТХ-193), импульсы берутся с датчика холла, импульсы подаются на вход прерывания INT0, по прерыванию замеряется время между импульсами, высчитывается частота и выводится в виде шим на стрелку.
Устройство вроде бы работает, но есть глюки которые никак не могу понять.
Основной глюк -частые прыжки стрелки почти до конца шкалы при малых оборотах, при нарастании оборотов прыжки становятся меньше, при оборотх чуть выше середины шкалы прыжки переходят в плавание стрелки. И самый прикол в том что эти прыжки и плавания стрелки не на всём диапазоне оборотов, а только на некоторых значениях: например на оборотах до 1000 прыжки частые, до 1500 реже, до 2000 вообще нету, около 2500 снова появляются, при 3000 опять пропадают и так далее.
Второй глюк - после приветствия(когда при включении устройства стрелка плавно доходит до конца шкалы и обратно) после включения прерываний стрелка опять же делает скачок до середины шкалы.
И третий глюк - когда вместо датчика на вход импульсов просто подать низкий уровень (землю) стрелка прыгает до упора и держится там полсекунды, хотя программно вообще не должна.
Код прилагаю ниже, и схему в протеусе.
Кстати в протеусе таких глюков нет.
И еще глюк с плаванием стрелки появлялся когда при отладке подключал ко входу тахометра генератор импульсов из атмеги8, и плавание было опять же при определенной частоте.