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

vdik

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

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

  • Посещение

Репутация

0 Обычный

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

  • День рождения 12.03.1984

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Сейчас вот разбираюсь с SPI, чтоб не плодить темы, спрошу здесь :). Составляю УСЛОВИЕ ГОТОВНОСТИ SPI к передаче-приему, как должен выглядеть статус-регистр (SPI_SR)? Первое, что пришло в голову - это TXEMPTY==1 (регистр и буфер передачи пусты), но так не срабатывает (видимо при начальной загрузке здесь=0). Далее, пришел к такому: TXBUFE == 1 --- буфер-передатчик опустошен RXBUFF == 0 --- буфер-приемник не заполнен TDRE == 1 --- регистр для передачи пуст RDRF == 0 --- регистр приема не заполнен но почему-то работает при RXBUFF == 1 (остальные 3 условия без изменений). Как наиболее полно должно выглядеть условие готовности SPI, чтоб в нем точно ничего нету, можно запускать передачу-прием ?
  2. и это не мудрено что намудрил))) ... надо б мне теорию МК чтоль серьезно поучить. Присоединяю модуль с таймером, как он есть. Взял его из проекта "AT91SAM7S-Interrupt_SAM7S" с сайта at91.com; своего добалено в нем совсем чуть-чуть, изменен приоритет таймера, отключен таймер1. Обработчик ацп .. впринципе, он уже в предыдущих сообщениях, но ладно, тоже присоединю, но там уже больше отсебятины)) *** таймер реально работает медленнее (реже выполняются действия) -- если включено "ADC_StartConversion" не в таймере, а в прерывании ацп. ..... вот ... подумал тут))) .. в том же проекте есть пример организации других прерываний, заложены в модуле "main.c" (тоже прикреплю его, только не свой, а с оригинального объекта) -- там они с начала main до вызова "timer_init" - без этого всё работает, я у себя сие отключил, решив, что там лишь настраиваются дополнительные прерывания, которые мне не нужны. Вот здесь быть может я ошибся! (строчку ниже "AT91F_AIC_Trig(pAic,AT91C_ID_SYS);// generate software interrupt" -- тоже отключил) **мда .. получается, что сейчас я предлагаю копаться в чужом коде,,, мрак вот это сейчас я вобще слабо представляю как)) main_adc_timer.rar
  3. нашел ошибку, но что-то забыл отписаться здесь, а вдруг кто еще такое будет искать :)? вот моя .. кажется конечная организация работы с АЦП на AT91SAM7S256 *да, до этого упустил "AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_ADC)" :) void Init_ADC(){ //Инициализация АЦП pADC= AT91C_BASE_ADC; //используемый adc AT91F_ADC_SoftReset(pADC); AT91F_ADC_CfgPMC();//AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_ADC ); //заводим АЦП AT91F_ADC_CfgModeReg(AT91C_BASE_ADC,ADC_Mode); //с этими установками AT91F_ADC_DisableChannel(pADC, 0xff); //деактивация всех каналов ADC AT91F_ADC_EnableChannel(pADC, ADCCH_Use); //активация нужных нам каналов ADC AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_ADC, ADC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ADC_interrupt_handler); AT91F_ADC_EnableIt(pADC,ADCCH_Use); //активизируем прерывание по окончании преобразования нужных каналов AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_ADC); //теперь АЦП готов, для запуска преобразования вызвать AT91F_ADC_StartConversion(pADC); } void ADC_interrupt_handler(void){ //обработка прерывания, вызываемая по окончанию преобразования АЦП myvar = AT91F_ADC_GetConvertedDataCH4(pADC); //AT91F_ADC_StartConversion(pADC); //постоянно преобразовывать, зациклить } только вот, появлялась еще такая проблема - если запускать преобразование сразу после завершения (зациклить), то это видимо занимает много машинного времени)): если приоритет таймера ниже ацп - таймер "медленнее" работает, если же наоборот или равны - ацп не работает почти --- решил это только тем, что стартую преобразование ацп из таймера, из расчета примерно каждую 1мс, и приоритет ацп выше .... странно, как это у меня на ATMega8 получалось без таких заморочек?:)) .. здесь вроде МК сильнее).
  4. другие прерывания происходят (usart, timer), значит глобально разрешено. ... или тут есть другое глобальное разрешение?)) **чесстно, даже не удобно спрашивать такую банальщину на форуме, где все реально продвинутей меня по теме :rolleyes:
  5. Поскольку опыт программирования МК-ров у меня на данный момент очень мал, и никакой сверхзадачи данная проблема не представляет - почти уверен, что я не учел какую-то банальную вещь. Итак, не удается запустить на плате с at91sam7s256 прерывание по окончанию преобразования ADC. Везде в сети встречаю примеры наподобие такой работы с АЦП: AT91F_ADC_StartConversion (AT91C_BASE_ADC); //старт преобразования while (!((AT91F_ADC_GetStatus (AT91C_BASE_ADC)) & (1<<AT91C_ADC_CH0))); //подождать, пока преобразуется AT91F_ADC_GetConvertedDataCH0; //закончилось преобразование - получить данные в таком варианте работает - стартует, преобразует, получает данные. Но, надо по нормальному сделать так: .... AT91F_ADC_StartConversion (AT91C_BASE_ADC); // вызов преобразования откуда-то из глубин кода .... void ADC_interrupt_handler(void){ //прерывание, вызываемое по окончанию преобразования АЦП var = AT91F_ADC_GetConvertedDataCH4 (pADC); } мой код: void Init_ADC(){ //Инициализация Ацп pADC= AT91C_BASE_ADC; AT91F_ADC_SoftReset(pADC); //AT91F_ADC_CfgPIO(); //может это и не надо? - с ним, без него пробовал AT91F_ADC_CfgPMC();// это то же, что и AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_ADC ); //заводим АЦП AT91F_ADC_CfgModeReg(AT91C_BASE_ADC,ADC_Mode); //с этими установками AT91F_ADC_DisableChannel(pADC, 255); //деактивация всех каналов ADC AT91F_ADC_EnableChannel(pADC, ADCCH_Use); //активация нужных нам каналов ADC AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_ADC, ADC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_POSITIVE_EDGE, ADC_interrupt_handler); AT91F_ADC_EnableIt(pADC,ADCCH_Use); //активизируем прерывание по окончании преобразования нужных каналов каналов AT91F_ADC_StartConversion(pADC); } /* примечание - ADC_Mode определяется так: TRGEN (0x0) // Software triggering TRGSEL (0x0) // Without effect LOWRES (0x0) // 10-bit result output SLEEP (0x0) // Normal Mode mck_clock 48 // in MHz adc_clock 5 // in MHz startup_time 21 // in us sample_and_hold_time 800 //700 in ns PRESCAL ((unsigned int) mck_clock/(2*adc_clock) - 1) STARTUP ((unsigned int) adc_clock*startup_time/8 - 1) SHTIM ((unsigned int) adc_clock*sample_and_hold_time/1000 - 1) //(0x3) ADC_Mode ((SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) | (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN )) */ void ADC_interrupt_handler(void){ //не вызывается!!! //здесь некоторые действия, кои должен совершить, и я сразу увидеть, что попалъ сюда } пробую пока только на одном ADC (4)
  6. Спасибо огромное всем за советы!!! :) .. пока что глюки исчезли - подключили нашу плату к свободному "Корневому USB концентратору", до этого он висел на одном с мышой))) :07: очень странно, не верится что подключение к одному "корню"USB может вызывать столь серьезные проблемы .. так что может это пока только видимость , может вскоре всё вернётся))))) .. да, мамка могла сгореть и от другого, нет никаких подтверждений связи меж перегрузом и отказом мамки
  7. вот такая убийственная проблема: Соединяем плату с AT91SAM7S256 к компьютеру через USB - компьютер перезагружается, но не каждый раз, и начинает перегружаться после первых 20-40 соединений. Сожжена материнская плата :01: . На другом компьютере тоже стал перегружаться, так что эксперементировать в том же духе не хочется. Еще один момент - если при перезагрузке не отсоединить USB, то перегружается по кругу. Питание платы выключено. Соединяли через USB-хаб - не помогало (а точнее сперва соединялось, потом вобще перестало). :smile3046: Ни у кого знакомых предположений о причине сего нет. Единственное - может с драйвером что? драйвер установлен с SAM-BA 1.7, может есть другие его варианты, не знаю ... Кто-нибудь сталкивался с такой проблемой? Нашли причину? А может даже её решение? ;) - поделитесь, пожжжалуйста :santa2:
  8. Сам я не местный :), к электротехнике имею отдаленное отношение, занимаюсь другим программированием. Но вот потребовалось работать с микроконтроллером ====AT91SAM7S256====. Раньше пробовал программить ATMega, но там у меня была "рыба", то есть код "пустой" программы со всеми настройками, а к этому МК нет, в чем и проблема. Нашел в сети проект, вроде бы то что надо (прикрепляю его сюда, может кто ещё ищет), но что-то мне подсказывает, что есть варианты и получше и покрасивее :) --- например, для USART нашел момент, когда ловится полученный байт, и не нашел момента завершения отправления байта .. и кстати переключения решимов отправки-приема тож не видел,,, может я просто слеп и не нашел, да :01: Сам понимаю, что эту самую "рыбу" кодили уже много тыщ раз те, кто занимается этим. Так что надеюсь на помощь спецов :). Итак, что за рыба требуется мне: Инициализация: - Процедура настройки самого МК для начала работы - --//-- таймера 1 штука - --//-- USART 1 штука (будет туда-обратно связь по rs485) - --//-- АЦП 1 штука Результирующие процедуры: - момент срабатывания Таймера - получения Байта - завершения отправления Байта - завершения преобразования АЦП ну, вроде того подобного :) .... желательно еще с некого ШИМ (с которым пока вобще не знаком) ... и пример записи "1" на ножку со светодиодом :) (хотя с этим разберусь и сам как-нить))))) ) ... кстати, может лучше тему положить не "В помощь начинающему", а в "Микроконтроллеры ARM" ? :rolleyes: Sam7s256.zip
×
×
  • Создать...