Хочу написать програмульку на BASCOM-AVR. Её задача - посчитать импульсы, пришедшие на ногу микрухи, но я не въеду какую команду нужно использовать. ПОМОГИТЕ КТО МОЖЕТ (если конечно эта задача выполнима).
Помогите со счетчиком импульсов.
Сообщений 1 страница 17 из 17
Поделиться22007-11-05 09:11:38
Ьщжно использовать таймер -счетчик в режиме счетчика.
Поделиться32007-11-05 21:07:31
Мне счетчик нужен не отдельно сам по себе, а внутри более сложной программы. Иначе стал бы я народ такой ерундой мучать!
Поделиться42007-11-06 09:16:38
Считай импульсы по прерыванию. Можно настроить на разные режимы - спад, высокий уровень, низкий...
Поделиться52007-11-06 09:17:26
Ну может быть такой вариант:
Разрешай внешнее прерывание, по нему инкрементируй свой счетчик.
Примерно так:
Dim Counter As Integere
Config Int0 = Low Level
On Int0 label33
Enable Interrupts
Enable Int0
Do
.....................
Loop
End
label33:
Incr Counter
Return
Поделиться62007-11-06 21:10:00
Спасибо за помощь! Но мне пока не понятно как работает этот алгоритм и где здеся переменная ="кол-во импульсов"? Рядом с умными чувствую себя таким тупым! 
Поделиться72007-11-07 08:38:36
Dim Counter As Integere 'переменная "кол-во импульсов"
Config Int0 = Low Level 'настройка прерывания Int0 на срабатывание по низкому уровню
On Int0 label33 'при срабатываниии прерывание Int0 переход на метку label33
Enable Interrupts 'разрешить прерывания
Enable Int0 'разрешить прерывание Int0
Do 'Начало основного цикла
..................... 'Тело программы
Loop 'Конец основного цикла
End
label33: 'Выполнение действий при срабатывании прерывания Int0
Incr Counter 'Увеличить значение Counter на еденицу
Return 'Выход из подпрограммы
Поделиться82007-11-07 09:15:57
To FREEMAN все мы когда-то начинали ........
radan Спасибо за коментарии, ну не могу себя заставить писать коменты. Хоть часто об этом жалею......
Там в примере необходимо добавить подавление дребезга контактов, если входной сигнал от кнопки или реле.
Поделиться92007-11-07 18:59:25
Ьщжно использовать таймер -счетчик в режиме счетчика.
А с этого места поподробнее можно? С примерами:)
Поделиться102007-11-07 22:04:28
Спасибо за помощь ВСЕМ кто помог! У меня вопрос как привязать это прерывание int0 к нужному Pinb.0? А в остальном всё круто!
Поделиться112007-11-07 22:38:30
[
Спасибо за помощь ВСЕМ кто помог! У меня вопрос как привязать это прерывание int0 к нужному Pinb.0? А в остальном всё круто!
А для этого нога специательная есть, и для int0 и для int1-5
А вот привязать затруднительно
Проще плату переразвести 
Поделиться122007-11-08 10:59:11
>>А с этого места поподробнее можно? С примерами:)
$regfile = "2313def.dat"
$crystal = 8000000
Config Timer0 = Counter , Edge = Rising
Do
Loop
End
По переднему фронту на PD4 +1 в TCNT0
Поделиться132007-11-08 23:35:59
Мне нужно использовать 2 пина для 2х разных источников прерываний и отслеживать то один, то другой, причем кол-во импульсов заносить в переменные; Как мне это оформить? Может использовать pulsein? Подскажите кто-нить, а то я уж всю голову сломал блин!!! ;о(
Поделиться142007-11-09 11:56:26
разрешай внешние прерывания и в обработчиках прописываешь свои условия и нужные процедуры по счетчикам.
Ася есть?
если че стучи #434077373
Поделиться152007-11-09 14:43:41
Теперь я в аське 418267559.
Поделиться162007-11-17 15:32:47
$regfile = "2313def.dat"
$crystal = 8000000
Config Timer0 = Counter , Edge = Rising
Do
Loop
End
По переднему фронту на PD4 +1 в TCNT0
А еще подробнее можно? Для совсем одаренных 
для мега8:)
Отредактировано Skull (2007-11-17 22:56:17)
Поделиться172007-11-26 23:36:25
Нашел вот такую штуку, как понял частотомер....
Хто-нибудь,пожалуйста, подпишите комментарии, чтоб уразуметь что к чему .....
$regfile = "m128def.DAT"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 16
$framesize = 40
Dim IsrFlag As Byte
Dim StartStamp As Word
Dim StopStamp As Word
Dim TimerTicks As Word
Dim FrequencyHz As Long
' ======================================================
' Timer1 configuration
'
' Mode: Normal mode
' Prescaler: 1 (No prescaler)
' Input capture: Falling edge / noise canceler enabled
TCCR1A=&H00
TCCR1B=&H81 ' &H01 will disable the noise canceler
Config PinD.4 = Input ' Input capture pin (ICP1)
Set PortD4.0 ' Enable internal pull-up on the ICP1 pin.
' ======================================================
On Capture1 Timer1_capture_isr Nosave
Enable interrupts
Do
IsrFlag = 0
StartStamp = 0
StopStamp = 0
Timer1 = 0 ' Clear Timer1 count
Set TIFR.ICF1 ' Clear Timer1 Input Capture Flag.
Enable Capture1 ' Enable Input Capture interrupt.
Waitms 10 ' During this time the signal is measured on the ICP1 pin.
' Here we wait 10 ms so we can measure down to 250 Hz.
' If the lowest frequency is 44.1 kHz, then wait for 100 ?s.
Print "Start: " ; StartStamp ; " Stop: " ; StopStamp
TimerTicks = StopStamp - StartStamp
Print "Timer Ticks: " ; TimerTicks
FrequencyHz = 16000000 / TimerTicks '16 MHz clock and no prescaler.
Print "Frequency : " ; FrequencyHz ; " Hz"
Waitms 1000
Print "=========================================================="
Loop
End
'======================================================
' This interrupt service routine is triggered by a falling edge
' on the ICP1 pin.(PD4 of the ATbanned28).
Timer1_capture_isr:
!PUSH R16
!PUSH R17
!PUSH R26
!PUSH R27
!IN R16, SREG
!PUSH R16
'==============================
LOADADR IsrFlag , X
!LD R16, X
!sbrc R16,0 ' Skip next instruction if bit 0 in R16 is cleared.
!rjmp Timer1_capture_isr2
!SER R16 ' Set Flag (the variable IsrFlag is our flag)
!ST X, R16 ' Store the variable IsrFlag
LOADADR StartStamp , X 'Save Input Capture Register. (First falling edge).
!IN R16, ICR1L
!IN R17, ICR1H
!ST X+, R16
!ST X, R17
!rjmp Timer1_capture_isr3
'==============================
Timer1_capture_isr2: 'This was the second falling edge
!LDS R16,TIMSK 'Disable capture interrupt
!ANDI R16,&HDF
!STS TIMSK,R16
LOADADR StopStamp , X 'Save Input Capture Register
!IN R16, ICR1L
!IN R17, ICR1H
!ST X+, R16
!ST X, R17
Timer1_capture_isr3:
!POP R16
!OUT SREG, R16
!POP R27
!POP R26
!POP R17
!POP R16
Return
'=====================================================