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

Balaganoff

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

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

  • Посещение

Весь контент Balaganoff


  1. Позиционные обозначения правда не расставлял, плата еще не готова. Хочется услышать советы, так как развожу впервые. 123.zip
  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. Ух! Все заработало. Сразу хочу сказать большое всем спасибо за помощь, ценные советы и оказанное внимание. Какой же я олух!!! С прерываниями от джостика не получалось,в итоге я параллелно начал работать только с одной ногой 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. Прерывание 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. Всем спасибо большое за ответы :a14: . Проблема решилась. 1. Поменял резисторы на базе на 1 кОм каждый. Напряжение увеличилось до 11 В . Потом заменил транзистор КТ 315 на BC547B (других просто под рукой вообще не было:)). Напряжение немного увеличилось еще. 2. Один из резисторов 47 кОм заменил на 200 кОм. На выходе стало 19 В !!! 3. Сегодня только добрался до осциллографа. В итоге частота уменьшилась с 250 кГц до 40 кГц . Скважность 2.4. Чтобы все прошло не даром, по этой скудной информации какие выводы можно сделать ?
  16. Сразу прошу прощение за возможно глупые вопросы. Решил собрать USB отладчик для PIC контроллеров. Помогите, пожалуйста, решить проблему. Проблема в преобразователе 5В ->12 В . По схеме на конденсаторе С12 напряжение у меня всего 9 В ( должно быть 17-21 В).После стабилизатора, естественно, еще меньше. С чем это может быть связано ? Правда с выхода генератора наблюдаю импульсы частоты не 200 (как надо), а 250 кГЦ. И в П- образном фильтре L3 за неимением 1мГн впаял 150мкГн, может из-за этого???
  17. AT91SAM7A3

    мультиплексор 74LS157 однонаправленный, да и питание у него 4,75-5,25 В (много) 4 цифр ключа 74LCX125 тоже однонаправленные. А необходима двунаправленная передача. По поводу линии TX - в даташите в разделе ISO7816 Mode USART написано " The TXD line becomes bidirectional...As the TXD pin becomes bidirectional, its output remains driven by the output of the transmitter but only when the transmitter is active while its input is directed to the input of the receiver" . Мне кажется для этих целей больше подходит двунаправленный ключ CD4066B, но только он на 4 входа/выхода. А вот непонятно, что будет со Smart, если на USART в режиме ISO7816 (TX=прием/передача, SCK=CLK для Smart карты) по входам RX и CTS что-то будет идти от других устройств? Может эти линии в режиме ISO7816 надо отключать ( точно также как отключать SCK=CLK от Smart карты когда USART работает непосредственно как USART) ? Тогда CD4066B не пойдет и надо искать что-то на большее количество линий.....
  18. AT91SAM7A3

    Может немного не в тему, но все же. AT91SAM7A3 поддерживает стандарт работы со СМАРТ картами ISO 7816. Для работы к СМАРТ карте от конроллера необходимо завести двунаправленную линию данных (SIMIO) и сигал CLK. Эти линии мультипликсированы с линими USART. (SIMIO=TX, ну а CLK=CLK ). Все бы хорошо, да вот только все три USART заняты другими устройствами....А необходимо реализовать еще и поддрежку СМАРТ карт. В голову приходит мультипликсирование непосредственно линий USART контроллера с линими UART устройсва и линиями интерфейса СМАРТ карты. Я так понимаю мультиплексировать нужно только TX, а CLK в асинхронном режиме ведь не используется. Выскажите пожалуйста идеи по этому поводу, именно по как реализовать это аппаратно ( специальными ключами?).
  19. Вопрос решился сам , все верно. Прерываение было просто я его зрительно не мог наблюдать. Ведь выход из подпрограммы по уровню "1" на входе INT , а еще до разрешения прерывания эта еденица уже висела. Т.е. прерывалось и сразу выходило, а я визуально не мог его наблюдать.
  20. Места, где портится флаг прерывания исправил. Заработало!!!! Но только когда уровень 0 сохраняется до момента разрешения прерывания. Т.е. нажал кнопку в момент запрета прерывания и жду момента разрешения прерывания, в этом момент оно возникает. Потом возвращаю кнопку в исходное состояние происходит выход из подпрограммы обработки прерывания. Возник новый вопрос. Если в момент запрета прерываний скоммутировать кнопку и вернуть ее в исходное сосстояние (1->0->1 на входе INT), то по идее флаг то все равно выставится в 1 и в момент разрешения прерывания БУДЕТ : GIE=1 , INTE=1 и сам флаг INTF=1, должно прерваться. Но не прерывается почему-то.Возникает ощущения, что к тому что GIE=1 , INTE=1 и INTF=1 должен еще висеть необходимый уровень (Если по спаду прерывание,то уровень 0). Так ли это?
  21. Вроде бы понял и нашел ошибку в коде. Запрещая и разрешая прерывания я портил флаг внешнего прерывания, записывая в его "0" командами clrf IntCon , movlw B'10010000'; movwf IntCon; и снова clrf IntCon . Я хотел проверить как раз тот случай, когда прерываение поступило в момент его запрета, а выполнилось сразу же после разрешения (для этого все это с морганием диодов). А на самом деле получалось, что перед самым разрешением прерываентя я обнулял флаг внешнего прерывания, т.е. даже если оно и было - МК считал, что его оне было. Тем самым прерывание не наступало. Я так понимаю, единственным местом где флаг прерывания необходимо сбрасывать в нуль - это при выходе из подпрограммы обработки прерывания. Код программы в приложении. Вроде бы правильно рассуждаю, если что поправьте. Домой приду сразу же проверю. Заранее благодарен! Preriv.asm.txt
  22. Прерывания на PIC16F628

    НЕдавно начал знакомиться с PIC. Хочу научиться работать с прерываниями. Скажите правильно ли я понимаю и, пожалуйста, подскажите в чем дело. Написал кусок кода, который разбит на 2 части + подпрограмма обрабоки прерываения. 1-ая часть глобально прерывания запрещены. 2-ая часть глобально прерываения разрешены + разрешено прерывание по входу RB0/INT. Прерывание настраиваю по спаду, т.е. из 1 в 0. Инициализирую прерывания путем коммутации 0 двухпозиционной кнопкой (в моем понимании это ключ). Для наглядности подключаю 2 светодиода на RB1 и RB2. RB1 - c определенной частотой мигает - основная часть программы. RB1 =1 - (светодиод горит) - тогда прерывания запрещены (1-ая часть). RB1=0 - (светодиод не горит) - тогда прерывания разарешены (2-ая часть). При уходе в прерываение (нажата кнопка- ключ замкнут) - должен загораться светодиод, подключенный к RB2. При выходе из подпрограммы обработки прерывания светодиод гаснет. Выход из прерывания - при смене на входе RB0/INT уровня из 0 в 1 (кнопка нажата снова - ключ разомкнут). Дело в том, что если нажата кнопка в момент разрешения прерываний ( светодиод на RB1 не горит), то все работает как надо, т.е. загорается светодиод на RB2 (уход прерывание) и горит до тех пор, пока кнопка не возвращена в исходное положение. Но вот когда кнопка нажата в момент запрещения прерываения (светодиод на RB1 горит), в момент, когда он на RB1 гаснет - прерывание почему-то не следует, т.е. не загоратется светодод на RB2. Т.е. я так понимаю. Если кнопка нажата в момент разрешения прерываения (переход из 1 в 0) - то без вопросов произходит уход в прерываение. Если кнопка нажата когда прерываения запрещены (переход из 1 в 0) - то два варианта: а) Если 0 провисит до момента когда прерывания разрешены (собственно как я и хочу зымыкаю ключ и жду когда загорится светодиод на RB2) - дожно произойти прерываения. (У меня его почему-то нет???? В этом вся проблема. Не понимаю почему...) б) Если нет (кнопку нажали и вернули еще раз, т.е 1->0->1) то прерывания не должно последовать. И еще, когда разрешаю прерывения всегда, т.е. неважно горит или не горит светодиод на RB1 - то все работает, т.е. уходит в прерываение. Объясните, пожалуйста, в чем трабл. Может я что не так понимаю? Текст программы в данным момент прикрепить не могу (с собой просто не имею), прикреплю по возможности как тока так сразу. Про дребезг контактов слышал, пытаюсь с ним бороться не программно, а при помощи схемы (На рисунке - вариант д, т.е на неинвертирующем логическом элементе) Контроллер PIC16F628. Заранее благодарен.
  23. Необходимо произвести расчет ремонтопригодности электронного блока, состоящего из элементов приведенных в спецификации. Подскажите, пожалуйста, методики, алгоритмы проведения такого расчета. Или ссылки на ГОСТЫ, где бы можно было посмотреть(желательно в эле виде). Есть документ "Аппаратура радиоэлектронная бытовая. Показатели и оценка ремонтопригодности и контролепригодности", но никак не могу найти где его скачать.....
×
×
  • Создать...