реклама на сайте
подробности

 
 
> Ищу третий месяц объяснение этих 4 строчек., таймер1 (режим 8)
ветерок
сообщение Jun 3 2017, 17:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 29-11-06
Из: Ижевск
Пользователь №: 22 902



Этот код реализует меандр длительностью "1" и "0" 170 и 100 микросекунд (примерно)
Код
// Настройка ТАЙМЕРА1
TCCR1A=(1<<COM1A1)|(1<<COM1A0);// порт PB1 как инвертированый выход таймера
TCCR1B=(1<<WGM13)|(1<<CS12)|(1<<CS10); // режим 8 ,таймера, частота клока: Fclk/256=62500 Гц (1 тик таймера=0.9536 мкс (62500\65536) )
  uint16_t x = 170; // длительность '1' (единички или иначе импульса) в микросекундах
uint16_t y = 100;   // Длительность '0'(ноля или паузы) в микросекундах
  ICR1= (uint32_t) (x+y) /128;
  OCR1A= (uint32_t) y /128;


но в даташитах ниводном не нашёл такой режим работы
И кусок текста или таблицу в которой бы указывалось что используется оба регистра OCR1A и ICR1 в работе!
в таблице есть ICR
а на диаграмме OCR

А это...
Код
ICR1= (uint32_t) (x+y) /128;
  OCR1A= (uint32_t) y /128;

вообще магия

Может кто ткнёт пальцем.
хочу понять где это описано и как это работает.



Сообщение отредактировал ветерок - Jun 3 2017, 17:23


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
akl
сообщение Jun 6 2017, 03:44
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773



Цитата(Эдди @ Jun 5 2017, 18:52) *
И непонятно, зачем что-то в ICR1 писать, который автоматом заполняется значением счетчика при наступлении внешнего события.
В этом режиме ICR1 используется в качестве регистра сравнения и автоматом в него извне ничего не заносится.
Код
;Проверка режима 8 таймера1
    .INCLUDE "tn2313def.inc"

.equ    Fo=20000000

    .CSEG

.org    0x00
RESET:
    SBI    ACSR,ACD; Запрет работы компаратора

    LDI    R22,$FF    ; Установка портов
    OUT    DDRD,R22
    OUT    DDRB,R22
    OUT    DDRA,R22
;************************************************
    LDI    XH,HIGH(100*Fo/1000000/2-1)
    LDI    XL,LOW(100*Fo/1000000/2-1)
    OUT    OCR1AH,XH
    OUT    OCR1AL,XL

    LDI    XH,HIGH((170+100)*Fo/1000000/2-1)
    LDI    XL,LOW((170+100)*Fo/1000000/2-1)
    OUT    ICR1H,XH
    OUT    ICR1L,XL

    LDI    R22,1<<SE
    OUT    MCUCR,R22

    LDI    R22,1<<COM1A1|1<<COM1A0
    OUT    TCCR1A,R22

    LDI    R22,1<<WGM13|1<<CS10
    OUT    TCCR1B,R22    ;T1 режим 8

;WAIT:
    SLEEP
    RJMP    RESET
;************************************************
.EXIT
Этот код дает на выходе PB3/OC1A (на макете стоит ATtiny2313, кварц 20МГц) довольно строгие 100мкс - 0 и 170мкс - 1
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jun 6 2017, 05:19
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(akl @ Jun 6 2017, 06:44) *
В этом режиме ICR1 используется в качестве регистра сравнения и автоматом в него извне ничего не заносится.

Да почитал я уже. Надо было замену ARR найти у отмеля для перестройки скорости тактового генератора ШД, сделал на таймере 1:
Код
    TCCR1B |= _BV(WGM12); // configure timer1 for CTC mode, TOP is OCR1A
    OCR1A   = 1000; // set the CTC compare value - 2kHz (means 1kHz)
    TCCR1B |= _BV(CS11); // start the timer at 16MHz/8 = 2MHz
    TIMSK1 |= _BV(OCIE1A); // enable the CTC interrupt

смена скорости:
Код
            TIMSK1 &= ~_BV(OCIE1A); // disable timer interrupt
            OCR1A = O;
            TCNT1 = 0; // reset counter
            TIMSK1 |= _BV(OCIE1A);

Очень непривычное железо: периферии [CENSORED]. То-то и решают абдуринщики все свои проблемы при помощи тупого ногодрыга, а вместо четких задержек такты считают… Тут элементарно 1-wire реализовать, чтобы не было race conditions, — тот еще гемор! Благо, мне один раз поногодрыжничать на этом [CENSORED], а потом нормальную систему управления разрабатывать. Для шаговиков думаю какие-нибудь приличные драйвера использовать, соединяемые, скажем, по SPI — дал ему команду, он сам с учетом разгонно-тормозных характеристик на нужное количество шагов движок угонит. А то для генерирования тиков на 5 ШД (если брать халявные драйвера, управляемые CLK/DIR) даже у жирных STM32 таймеров не хватает…

Сообщение отредактировал IgorKossak - Jun 19 2017, 09:44
Причина редактирования: брань
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ветерок   Ищу третий месяц объяснение этих 4 строчек.   Jun 3 2017, 17:21
- - _pv   а ещё больше картинки слабо сделать?   Jun 3 2017, 17:49
- - ветерок   Допустим... А где это написано ?   Jun 3 2017, 18:05
- - _pv   таблица 16-4, столбец TOP   Jun 3 2017, 18:23
- - Den64   Адекватно тему создать можно было? (я б так вопрос...   Jun 3 2017, 18:26
- - ветерок   В каком месте даташита, можно ткнуть пальцем гд...   Jun 4 2017, 02:56
|- - Harvester   Цитата(ветерок @ Jun 4 2017, 05:56) В как...   Jun 4 2017, 06:22
- - ветерок   совершенно верно "При WGM13:0 = 8 счетчик сч...   Jun 4 2017, 09:40
|- - Den64   Цитата(ветерок @ Jun 4 2017, 12:40) тут к...   Jun 4 2017, 09:46
- - ветерок   оригинал читаю и перевод смотрел ну его смысла н...   Jun 4 2017, 09:48
|- - Den64   Цитата(ветерок @ Jun 4 2017, 12:48) OCR1 ...   Jun 4 2017, 11:56
- - aiwa   Цитата(ветерок @ Jun 3 2017, 20:21) но в ...   Jun 5 2017, 13:21
- - Эдди   Ты-то сам эту белиберду читал? Код uint16_t x = 1...   Jun 5 2017, 14:52
|- - Сергей Борщ   QUOTE (Эдди @ Jun 5 2017, 17:52) И непоня...   Jun 5 2017, 20:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 13:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016