Перейти к содержанию
    

zaz968m

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Я, кажется, понял. Выставил в первый бит 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.
  2. zltigo, спасибо! Уже скачал. Проект мой получилось собрать и запустить в Keil. Прерывания от таймера по совпадению заработали. Но! Для этого в проект был включён файл LPC2300.s (startup). В IAR тоже нужно, наверное, типа такого файл подключать? Подскажите?
  3. Да Вы правы, не правильно я выразился, это заголовочные файлы. Спасибо за совет! zltigo, если Вас не затруднит, можете в двух строчках написать, какие базовые понятия С языка нужно изучить прежде всего.
  4. 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 выдаёт на них ошибки. Нужны, видимо какие-то библиотеки, ноя пока не пойму какие и где их брать. Ребята выше привели много разных примеров кода, ноя их не понимаю. Буду пробовать разбираться.
  5. Всем здравствуйте! Помогите, пожалуйста, разобраться с прерыванием от таймера0 по совпадению. Только начал осваивать 32 разрядные микроконтроллеры. Есть отладочная плата SK-MLPC1768/2387/2368, с установленным LPC2368. Для обучения пользуюсь IAR 7.50.2.10505 main.txt Вставлял ловушку в бесконечном цикле и проверял 0 бит регистра T0IR. Видно что таймер входит в прерывание (бит устанавливается), но дальше действий программа никаких не выполняет, а должна быть бегущая единица. Как должна работать эта программа ясно, но почему не работает не понятно. Исходник взят из интернета, кроме настройки PLL. PLL настраивается. Проверялось. Подскажите, направьте пожалуйста!
  6. Согласен, не каждый КТ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. Вот такие дела, хоть роди эти транзисторы.
  7. Дело в том, что транзистор должен держать 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 это , помоему, уже ближе к УНЧ.
  8. Смущает граничная частота передачи тока у этих транзисторов (максимум 30 МГц), в отличие от КТ956А, у которого она (максимум 100 МГц). И чем ещё хорош КТ956А, что у него не один из "электродов"(К, Б, Э) не связан с корпусом. Что упрощает конструкцию усилителя. Спокойно ставлю 2 транзистора на один радиатор не боясь замыканий.
  9. Подскажите пожалуйста зарубежный аналог транзистора КТ956А (класный транзюк). Стоят эти транзисторы в выходном каскаде широкополосного (26кГц-1МГц) усилителя мощности на 40Вт с напряжением питания 48В. Начальство требует замены, т.к. их уже не выпускают, сложно найти и стоимость большая. Искал в Google, только находил на небольшие напряжения К-Э (30В, 28В, 12В). Недавно принесли 4 новых транзистора 1991г.в., так 2 из них вообще бракованные оказались (все переходы накоротко). Заранее благодарен.
×
×
  • Создать...