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

    

Balaganoff

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о Balaganoff

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

    Есть задача подружить bluetooth модуль WT11 c внешним контроллером. Пока еще вникаю в вопрос . Bluetooth модуль WT11-E-HCI. Это означает что он уже содержит HCI стек или его нужно туда еще прошивать ? Прочитал про Bluelab и возможность использования пользовательского ПО на встроенном в WT11 контроллере. Правильно ли я понимаю что такой вариант для данного образца не пойдет. Нужен образец WT11-E-AI с IWRAP стеком? Т.е. с WT11 можно общаться в определенном формате посредством HCI стека? Подскажите с чего начать?
  3. Таймер AT91SAM7A3

    спасибо, теперь стало понятно. Надо было PIO_ASR использовавать, а я получается подключал периферию B , т.е. PWM0 AT91C_BASE_PIOB->PIO_ASR =mask ; AT91C_BASE_PIOB->PIO_PDR =mask; А зачем настраивать на вывод AT91C_BASE_PIOA->PIO_OER? В режиме генерации TIOA вроде бы сам настраивается на работу в качестве выхода. Т.е. я к чему , обязательно ли настраивать каждую нужную функциональную линию периферии в соответствии с ее направлением, т.е. на вход или на выход ? Разве уже выбор периферии сам по себе не явлется указанием какая нога в каком направлении будет работать?
  4. Таймер AT91SAM7A3

    Пытаюсь сгенерировать с выхода 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. Прерывание PIO AT91SAM7A3

    Ух! Все заработало. Сразу хочу сказать большое всем спасибо за помощь, ценные советы и оказанное внимание. Какой же я олух!!! С прерываниями от джостика не получалось,в итоге я параллелно начал работать только с одной ногой 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 AT91SAM7A3

    Прерывания же от 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. Прерывание PIO AT91SAM7A3

    В состоянии покоя на входах джойстика уровни "1" , но эти уровни от встроенных Pull-up резисторов в котроллер. При нажатии на джойстик происходит замыкание входа на "землю".
  8. Прерывание PIO AT91SAM7A3

    При том же исходном тесте , если комментирую в основном тексте программы,после настройки контроллера прерываний строчку AT91C_BASE_AIC->AIC_EOICR = 0 , то в точку останова не попадаю. Если оставляю AT91C_BASE_AIC->AIC_EOICR = 0 , то если запаскаю программу на выполнение -начинает прерываться постоянно вне зависимости от уровня сигнала от джойстика. Ставлю точку на адрес 0x18, попадаю туда, далее пошагово попадаю на IRQ_Handler_Entry, а с нее попадаю на pio_c_irq_handler, далее по коду дохожу до "вечного цикла", причем джойстик я не трогаю, т.е. прервание не инициализирую.
  9. Прерывание PIO AT91SAM7A3

    Подключил <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. Прерывание PIO AT91SAM7A3

    по Адрессу 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. Прерывание PIO AT91SAM7A3

    Не сердитесь, если что не так, я хочу разобраться. Использую 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. Прерывание PIO AT91SAM7A3

    Помогите разобраться, что не так. Хочу разобраться с прерываниями по изменению уровня на 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. книги по ARM7

    Большое спасибо!
  14. книги по ARM7

    Нельзя ли бы было выложить отсканеную книгу еще раз, а то с http://slil.ru/25776230 не сливается. Пишет, что файл поврежден.
  15. Всем спасибо большое за ответы . Проблема решилась. 1. Поменял резисторы на базе на 1 кОм каждый. Напряжение увеличилось до 11 В . Потом заменил транзистор КТ 315 на BC547B (других просто под рукой вообще не было). Напряжение немного увеличилось еще. 2. Один из резисторов 47 кОм заменил на 200 кОм. На выходе стало 19 В !!! 3. Сегодня только добрался до осциллографа. В итоге частота уменьшилась с 250 кГц до 40 кГц . Скважность 2.4. Чтобы все прошло не даром, по этой скудной информации какие выводы можно сделать ?