zaz968m
Участник-
Постов
10 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйКонтакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
-
Понял, благодарю.
-
Я, кажется, понял. Выставил в первый бит 1, дождался когда она сбросится, а только потом продолжил выполнять дальше программу. Так? В это скриншоте вижу что по сбросу микроконтроллера все прерывания сброшены. Допустим, я запишу туда 1 для сброса. Это не вызовет никакой неправильной реакции? Не установятся ли прерывания? Вот последний код что я состряпал из разных кусков. И он работает! На данном этапе для меня это достижение. unsigned int n; void initClocks(void); void Timer0_Init(void); __irq void timer0ISR(void); /***************************************************************************/ /****************************************************************************/ int main (void) { initClocks(); Timer0_Init(); /* Настроить таймер */ // IODIR1 = 0x3C000000; /*Конфигурируем Р1.26 - Р1.29 на выход, остальное на вход*/ IOSET1 = 0x3C000000; /* Устанавливаем ноль на выходах */ FIO2DIR = (1<<13); //Configure Pin P2.13 as Output FIO2SET = (1<<13); // n = 0x04000000; IOCLR1 = n; /* Установить состояние порта */ //Запустить таймер T0TCR = 0x00000001; for (;;) {} //бесконечный цикл } /***************************************************************************/ /****************************************************************************/ void Timer0_Init(void) { T0CTCR = 0x0; //Set Timer Mode T0PR = 8999; //Increment T0TC at every 9000 clock cycles //9000 clock cycles @9 Mhz = 1 mS T0MR0 = 399; //Zero Indexed Count-hence subtracting 1 (400 msec) T0MCR = (1<<0) | (1<<1);//Set bit0 & bit1 to Interrupt & Reset TC on MR0 VICVectAddr4 = (unsigned )timer0ISR; //Pointer Interrupt Function (ISR) VICVectCntl4 = 0xF; //lowest priority VICIntEnable = (1<<4); // Enable timer0 interrupt T0TCR = (1<<1); // Reset Timer } /***************************************************************************/ /****************************************************************************/ __irq void timer0ISR(void) { if (n!=0x20000000) {n<<=1;} else{n = 0x04000000;} T0IR = 0x00000001; /*Сбросить флаг прерывания в Timer0*/ //Бегущая единица IOSET1 = 0x3C000000; IOCLR1 = n; /* Установить состояние порта */ VICVectAddr = 0; /*Перевести VIC в исходное состояние*/ } Как работает таймер я понял. Читаю RTFM.
-
zltigo, спасибо! Уже скачал. Проект мой получилось собрать и запустить в Keil. Прерывания от таймера по совпадению заработали. Но! Для этого в проект был включён файл LPC2300.s (startup). В IAR тоже нужно, наверное, типа такого файл подключать? Подскажите?
-
Да Вы правы, не правильно я выразился, это заголовочные файлы. Спасибо за совет! zltigo, если Вас не затруднит, можете в двух строчках написать, какие базовые понятия С языка нужно изучить прежде всего.
-
jcxz, это значит что после операции T0TCR = 0x00000002; нужно проверить сбросился ли ТС и только потом продолжать конфигурацию? Его обязательно чистить в конфигурации таймера? Читал в юзер мануал что по сбросу он очищен. jcxz, так правильно будет? PCLKSEL0 |= 0x0000000E; //Timer0Clk=72Mhz/8= 9 MHz } void Timer0_Init(void){ //Предделитель таймера = 8999 T0PR = 8999; //Сбросить счетчик и делитель T0TCR = 0x00000002; //Режим таймера Т0СТСR = 0; //При совпадении сбрасываем таймер и вызываем прерывание T0MCR = 0x00000003; //Регистр совпадения = 1000 (1 Гц) T0MR0 = 1000; До этого я программировал только AVR (mega) на Ассемблере. В С, можно сказать, я полный балбес, только учусь. В бесконечный цикл вставлял такой код //if (T0IR & (1 << 0)) {FIO2CLR = (1<<13); //Зажгли светодиод | // T0TCR = 0x00000000; //Остановили таймер - счётчик | // T0IR = 0x00000001; //сбросили флаг прерывания |Ловушка // T0TCR = 0x00000002; //сбросили таймер - счётчик | // T0TCR = 0x00000001;} //запустили таймер - счётчик | // else {FIO2SET = (1<<13);} и по светодиоду видел, что 0 бит T0IR с определённым периодом устанавливается (таймер входит в прерывание). Это не оно VICIntEnable |= 0x00000010;? Вроде это обработчик прерывания __irq void Timer0_Int (void) { if (n!=0x2000000) {n<<=1;} else {n = 0x04000000;} T0IR = 0x00000001; /*Сбросить флаг прерывания в Timer0*/ //Бегущая единица IOSET1 = 0x3C000000; IOCLR1 = n; /* Установить состояние порта */ VICVectAddr = 0; /*Перевести VIC в исходное состояние*/ } Пробовал я писать имена битов в регистрах, как в других примерах из интернета, но IAR выдаёт на них ошибки. Нужны, видимо какие-то библиотеки, ноя пока не пойму какие и где их брать. Ребята выше привели много разных примеров кода, ноя их не понимаю. Буду пробовать разбираться.
-
LPC2368 Прерывание по совпадению таймера, помогите
zaz968m опубликовал тема в ARM, 32bit
Всем здравствуйте! Помогите, пожалуйста, разобраться с прерыванием от таймера0 по совпадению. Только начал осваивать 32 разрядные микроконтроллеры. Есть отладочная плата SK-MLPC1768/2387/2368, с установленным LPC2368. Для обучения пользуюсь IAR 7.50.2.10505 main.txt Вставлял ловушку в бесконечном цикле и проверял 0 бит регистра T0IR. Видно что таймер входит в прерывание (бит устанавливается), но дальше действий программа никаких не выполняет, а должна быть бегущая единица. Как должна работать эта программа ясно, но почему не работает не понятно. Исходник взят из интернета, кроме настройки PLL. PLL настраивается. Проверялось. Подскажите, направьте пожалуйста! -
Аналог транзистора КТ956А
zaz968m ответил zaz968m тема в RF & Microwave Design
Согласен, не каждый КТ956 будет иметь h21=30, но даже если взять минимальный h21=10 для 956, то получается, что с его ft=100MHz граничная частота, на которой будет начинать падать усиление это 10МГц!!! Как раз сюда полностью влазит моя полоса(26кГц-1МГц), даже с десятикратным запасом. На транзиках 2SC5200 (ft=30MHz, h21=60 typ.) и 2N5932 усиление начнёт падать с 500кГц и на 1 МГц я никак не получу 40Вт, т.к. h21 упадёт до 30. И на выходе у меня будет где-то 20Вт вместо 40. Вот такие дела, хоть роди эти транзисторы. -
Аналог транзистора КТ956А
zaz968m ответил zaz968m тема в RF & Microwave Design
Дело в том, что транзистор должен держать h21 стабильно во всём диапазоне (26кГц - 1МГц), а частота ft приводится для h21=1. И тогда получается, даже если взять транзистор 2N5932 (ft=30МГц, h21=60), то граничная частота на которой начинает "гробиться" h21=60 до уровня -3dB от h21 получается 30МГц / 60 = 500кГц. На частоте 1МГц , вообще, h21=30. А транзистор с ft=10MHz и h21=100 это , помоему, уже ближе к УНЧ. -
Аналог транзистора КТ956А
zaz968m ответил zaz968m тема в RF & Microwave Design
Смущает граничная частота передачи тока у этих транзисторов (максимум 30 МГц), в отличие от КТ956А, у которого она (максимум 100 МГц). И чем ещё хорош КТ956А, что у него не один из "электродов"(К, Б, Э) не связан с корпусом. Что упрощает конструкцию усилителя. Спокойно ставлю 2 транзистора на один радиатор не боясь замыканий. -
Аналог транзистора КТ956А
zaz968m опубликовал тема в RF & Microwave Design
Подскажите пожалуйста зарубежный аналог транзистора КТ956А (класный транзюк). Стоят эти транзисторы в выходном каскаде широкополосного (26кГц-1МГц) усилителя мощности на 40Вт с напряжением питания 48В. Начальство требует замены, т.к. их уже не выпускают, сложно найти и стоимость большая. Искал в Google, только находил на небольшие напряжения К-Э (30В, 28В, 12В). Недавно принесли 4 новых транзистора 1991г.в., так 2 из них вообще бракованные оказались (все переходы накоротко). Заранее благодарен.