Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Таймер.

Сообщений 31 страница 54 из 54

31

Забудешь посмотреть после очередной компиляции, и получится не совсем то, что хочется.

Много раз так попадал, Bascom - штука хорошая, но рассчитывать на него не стоит.

Где то я видел программу, которая показывает все используемые регистры, но не помню где.

0

32

sasha_1973 написал(а):

Где то я видел программу, которая показывает все используемые регистры, но не помню где.

Думаю, что "используемые в программе" и "используемые в данный момент" - вот тут закавыка... ;)

0

33

Нашёл, программа, которая показывает регистры

+1

34

sasha_1973 написал(а):

Нашёл...

Занятно...
Надо будет поюзать... ;)

0

35

Программа платная, 50 злотых. Это примерно 15 долларов...

0

36

Добрый день.
Подскажите как настроить таймер атмеги8 чтобы получился генератор стоячей волны 7.83 Гц ,нужно два импульса сдвинуты относительно друг друга на четверть длины периода ,тоесть 90 градусов  , и как их правильно согласовать в один выход .

0

37

olegkaras написал(а):

Добрый день.
Подскажите как настроить таймер атмеги8 чтобы получился генератор стоячей волны 7.83 Гц ,нужно два импульса сдвинуты относительно друг друга на четверть длины периода ,тоесть 90 градусов  , и как их правильно согласовать в один выход .

Это уже серия Xmega имеет гибкость в таймерах и их расширение AVEX, благо куриво есть на кирилице.

0

38

olegkaras написал(а):

Добрый день.
Подскажите как настроить таймер атмеги8 чтобы получился генератор стоячей волны 7.83 Гц ,нужно два импульса сдвинуты относительно друг друга на четверть длины периода ,тоесть 90 градусов  , и как их правильно согласовать в один выход .

Модулированный ШИМ

0

39

Доброго дня! Подскажите, если у таймера 1 конфигурирую Config Timer1 = Pwm , Compare A Pwm = Disconnect , Compare B Pwm = Clear Up, то можно ли использовать пин oc1a на вывод? То есть как свободный пин и выводить на него когда надо 0 или 1.

0

40

можно

+1

41

Доброго дня! Делаю частотомер, нашёл для тактирования МК хороший точный кварц, но проблема в том, что его частота - 10МГц, то есть не кратна "секундным" значениям. Вопрос - как отсчитать временной интервал, например, в 1 секунду или в 0,1 секунду или в 0,5 секунд? Как сконфигурировать таймер при таком "некратном" кварце? Хотелось бы формулу или алгоритм...

0

42

зная свою частоту, зачем вам ровные значения своего кварца?
измерили за нужный период и поделили пропорционально.

0

43

Существуют ли реализации такого метода измерения? Я бы сделал по аналогии.

0

44

utnik написал(а):

Вопрос - как отсчитать временной интервал, например, в 1 секунду или в 0,1 секунду или в 0,5 секунд?
Как сконфигурировать таймер при таком "некратном" кварце?

Для кварца 10МГц без делителя:
Вариант 1 (реальный отсчет 0,1 сек)

Config Timer1=Timer, Prescale = 64, Clear Timer = 0
On OC1A Обработка 'Имя обработчика по совпадению timer1 с COMPARE1A
Compare1A = 15624 'Совпадение COMPARE1A c TIMER1
Enable Oc1a
Enable INTERRUPTS   'На усмотрение

Вариант 2 (реальный отсчет 0.0999936 сек)

Config Timer1=Timer, Prescale = 256, Clear Timer = 0
On OC1A Обработка 'Имя обработчика по совпадению timer1 с COMPARE1A
Compare1A = 3905 'Совпадение COMPARE1A c TIMER1
Enable Oc1a
Enable INTERRUPTS   'На усмотрение

Вариант 3 (реальный отсчет 0.0999424 сек)

Config Timer1=Timer, Prescale = 1024, Clear Timer = 0
On OC1A Обработка 'Имя обработчика по совпадению timer1 с COMPARE1A
Compare1A = 975 'Совпадение COMPARE1A c TIMER1
Enable Oc1a
Enable INTERRUPTS   'На усмотрение

Далее в п/п прерывания "Обработка" определяетесь, что делать с полученной 0,1 сек...

0

45

Время в мкс:    Const Const_t_sys = 1000       'Период прерываний в мкс

Пример

$map
  $loadersize = 1024

  $regfile = "m328pdef.dat"
  $crystal = 8000000
  $framesize = 64
  $hwstack = 64
  $swstack = 64

'===============================================================================
            'Настройка USART
'===============================================================================
  $baud = 38400     '38400
  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'===============================================================================
            'Настройка системного времени
'===============================================================================
'  Const F_clk = _xtal / 1000000       'Частота МК в МГц
  Const Const_div_sys_timer = 64       'Аппаратный делитель используемого таймера

  Const Const_t_sys = 1000       'Период прерываний в мкс

  Const Const_time_sys =((_xtal / 1000000) * Const_t_sys / Const_div_sys_timer) + 0.5

  Compare0a = Const_time_sys - 1       '124       '1 ms

  Dim Счетчик_ms As Word

'===============================================================================
            'Настройка TIMER0 для отсчёта временных интервалов
'===============================================================================
  Config Timer0 = Counter , Prescale = Const_div_sys_timer , Compare A = Disconnect , Clear Timer = 1

  On Compare0a Обработка_прерывания_compare0a Nosave

  Stop Timer0

  Timer0 = 0

'--------------  Разрешаем работу необходимых прерываний  ----------------------

  Enable Compare0a
  Start Timer0
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

    nop

   Power Idle       ' Отправляем МК на тихий час
'===============================================================================
  Goto Главный_цикл
End
'===============================================================================
'       П О Д К Л Ю Ч Е Н И Е     Р А Б О Ч И Х     М О Д У Л Е Й
'===============================================================================

'===============================================================================
  Обработка_прерывания_compare0a:
'-------------------------------------------------------------------------------
    !push R16
    !in R16 , sreg
    !push R16

    !lds R16 , {Счетчик_ms}
    !SUBI R16 , -1
    !sts {Счетчик_ms} , R16
    !lds R16 , {Счетчик_ms + 1}
    !SBCI R16 , -1
    !sts {Счетчик_ms + 1} , R16

    !pop R16
    !out sreg , R16
    !pop R16

    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

+1

46

Спасибо, как делать временные интервалы разобрался. К сожалению, при таком методе измерений (подсчёт количества импульсов измеряемой частоты за единицу времени) точность для моего конкретного случая недостаточна.

Нужно измерять количество условных тактов системного генератора за период измеряемого сигнала, а затем переводить это в частоту (метод обратного счёта). Пока что я нашёл только один такой проект, он на ассемблере и под другой контроллер, исходников нет.

PS: нашёл, что в BASCOM, оказывается, есть PULSEIN для подсчёта длительности импульса. Попробую через неё.

Отредактировано utnik (2023-09-23 08:11:32)

0

47

Самый точный отсчёт - это подсчёт импульсов.  С методом обратного отсчёта столкнётесь с тем, что мк только и будет делать, что считать частоту, и больше ни чего не сможет делать с повышением частоты. К примеру вывод информации на экран, или даже на терминал уже создаст проблемы. Либо нужно будет придумывать хитрый алгоритм, что опять будет сказываться на точности. А подсчёт импульсов будет работать сам, не мешая мк выполнять другие задачи.

+1

48

Это понятно. Мне нужно точно (до десятых, а лучше - до сотых долей герца) считать одну из следющих частот: 1 Гц,  4096 Гц,  8192 Гц,  32768 Гц. То есть измеряемую частоту я могу выбрать из этих и конкретно под неё нужен точный метод счёта.

Вывод информации возможен в перерывах между подсчётами. Хотя бы раз в секунду было бы более, чем достаточно, можно даже реже.

Отредактировано utnik (2023-09-24 07:43:00)

0

49

Да, 1 Гц это конечно круто.
Ну вот что первое приходит в голову - подключить частоту к ноге прерывания, и по первому импульсу запускать счётчик, по второму останавливать и забирать показания. Но при переходе в прерывание нужно прописывать на асме регистры, что бы знать, сколько тиков проёдёт пока вы остановите счётчик, да и в самом прерывании лучше на асме писать, что бы жёстко контролировать процесс.
Да и считывать показания можно будет не раньше чем через 2 сек.
Для PULSEIN нужен 100% меандр

0

50

Имея хороший точный кварц 10Мгц, я бы, наверное, сделал блок на логике. отдельно кварцевый генератор и элемент "И" пропускающий частоту на счётчик МК.  Ну и D- триггер
Самый точный отсчёт будет. И главное - понятный

Отредактировано kip (2023-09-24 20:45:50)

0

51

Можно сделать и на логике, но на МК, как я думал, проще.
С ассемблером именно AVR я плохо знаком (писал раньше только под Z80), но алгоритм, думаю, мог бы быть таким: при входе во второе прерывание остановить таймер (может быть на ассемблере, хотя это, возможно, непринципиально), будет какая-то потеря тактов. Взять максимально точный эталонный кварц, измерить его и определить эту потерю, будет некая константа, её потом вычитать. Нужно поэкспериментировать.

0

52

utnik написал(а):

Это понятно. Мне нужно точно (до десятых, а лучше - до сотых долей герца) считать одну из следющих частот: 1 Гц,  4096 Гц,  8192 Гц,  32768 Гц.

Если подойдет не только AVR, можете посмотреть на STM32, у которых есть 32-ух битный таймер с 16-ти битным предделителем (любой коэффициент деления в пределах 1 - 65536).
Но баскома для STM32 нет.

0

53

Пётр написал(а):

Но баскома для STM32 нет.

Только по этой причине до сих пор сижу на дорогущих и маломощных AVR....(

0

54

Nec, Марк судя по всему не собирается выпускать баском для STM32.
Если не хватает возможностей AVR, то стоит посмотреть на другие среды и языки кроме баскома.

0