[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: RD3AVJ 
Форум » форумы » Общие вопросы по Bascom-AVR » счетчик импульсов Bascom-AVR (мало что знаю помогите с исходником)
счетчик импульсов Bascom-AVR
leshuiДата: Воскресенье, 09.08.2015, 15:26 | Сообщение # 1
Группа: Пользователи
Сообщений: 3

Статус: Offline
Товарищи! С этого сайта взял за основу исходник:
http://avrproject.ru/publ....er=desc
Подпилил под себя и многое не понятно.
Вообщем хочу собрать счетчик для магнитофона, там будут стоять фото-светодиод, заодно и управление ЛПМ(ленто протяж. механизм) будет. под ЛПМ кусок я написал, осталось только со счетчиком разобраться.
У меня считает имп. справа на лево, если обратно 999-998-997 и т.д через 0

1. У меня положительные имп. заведены на прерывание INT1 (PIND.3)
Не понятно какая команда отвечает за запись имп в переменную W порта PIND.3, почему не PIND.4?
2. Я ни как не могу придумать как сделать чтобы каждые  10 имп менялась переменная W
3. При подаче питании загорается на индикаторе 001, а должно 000,
и куда бы я не втыкал W=0 все равно 001 или вообще не считает имп.
4. для чего нужна команда GIFR=64?

Дальше будут еще вопросы, помогите пока с этим разобраться


Код
'счетчик импульсов от валкодера с индикацией на 3-х разр. семисегмент.
'в минус 999-998-997 и т.д. в плюс 001-002-003 и т.д

$regfile = "2313def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'$sim

Config Portb = Output                   'порт В выход для семисегмент

Ddrd = &B11000111                       '1=выход 0=вход  назначаем входы\выходы
Portd = &B00111000                      'подтяжка входов внутренними резисторами
                      '1=резистор подтянут 0=резистора нет

Dim W As Word
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim Imp As Byte

Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer

Config Int1 = Falling                   ' прерывание INT1 по нисходящему фронту (c + на -)
On Int1 Encod                           ' если прерывание идем на метку encod

Enable Interrupts                       'включаем прерывания
Enable Int1                             'вкл прерывание на INT1

Do                    ' в главном цикле отображаем количество импульсов

Portd = &B1111011

Select Case N1
Case 0 : Portb = &B11000000
Case 1 : Portb = &B11111001
Case 2 : Portb = &B10100100
Case 3 : Portb = &B10110000
Case 4 : Portb = &B10011001
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10000010
Case 7 : Portb = &B11111000
Case 8 : Portb = &B10000000
Case 9 : Portb = &B10010000
End Select

Waitms 4

Portd = &B1111110

Select Case N2
Case 0 : Portb = &B11000000
Case 1 : Portb = &B11111001
Case 2 : Portb = &B10100100
Case 3 : Portb = &B10110000
Case 4 : Portb = &B10011001
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10000010
Case 7 : Portb = &B11111000
Case 8 : Portb = &B10000000
Case 9 : Portb = &B10010000
End Select

Waitms 4

Portd = &B1111101

Select Case N3
Case 0 : Portb = &B11000000
Case 1 : Portb = &B11111001
Case 2 : Portb = &B10100100
Case 3 : Portb = &B10110000
Case 4 : Portb = &B10011001
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10000010
Case 7 : Portb = &B11111000
Case 8 : Portb = &B10000000
Case 9 : Portb = &B10010000
End Select

Waitms 4

Loop
End

Encod:                    ' тут узнаем в каком направлении вращают ручку энкодера

    Waitms 4                    ' ждем пока утихнет дребезг контактов
    If Pind.5 = 1 Then                     ' если на ноге единица (импульс не пришел) тогда
    Incr W                    ' инкременируем переменную (увеличиваем на 1)
    If W > 1000 Then                       'если крутим в + и переменная больше 1000(три разряда потому 1000)
    W = 0                    'то сбрасываем переменную 0
    End If
    Else                    ' в обратном случае
    Decr W
    If W > 1000 Then
    W = 999
    End If                    ' декрементируем переменную (уменьшаем на 1)
    End If

Gifr = 64                    ' сбрасываем регистр хранения прерывания INT0

' а тут готовим переменную к выводу на дисплей

M3 = W
M2 = M3
M1 = M3

M1 = M1 / 100                           ' обработка первого разряда
N1 = Abs(m1)

M2 = M2 Mod 100                         ' обработка второго разряда
M2 = M2 / 10
N2 = Abs(m2)

M3 = M3 Mod 10                          ' обработка третьего разряда
N3 = Abs(m3)

Return
End
Прикрепления: INDIK_2313.dsn(82Kb)




Сообщение отредактировал leshui - Воскресенье, 09.08.2015, 15:29
 
GSVДата: Воскресенье, 09.08.2015, 20:11 | Сообщение # 2
Группа: Проверенные
Сообщений: 35

Статус: Offline
Я сам не супер спец,но думаю так:
1.Если у вас положительные импульсы приходят на INT1,а INT1 сконфигурирован так:

Код
Config Int1 = Falling                   ' прерывание INT1 по нисходящему фронту (c + на -)
то надо переделать прерывание с - на + ,а сам INT1 подтянуть к земле:
Код
Config Int1 = Rising
Если импульс заведен на ногу PIND.3,то как этот импульс может приходить на ногу PIND.4?
В переменную W происходит запись,когда случается прерывание по приходу на ногу PIND.3 того самого импульса.Как только импульс пришел программа переходит в обработчик прерывания:
Код
On Int1 Encod                           ' если прерывание идем на метку encod
Чтобы по приходу импульса менялась переменная в обработчике прерываний я бы сделал так:
Код
Encod:   
If Pind.3 = 1 Then                    'Если на  Pind.3 пришла единица
    Waitms 5
    W = W + 1                    'увеличиваем переменную W на единицу
End If
                    
Return

2.Надо завести ещё одну переменную,например Ww и в обработчике прерываний прибавлять к ней по единице 10 раз и как только она изменится в десятый раз,прибавлять к переменной W  единицу,а переменную Ww сбрасывать в ноль:
Код
Encod:  
If Pind.3 = 1 Then                    'Если на  Pind.3 пришла единица
    Waitms 5
    Ww = Ww + 1
    If Ww = 10 Then
       W = W + 1                    'увеличиваем переменную W на единицу
       Ww = 0                    
    End If
End If

Return
3.Может при подаче питания сразу вызывается прерывание и счетчик прибавляет единицу. По вашему коду  прерывание сидит на единице и ждет ноль,а при включении питания он этот ноль сразу и получает.
4.GIFR=64 - это сброс флага прерывания INT0,но у 2313,по даташиту,регистр флагов прерываний называется EIFR

Вот сюда положил даташит на 2313 на русском-https://yadi.sk/i/xLHOg65AiMRrD.Увлекательное чтиво ))


 
leshuiДата: Воскресенье, 09.08.2015, 20:35 | Сообщение # 3
Группа: Пользователи
Сообщений: 3

Статус: Offline
спасибо, щась буду думать.
Все таки мне не понятно, где здесь команда которая указывает что с прерывания нужно результат занести в переменную W.
И при вкл. питания какое в переменной W все-таки число? Отладчик Bascom ответ на это не дал.


 
leshuiДата: Воскресенье, 09.08.2015, 20:59 | Сообщение # 4
Группа: Пользователи
Сообщений: 3

Статус: Offline

Цитата
то надо переделать прерывание с - на + ,а сам INT1 подтянуть к земле:
А можно это сделать внутренним резистором?


 
GSVДата: Воскресенье, 09.08.2015, 21:29 | Сообщение # 5
Группа: Проверенные
Сообщений: 35

Статус: Offline
Цитата leshui ()
где здесь команда которая указывает что с прерывания нужно результат занести в переменную W
Прерывание отсылает программу в обработчик прерывания Encod и там мы делаем все,что нам нужно,например,меняем значение переменной W,прибавляя к ней единицу.
Цитата leshui ()
А можно это сделать внутренним резистором?
Знаю,что внутренними можно подтянуть к единице,но всегда пользуюсь обычными резисторами,мне кажется так надежней.
Цитата leshui ()
И при вкл. питания какое в переменной W все-таки число?
При включении в переменных должен быть ноль.


 
a5020kДата: Пятница, 14.08.2015, 14:04 | Сообщение # 6
Группа: Свой человек
Сообщений: 43

Статус: Offline
leshui магнитофон видимо катушечный?
Может вы не правильный импульс подаете на порт?
Схема считывания какая до входа в порт какая?


 
Форум » форумы » Общие вопросы по Bascom-AVR » счетчик импульсов Bascom-AVR (мало что знаю помогите с исходником)
Страница 1 из 11
Поиск: