Search the Community
Showing results for tags 'timer'.
-
всем привет! для новой разработки нужен таймер: 1. дешевый <0.3usd при покупке неполной катушки и достаточно популярный чтоб лежал у всех всегда. 2. корпус желательно ~ sot23-6 3. питание 3...5V но если шире - лучше, потребление <5mW 4. это не должен быть MCU , увы только жесткий hw. 5. должен просто запускаться по фронту или импульсу(хуже но ок) и все , в идеале чтоб время задавалось без конденсатора аля LTC6993/4/5 интервалы ~1mS..30S MIC1555 -нету для быстрой покупки LTC6993/4/5 - дико дорогие ICM7555, TLC555,LMC555, и сам NE555;) - почти норм но SO8 + RC ... это как запасной вариант. наверняка же я что-то упустил?
-
Не могу запустить асинхронный режим. Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц). После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. Компилятор Atmel Studio 7 Шью через Sind Prog 2.1.1 + USBasp 2.0 Вот код: .macro outi ldi r16, @1 out @0, r16 .endm .org $000 rjmp reset .org $001 reti .org $002 reti .org $003 reti .org $004 rjmp timer2_ovf .org $005 reti .org $006 reti .org $007 reti .org $008 reti .org $009 reti .org $00A reti .org $00B reti .org $00C reti .org $00D reti .org $00E reti .org $00F reti .org $011 reti .org $012 reti .ORG INT_VECTORS_SIZE reset: .equ portout=portd .equ ddrout=ddrd .def led=r17 .def mask=r18 .def counter=r19 outi spl,low(ramend) outi sph,high(ramend) outi ddrout, 0xff outi tccr2, 0b00000111 outi timsk, 1«toie2 ldi led,1«5 ldi mask,1«5 sei cycle: cpi counter, 10 breq offtim rjmp cycle timer2_ovf: inc counter out portout, led eor led, mask reti offtim: outi timsk, 0«toie2 rjmp asinxron asinxron: outi assr, 0b00001000 back: in r16, assr cpi r16, 0b00001000 brne back outi tccr2, 0b00000101 outi tcnt2, 0 outi ocr2, 0 outi timsk, 1«toie2 m1: rjmp m1 Верх меги на фото слева.
-
Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален. Используемая периферия: DAC, DMA, TIM4, CLK, GPIO Задача у программы такая: В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод. Проблема: Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом. Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается. Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг. Спасибо.
- 13 replies
-
-1
-
Добрый день. Пытаюсь разобраться с таймерами в stm32f10x (stm32f100c8t6b), на просторах всего русскоязычного интернета есть примеры практически под все таймеры кроме TIM1, который как раз меня и интересует. Собрал проект, работающий с другими таймерами, например TIM3, пытаюсь переделать для TIM1, выскакивает ошибка в строке NVIC_EnableIRQ(TIM1_IRQn); (строки 36, 43, 98) - error: 'TIM1_IRQn' undeclared (first use in this function). Если я правильно понял, то компилятор не понимает, что такое TIM1_IRQn (хотя с TIM3_IRQn все в порядке). Полез в библиотеки, там написано , что полный список источников, которые могут вызывать прерывания, описан в stm32f10x.h stm32f10x.c. Списка, где хотя бы упоминались TIM3_IRQn и прочие, к сожалению, не обнаружил ни в одной подключаемой библиотеке. Среда CoIDE. Проект прикладываю к сообщению. Вопрос заключается в следующем - как в стандартной библиотеке называется источник прерывания от TIM1 и где это можно посмотреть. Заранее большое спасибо. TIM_3.rar
-
Тренажер для глаз Идея- Зажигающиеся по очереди светодиоды, которые отслеживаются глазами в различных плоскостях. Подробности в файле прицепа. Варианты движения глаз: 1. Вправо - влево . Тренажер расположен горизонтально параллельно линии глаз. 2. Вверх – вниз. Тренажер расположен вертикально, на оси между глаз, 3. Ближе - дальше . Тренажер расположен горизонтально на оси перпендикулярной оси между глаз. На иллюстрации, условно закреплен, тренажер, а положения показаны изменением положения головы тренируемого. Конструкция. На концах коромысла, размером 30…50 мм расположены светодиоды, которые поочередно мигают. В коробке в середине расположено- питание, схема управления и органы управления. Питание: аккумулятор 18650, Li-Ion. 3,7 В, Функционал- 1. Изменение частоты мигания, 1…5 сек 2. Таймер длительности упражнения, 1…10 минут Требования- ПРОСТОТА и еще раз простота. Питание выбрано из соображений, что от аккумулятора ноута остались. Светодиоды простейшие, чтобы глазом заметно было Цвет светодиода - белый или желтый или красный. Надо подумать, что будет заметней, чтобы можно было заметить, горит или нет светодиод. Например красный светодиод трудно будет отличить, горящий от не горящего, мне так кажется. Многоцветье использовать не хочу.. В первой прикидке все будет состоять из тумблера включения, двух переменных сопротивлений регулировки длительности и частоты, пара светодиодов, батарейки. Пока не решил, на чем делать проще таймер и регулятор длительности на цифре или аналоге- Критерий простота. Тренажер для глаз.docx
-
Добрый вечер уважаемые! Помогите советом .. Как лучше всего реализовать генератор . Исходные данные такие : Есть выделенный 10 битный параллельный порт при помощи ножек ввода . Он принимает значения от 0 до 1000 , выводит эти данные основной микроконтроллер тоже через параллельный порт . Нужно исходя из этого генерировать частоту от 1000Гц до 5000Гц с шагом 4-5Гц . Пробую программно генерить - не получается , вернее получается очень коряво . Если подстроил нижнюю границу точно , к примеру 1000Гц , то верхняя плывет и наоборот , если верхнюю подстроил то нижняя плывет . Допускается на больших частотах (свыше 4000Гц шаг 20Гц ) но как синхронизировать показания дисплея с генератором ? Есть вариант применить таблицу но это очень муторно ... Частота кварца мк который генерит частоту 16МГц. Посоветуйте какую частоту кварца лучше выбрать и каким методом генерить частоту ? Еще одна особенность : надо формировать импульс длительностью 10мкс , а вот чтобы период был к примеру при 1000Гц = 990мкс. и т.д. Есть хитрости у таймера Attiny2313A при помощи которых можно аппаратно сформировать частоту? С уважением Артем.
- 12 replies
-
- attiny2313a
- avr
-
(and 2 more)
Tagged with:
-
Доброго времени суток, решил начать потихоньку осваивать МК, т.к схемы собранные на рассыпухи не отличаются высокой точностью и стабильностью. Начал ставить задачи по этапно - моргание светодиодом -> моргание светодиодом после нажатия на кнопку - > моргание светодиодом при нажатии на кнопку в течении 40 секунд-> всё остальное что может делать МК в течении этих 40 сек. На данном моменте застрял на 3-ем этапе, никак не могу разобраться как прикрутить работу таймера к своему коду, листинг прилагаю (1- программа моргания светодиодом 3 раза, после нажатия на кнопку, 2 - изыскания на тему таймера): #include <mega8.h> #include <delay.h> #include <interrupt.h> #include <io.h> #define PD2 2 // Переобозначение 2 пина порта D на его имя. void main(void) { PORTD = 0b10000000; // Подключаем подтягивающий PULL-UP резистор к 2 пину порта D. DDRD = 0b00000000; // Настроим порт D на ввод информации. DDRB = 0b11111111; //Настроим порт D на вывод информации. while(1) // Бесконечный цикл опроса кнопок. { if (PIND &= 1<<PD2) // Считываем 2 пин порта D. { PORTB =0b00000000; // Если 1 (кнопка не нажата), то гасим светодиод. } else { PORTB = 0b00000001; // Если 0 (т. е. кнопка нажата), то зажигаем светодиод. delay_ms(500); PORTB = 0x00000000; delay_ms(500); PORTB = 0x00000001; delay_ms(500); PORTB = 0x00000000; delay_ms(500); PORTB = 0x00000001; } а теперь таймер: #include <mega8.h> #define s; int s; // переменная для хранения секунд // Обработка прерывания по совпадению interrupt [TIM1_COMPA] void timer1_compa_isr(void) { s++; // увеличиваем переменную каждую секунду if(s>59) // обнуляем секунды после 59 { s=0; } TCNT1=0; //обнуляем таймер } void main(void) { TCCR1A=0x00; //настройка таймера TCCR1B=0x05; TCNT1=0x00; //здесь увеличиваются тики OCR1A=0x1E85; //записываем число в регистр сравнения TIMSK=0x10; //запускаем таймер }
-
Всем Добрый день, Форумчане !!! Всё вот никак не могу понять, как рассчитать время для таймеров в C18 компиляторе. Вот под MicroC - в курсе, а под C18 - ну, вот - никак ! Есть ли где нормальное описание, что за что отвечает ? Всё перерыскал и собрал хоть какой, но рабочий код из кусочков, который нашёл в инете. Камень: PIC18F452 Среда разработки: MPLAB X, Linux. Компилятор C18. Программатор: PICkit3 Кварц на 10 МГц, так как в наличии только 22пкф Конфигурация в файле "config_bits.h": // PIC18F452 Configuration Bit Settings // 'C' source line config statements #include <p18f452.h> // CONFIG1H #pragma config OSC = HS // Oscillator Selection bits (HS oscillator) #pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source)) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset enabled) #pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V) // CONFIG2H #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128) // CONFIG3H #pragma config CCP2MUX = ON // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1) // CONFIG4L #pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET) #pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh) not code protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh) not write protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks) #pragma target clock 10_000_000 Сам код: #include "config_bits.h" #include <stdio.h> #include <stdlib.h> #include <timers.h> void high_isr (void); // ?????! #pragma code high_vector = 0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma interrupt high_isr // Зачем эти приоритеты ?! void high_isr (void) { static int o = 0; if (INTCONbits.TMR0IF){ INTCONbits.TMR0IF = 0; TMR0H = 0x85; // Здесь, я так понял, всё обнуляем ... TMR0L = 0xEE; // И тут // Юзер [b]Alex[/b] попросил меня изменить данный цикл, я потом изменю, но как-то всё разберу окончательно !! Спасибо !!! if ( o == 0 ) { PORTB = 0x0E; o = 1; } else if ( o == 1 ) { PORTB = 0x0D; o = 2; } else if ( o == 2 ) { PORTB = 0x0B; o = 3; } else if ( o == 3 ) { PORTB = 0x07; o = 4; } else if ( o == 4 ) { PORTB = 0x0B; o = 5; } else if ( o == 5 ) { PORTB = 0x0D; o = 0; } } } void main (void) { // Тут просто распределяем выходы, входы и номиналы. TRISA = 0x00; PORTA = 0x00; TRISB = 0xF0; PORTB = 0x0F; TRISC = 0x00; PORTC = 0x00; TRISD = 0x00; PORTD = 0x00; TRISE = 0x00; PORTE = 0x00; ADCON1 = 0x0F; // Тут та самая **па T0CON = 0x85; // Регистр контроля ? Почему 0x85 ? 10000101 - я так понял включает определённые биты в этом регистре. В даташите были прописаны определённые биты, но почему именно эти !? TMR0H = 0x85; // Вписываем что-то в таймер ? 10000101, опять ? TMR0L = 0xEE; // Тут также ? Почему 11101110 ? INTCON = 0x20; // Регистры прерывания ?! INTCON2 = 0x04; // ? RCONbits.IPEN = 1; // Включаем приоритеты ? T0CON = 0x85; // Опять регистр контроля ? TMR0H = 0x85; // Вписываем что-то опять в таймер ? TMR0L = 0xEE; // Тут опять также ? INTCONbits.GIEH = 1; // Активирует все высокие приоритеты ? while (1) { } } Сам код работает стабильно на живой схеме, но точно не в 1 секунду. ------------------------------------------ Собсно, сам вопрос ... ну вот как тут научиться рассчитать хоть 0.00001с или что, за что отвечает. Я рыскал в инете и под каждый компилятор всё по разному ... есть ли где литература или хоть что-то, где можно найти ответы на эти вопросы !!!? Нашёл пару информаций по сайтам, например ... http://ee.cgu.edu.tw...uP102_Timer.pdf, но, блин, может кто нормально объяснить что и зачем ? Я буду очень благодарен ! Спасибо и дай Бог вам счастья и здоровья !!! :thank_you2: