В том и дело. В первом случае весь МК будет работать на одной частоте вместе с таймером, а во втором часы и без конфигурации T1 прекрасно работают... Ибо он вообще никакой роли не играет...
Команда Config Clock = Soft делает следующее внутри МК:
ASSR = &B00001000 - асинхронный режим таймера Т2 (счет от внешнего кварца)
TCCR2 = &B00000101 - предделитель 128 - отсчет 1 секунды
TIMSK = &B01000000 - разрешение прерывания по переполнению T2
Все готово для отсчета времени.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Жалко, что нет книги "Bascom для чайников", мне она была бы очень полезна. Те книги, что я накачал в инете несколько сложны мне для восприятия, никогда раньше не занимавшегося электроникой (а обучалки типа помигаем светодиодом или опросим кнопку уже кажутся слишком легкими). Благодаря сайтам и форумам (особенно РАДИОКОТУ) я уже немного начал понимать и на практике потихоньку реализовывать свои знания. И персональное спасибо за советы в "трудную" минуту!
Да это даже хорошо что нет книг где все-все разжевывается. Голова тоже работать должна. Хватит и кнопалок - мигалок для старта, а дальше недурно будет и даташит почитать и в регистрах поковыряться. Бездумное использование чужих примеров, это конечно вариант, но опыт - бесценен !!!
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
kip96 писал(а):A вот этот не пойдёт? Считает точно, я в железе на макетке делал, переводил на ЖК индикатор на 1820вг1
в архиве исходник, но было давно, туда ещё пытался ввести подсчёт периода.
Вообщем эт я учился, и пробывал. В железе на макетке работал.
Вот как раз в железе он и не работает. Проверял только что. На экране всякую хрень показывает. И по подключению: я так понимаю, младшая м/с - это та, которая подключена к правой части индикатора, старшая - та что к левой ?
Забыл сказать, индикатор от кассового аппарата ЭКР2102, а там стоит буфер на ЛН2-ой перед ВГ1, соответственно все сигналы инвертируются.
А так завтра попробую подключить, попробую, мож-где не доглядел, давно это было
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Да-да, как раз такой индикатор и применял. Только ЛН-ку выкусил и соединил дорожки, т.е. получилось напрямую, без инверсии. А если сигналы без инверсии, то в этом случае как надо доработать код?
ИМХО, надо переписать команду SHIFTOUT, и сигналы опроса (выборки кристалла = CS) младшей и старшей микросхем. Правильно?
И немного непонятно подключение и функции кнопок Kn и Knr. Я так понимаю, что кнопки подключены к PIND.0 и PIND.1. Надо с подтяжкой или без?
Вот ссылка на видео всего этого безобразия: http://xtrason.mylivepage.ru/file/2344/ ... E-0020.mp4
Для загрузки микросхемы в старшем и младшем режимах необходимо выполнить следующую последовательность действий:
установить на входе CS обеих схем уровень логического 0
записать 32 бита данных для «младшей» схемы
записать четыре бита для специальных сегментов младшей схемы и четыре бита управления: 1|1|1|1|P4|P3|P2|P1 (при подаче последней единицы обе микросхемы устанавливаются в младший режим, выводы COA/G обеих схем работают как входы генератора. Происходит синхронизация работы микросхем)
установить на входах CS обеих схем уровень логической 1
установить на входе CS «старшей» схемы уровень логического 0
записать 32 бита данных для старшей схемы
записать четыре бита для специальных сегментов старшей схемы и четыре бита управления: 0|0|0|0||P4|P3|P2|P1 (после этого вывод COA/G старшей схемы начитает работать как выход управления строкой А, а вывод COC/G – как выход встроенного генератора. Импульсы с выхода генератора старшей схемы поступают на вход генератора COA/G младшей схемы, и оба кристалла начинают работать синхронно от генератора старшей схемы)
установить на сходе CS установить уровень логической 1
последнюю цифру надо заменить на 1, хотя может и ошибаюсь, поэксперементируйте.
0 – MSB shifted out first when clock goes low
1 – MSB shifted out first when clock goes high
2 – LSB shifted out first when clock goes low
3 – LSB shifted out first when clock goes high
Igor_67 писал(а):И немного непонятно подключение и функции кнопок Kn и Knr.
Напомню, что данный код не проект, а так, черновик, который я поигрался и бросил.
Кn должен был переключать между частотой и периодом, а Knr сам не пойму, может когда-то нужен был, да остался
Все делают ошибки, только мудрецы - новые, а дураки - старые.
$regfile = "attiny2313.dat" 'выбираем микроконтроллер
$crystal = 8000000 ' частота кварца
$lib "mcsbyte.lbx"
$lib "mcsbyteint.lbx"
Config Portb = Output
Signal Alias Pind.5
Kn Alias Pind.0
Knr Alias Pind.1
Dn Alias Portb.4 ' data (порт для данных на ЖК)
Cl Alias Portb.5 'clock (порт синхронизации на ЖК)
Csst Alias Portb.7 'старшая микросхема
Csml Alias Portb.6 'младшая микросхема
' обЪявляем переменные
Dim I As Byte
Dim Cifri(9) As Byte
Dim T As Byte
Dim A As Word
Dim Byte0 As Byte , Byte1 As Byte
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 ' значение подобрано для захвата за 1 секунду
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: 'переполнение counter1 - счетчик прешедших импульсов
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: ' таблица с данными о цифрах зажигает по порядку : 1234567890
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 m Cs St P F 14 H 15 L o
Ind:
'Shiftout Dn , Cl , I , 0 'последовательная загрузка
I = Not I
Shiftout Dn , Cl , I , 1
Return
Reg:
Incr A
If A > 3 Then A = 1
Return
Сдается мне еще надо сигналы Csst и Csml поменять местами, так как при касании пальцем входа, цифры меняются в старшем разряде, т.е. в самом левом. ИМХО это наводки и должен меняться младший разряд. Или я не прав?
'Set Csst
'Set Csml
Reset Csst
Reset Csml
I = Lookup(cifri(1) , Dta)
Gosub Ind
I = Lookup( cifri(2), 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
cifri(2) похоже пропустил я
первый символ-должна буква быть.
и замените-
Всё! нашёл на работе другую папку.
Этот работает точно, На своей макетке проверил. На "пальце" ловит 49-50.
Ловите , изучайте.
З.Ы.
Проверял на своём, у Вас значит нужно опять в исходнике проинвертировать.
Все переделал, работает! Большое спасибо!!!
Теперь попробую подать образцовую частоту. Посмотрим, до скольки он меряет? По идее, должен свободно брать до 1МГц, хотя для моих целей вполне хватит и половины...
Доброго дня! Хочу поделиться своим первым проектом на Bascom. Это светосинхронизатор для фотовспышки, срабатывающий на 1-й, 2-й или 3-й пых. В качестве фотодатчика - фототранзистор от старой шариковой мыши. Схема непосредственно фотоловушки взята с сайта http://www.osipoff.ru. По умолчанию синхронизатор настроен на срабатывание на 2-й пых. При включении питания (4,5 вольт) два раза мигает зеленый светодиод, показывая текущую настройку. При нажатии на кнопку настройка циклически меняется 3-1-2-3-1..., после чего зеленый светодиод мигает соответствующее количество раз. Эксерименты показали, что устанавливать фотодатчик внутрь корпуса не стоит (снижается чувствительность и перестает реагировать на отраженный свет), нужно вынести его снаружи корпуса. Так что оцените, подскажите, где ошибки (хотя устройство работает), но не сильно строго, все-таки первое изделие (не считая моргалок, кнопочек и LCD-дисплеев).
'**************************************************************************
'Светосинхронизатор для ведомой фотовспышки на срабатывание от 1 до 3 блика
'на Attiny13
'Stetsenko S., 2011
'**************************************************************************
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 32
$swstack = 8
$framesize = 16
Config Portb.0 = Output 'выход на семистор, замыкающий синхроконтакт
Config Portb.2 = Output 'выход на светодиод
Config Portb.4 = Input 'вход сигнала с фотодатчика
Config Portb.1 = Input 'Кнопка
Portb.4 = 0
Set Portb.1
Config Int0 = Falling
On Int0 Knopka
Enable Interrupts
Enable Int0
Dim N_blink As Byte 'на какой блинк ведущей вспышки запускать ведомую
Dim N As Byte 'реально пришедших бликов
Dim Tmp As Byte 'временная переменная
N_blink = 2 'устанавливаем по умолчанию срабатывать на 2-й блик
N = 0 'число пришедших бликов устанавливаем в 0
Portb.2 = 0
Wait 2
For Tmp = 1 To N_blink 'поморгали светодиодом N_blink раз, хотя это и не обязательно
Portb.2 = 1
Waitms 500
Portb.2 = 0
Waitms 500
Next Tmp
Wait 1
Portb.2 = 1
Do
While N < N_blink 'Пока не достигнуто число установленных бликов
If Pinb.4 = 1 Then 'пришел очередной блик
N = N + 1
If N = N_blink Then 'если блик нужный
Portb.0 = 1 'включаем теристор
Waitms 200
Portb.0 = 0 'выключаем теристор
End If
While Pinb.4 = 1 : Wend 'ждем пропадения единицы от фотодатчика
End If
Wend
N = 0 'сброс количества пришедших бликов
Loop
End 'end program
Knopka:
Portb.2 = 0 'гасим светодиод, чтобы показать новое число бликов
Wait 2
N_blink = N_blink + 1 'изменяем установленное число бликов
If N_blink > 3 Then
N_blink = 1
End If
For Tmp = 1 To N_blink 'поморгали светодиодом N_blink раз, показав новое установленное значение
Portb.2 = 1
Waitms 500
Portb.2 = 0
Waitms 500
Next Tmp
Wait 2
Portb.2 = 1 'снова включили светодиод после моргания
Gifr = 64 'очистили стек прерываний
Return
Делаю тут себе кодовый замок на atmega8, с матричной клавиатурой 3х4.
Подскажите пожалуйста, как реализовать на BASCOM следующее:
1. Время на ввод каждой цифры кода - 2 сек.
2. Измерение времени, сколько нажата кнопка. Если меньше какого-то значения то одно действие, если больше - другое.