Jump to content

    

Balaganoff

Участник
  • Content Count

    23
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Balaganoff

  • Rank
    Участник
  1. Позиционные обозначения правда не расставлял, плата еще не готова. Хочется услышать советы, так как развожу впервые. 123.zip
  2. WT11

    Есть задача подружить bluetooth модуль WT11 c внешним контроллером. Пока еще вникаю в вопрос . Bluetooth модуль WT11-E-HCI. Это означает что он уже содержит HCI стек или его нужно туда еще прошивать ? Прочитал про Bluelab и возможность использования пользовательского ПО на встроенном в WT11 контроллере. Правильно ли я понимаю что такой вариант для данного образца не пойдет. Нужен образец WT11-E-AI с IWRAP стеком? Т.е. с WT11 можно общаться в определенном формате посредством HCI стека? Подскажите с чего начать?
  3. спасибо, теперь стало понятно. Надо было PIO_ASR использовавать, а я получается подключал периферию B , т.е. PWM0 AT91C_BASE_PIOB->PIO_ASR =mask ; AT91C_BASE_PIOB->PIO_PDR =mask; А зачем настраивать на вывод AT91C_BASE_PIOA->PIO_OER? В режиме генерации TIOA вроде бы сам настраивается на работу в качестве выхода. Т.е. я к чему , обязательно ли настраивать каждую нужную функциональную линию периферии в соответствии с ее направлением, т.е. на вход или на выход ? Разве уже выбор периферии сам по себе не явлется указанием какая нога в каком направлении будет работать?
  4. Пытаюсь сгенерировать с выхода TIOA1 AT91SAM7A3 импульсы от таймера TC1 в режиме WAVSEL = 10 (считает от 0 до RC и опять сбрасывается в 0). По достижению значения счетчика значения регистра RA на выводе TIOA1 должен устанавливаться высокий уровень, по достижению значения RC (RC>RA) на TIOA1 должен быть низкий уровень. Параллельно,чтобы видеть что таймер работает разрешаю прерывания от таймера TC1 по достижению значения RC. В обработчике моргаю светодиодом. Так вот, светодиод моргает, период тот, что надо. А вот на ноге TIOA1 висит "0" . Ч Может не правильно линии выбираю ???, но вроде бы так. mask = AT91C_PB14_TIOA1 | AT91C_PB15_TIOB1 | AT91C_PB10_TCLK1 ; AT91C_BASE_PIOB->PIO_PDR =mask; // запр PIO AT91C_BASE_PIOB->PIO_BSR =mask ; // подкл к пер B Хотя возникает вопрос , если ,например,линия PB14 мультиплексирована с таймером,ADC,PWM, т.е. ADC0_AD0/PWM0/TIOA1/PB14, то при вышеописанных действиях как определить какая именно периферия подключена. Вот код void timer_init ( void ) { unsigned int mask; mask= TC_CLKS_MCK32 | AT91C_TC_WAVE | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_ACPA_SET | AT91C_TC_ACPC_CLEAR; AT91F_TC_Open(AT91C_BASE_TC1,mask,AT91C_ID_TC1); AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,tm1_per_irq_handler); AT91C_BASE_AIC->AIC_EOICR = 0; __enable_interrupt(); AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // разр прерыв на уровне TC1 по достижению RC AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1); // разр прерывания на уровне AIC AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; // сброс и запуск TC1 } void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) { unsigned int mask; mask = AT91C_PB14_TIOA1 | AT91C_PB15_TIOB1 | AT91C_PB10_TCLK1; AT91C_BASE_PIOB->PIO_PDR =mask; // запр PIO AT91C_BASE_PIOB->PIO_BSR =mask; // подкл к пер B AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ); TC_pt->TC_CCR = AT91C_TC_CLKDIS; //* Disable the clock and the interrupts TC_pt->TC_IDR = 0xFFFFFFFF; AT91C_BASE_TC1->TC_RA=0x7FFF; // загр RA AT91C_BASE_TC1->TC_RC=0xFFFE; // загр RC TC_pt->TC_SR; //* Clear status bit TC_pt->TC_CMR = Mode; //* Set the Mode of the Timer Counter TC_pt->TC_CCR = AT91C_TC_CLKEN; //* Enable the clock }
  5. Ух! Все заработало. Сразу хочу сказать большое всем спасибо за помощь, ценные советы и оказанное внимание. Какой же я олух!!! С прерываниями от джостика не получалось,в итоге я параллелно начал работать только с одной ногой PIOB2, чтобы последовательно и наглядно без всяких там масок типа SW4_MASK все разобрать (благо все пины они введены на колодку ). В итоге что-то комментарил , что разкомментарил , а обработчик был один для двух версий программ!!! В конце его сброс регистра статуса dummy =AT91C_BASE_PIOA->PIO_ISR, но я то-работал уже c PIOB. Т.е. я думаю было так, я коротил PIOB2 на землю с влюченной подтяжкой, наступало прерывание как и должно быть,но в конце програмым обработки нужный регистр статуса не сбрасывался. И получается вновь вход в перрывание и так постоянно. В итоге исправил dummy =AT91C_BASE_PIOA->PIO_ISR, на dummy =AT91C_BASE_PIOB->PIO_ISR Так по памяти, может еще что где исправлял, но вроде бы так было.
  6. Прерывания же от PIO считаются внутренними, а "значения активных уровней внутренних прерываний для пользователя не имеют значения" . Там только 1.AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ( поле SRCTYPE регистра AIC_SMR0[n] =0). В этом случае прерывается постоянно даже без его инициализации джойстиком . 2.AT91C_AIC_SRCTYPE_POSITIVE_EDGE (поле SRCTYPE регистра AIC_SMR0[n] =1). В этом случае в этом случае прерывания не наступает ни при каких действиях . 3.AT91C_AIC_SRCTYPE_HIGH_LEVEL (поле SRCTYPE регистра AIC_SMR0[n] =2) . Как в п 1. 4.AT91C_AIC_SRCTYPE_POSITIVE_EDGE поле SRCTYPE регистра AIC_SMR0[n] =3) . Как в п.2.
  7. В состоянии покоя на входах джойстика уровни "1" , но эти уровни от встроенных Pull-up резисторов в котроллер. При нажатии на джойстик происходит замыкание входа на "землю".
  8. При том же исходном тесте , если комментирую в основном тексте программы,после настройки контроллера прерываний строчку AT91C_BASE_AIC->AIC_EOICR = 0 , то в точку останова не попадаю. Если оставляю AT91C_BASE_AIC->AIC_EOICR = 0 , то если запаскаю программу на выполнение -начинает прерываться постоянно вне зависимости от уровня сигнала от джойстика. Ставлю точку на адрес 0x18, попадаю туда, далее пошагово попадаю на IRQ_Handler_Entry, а с нее попадаю на pio_c_irq_handler, далее по коду дохожу до "вечного цикла", причем джойстик я не трогаю, т.е. прервание не инициализирую.
  9. Подключил <intrinsics.h> и вставил функцию __enable_interrupt(). Вот текст программы void pio_c_irq_handler ( void ) { int dummy; count_int_pio++; AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); delay_t (2000000); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2); delay_t (2000000); dummy =AT91C_BASE_PIOA->PIO_ISR; dummy=AT91C_BASE_AIC->AIC_ISR; dummy=AT91C_BASE_AIC->AIC_IECR; } void main( void ) { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ); AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_CfgInput(AT91C_BASE_PIOA, SW4_MASK); AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_PIOA,PIO_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler); AT91C_BASE_AIC->AIC_EOICR = 0; __enable_interrupt(); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW4_MASK); AT91F_AIC_EnableIt (pAic, AT91C_ID_PIOA); for (;;) { } } Вот, то что в окне дизасемблерра IRQ_Handler_Entry: 00000090 E24EE004 SUB LR, LR, #0x4 00000094 E92D4000 STMDB SP!, {LR} 00000098 E14FE000 MRS LR, SPSR 0000009C E92D4000 STMDB SP!, {LR} 000000A0 E92D0001 STMDB SP!, {R0} 000000A4 E59FE048 LDR LR, [PC, #+72] ; [_?2 (0xF4)] =AIC_SMR (0xFFFFF000) 000000A8 E59E0100 LDR R0, [LR, #+256] 000000AC E58EE100 STR LR, [LR, #+256] 000000B0 E321F013 MSR CPSR_c, #0x13 000000B4 E92D500E STMDB SP!, {R1,R2,R3,R12,LR} 000000B8 E1A0E00F MOV LR, PC 000000BC E12FFF10 BX R0 000000C0 E8BD500E LDMIA SP!, {R1,R2,R3,R12,LR} 000000C4 E321F092 MSR CPSR_c, #0x92 000000C8 E59FE024 LDR LR, [PC, #+36] ; [_?2 (0xF4)] =AIC_SMR (0xFFFFF000) 000000CC E58EE130 STR LR, [LR, #+304] 000000D0 E8BD0001 LDMIA SP!, {R0} 000000D4 E8BD4000 LDMIA SP!, {LR} 000000D8 E16FF00E MSR SPSR_cxsf, LR 000000DC E8FD8000 LDMIA SP!, {PC}^ AT91F_Default_FIQ_handler: 000000E0 EAFFFFFE B AT91F_Default_FIQ_handler; 0xE0 AT91F_Default_IRQ_handler: 000000E4 EAFFFFFE B AT91F_Default_IRQ_handler; 0xE4
  10. по Адрессу irgvec : 0x18 содержится IRQ_Handler_Entry ; IRQ 0x90 по IRQ_Handler_Entry: 0x90 SUB LR,LR, #0x4 Это наверное и есть обработчик, А почему нет разрешения прерываний, ведь // настроили прерывания,указали обработчик AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_PIOA,PIO_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler); // разрешили прерывания от маски SW4_MASK PIOA AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW4_MASK); // разрешили прерывания для контроллера прерываний от периферии AT91C_ID_PIOA AT91F_AIC_EnableIt (pAic, AT91C_ID_PIOA);
  11. Не сердитесь, если что не так, я хочу разобраться. Использую JTAG SAM-ICE Segger + кит на AT91SAM7A3 + IAR 4.42A . Окно с регистрами контроллера прерываний было, открыто,закрыл, все равно... Флаги прерываний AIC и PIO сбросил вручную. менял AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL на AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE . Все тоже. Объясните,пожалуйста,как все это происходит Я не назначаю вручную адресс обработчика прерывания.Я так понимаю это должно делаеться автоматически. При возникновении прерывания от PIO,если оно разрешено, автоматом читается вектор прерывания AIC_IVR и возвращается значение адресса обработчика соответсвующего прерывания, который должен сидеть AIC_SVR[AT91C_ID_PIOA] для прерывания от PIO. А как посмтотреть что сидит на векторе исключения, как осуществляется переход по адрессу из контроллера прерываний?
  12. Помогите разобраться, что не так. Хочу разобраться с прерываниями по изменению уровня на PIOA, прерывание должно наступать по нажатию джойстика. Код брал из примера,немного переработав для удобства. Не входит в прерывание и все тут. void main (void) { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ); AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ); AT91F_PIO_CfgInput(AT91C_BASE_PIOA, SW3_MASK | SW4_MASK); AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_PIOA, PIO_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, pio_c_irq_handler); AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW4_MASK); //* set the interrupt by software AT91F_AIC_EnableIt (pAic, AT91C_ID_PIOA); for (;;) {} } // обработчик void pio_c_irq_handler ( void ) { int dummy; count_int_pio++; AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED2); delay_t (2000000); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED2); delay_t (2000000); dummy =AT91C_BASE_PIOA->PIO_ISR; }
  13. Большое спасибо!
  14. Нельзя ли бы было выложить отсканеную книгу еще раз, а то с http://slil.ru/25776230 не сливается. Пишет, что файл поврежден.
  15. Всем спасибо большое за ответы :a14: . Проблема решилась. 1. Поменял резисторы на базе на 1 кОм каждый. Напряжение увеличилось до 11 В . Потом заменил транзистор КТ 315 на BC547B (других просто под рукой вообще не было:)). Напряжение немного увеличилось еще. 2. Один из резисторов 47 кОм заменил на 200 кОм. На выходе стало 19 В !!! 3. Сегодня только добрался до осциллографа. В итоге частота уменьшилась с 250 кГц до 40 кГц . Скважность 2.4. Чтобы все прошло не даром, по этой скудной информации какие выводы можно сделать ?