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

EverGreen_

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. Dog Pawlowa, Скорость не выбирал ,просто использую 9600. АЦП конфигурировал в одноканальный режим с одиночным преобразованием . void InitADC(){ P6SEL = BIT0; ADC12CTL0 = ADC12ON +SHT0_2 +REFON; ADC12CTL1 = SHP+ADC12SSEL_0; ADC12MCTL0 = SREF_1; ADC12IE = 0x01; ADC12CTL0 |= ENC; } Если я вас правильно понял вы предлагаете : использовать только одно прерывания таймера с заданым периодом. Если будут прерывания четные и нечетные ,выходит что период для таймера должен быть в два раза меньше , чем период запуска АЦП.? То есть ,к примеру в четном,только запускаю АЦП .В нечетном по очереди - считываю полученное значение, сразу его отправляю в UART, останавливаю АЦП? Так ? А не будет отсылка байта в UART тормозить обработку прерывания ? можно немного поподробнее ?
  2. Добрый день . Объясните про прерывания UART на передачу . На прием все понятно - если приходит байт в UART , то получается прерывание . А как на передачу? Когда передается байт происходит прерывание ? Для чего это нужно?
  3. Тут назрел другой вопрос. Как правильно организовать измерение с определенной частотой а затем передачу данных ? Я делал так : В прерывании таймера (с определенным интервалом ) запускаю АЦП.В обработке прерывания АЦП заполняю очередную ячейку массива и останавливаю АЦП. Считаю сколько элементов массива я заполнил . Если все , то в основном цикле запихиваю все в UART без прерываний , контролируя лишь доступность буфера . Этот способ хорош ,но количество измерений ограничено размером массива . Хотелось бы с определенной частотой мерять и затем сразу передавать в UART. Я пытался сделать это так В прерывании запускаю АЦП . В основном цикле жду готовности данных , если данные готовы то пытаюсь передать в UART(без прерываний). Но код работает некоректно.Таймер срабатывает не через равные промежутки времени . Но если не передавать данные в UART,то все работает четко. Наверно передача в UART медленна и это тормозит работу всей системы. Наверно нужно использовать прерывания UART ?
  4. Цель - оцифровывать аналоговый сигнал с заданной частотой . Я с этим разобрался - неправильно накладывал маску . Нужно было ADC12CTL0 &= ~ENC a я делал ADC12CTL0 |= ~ENC
  5. Здравствуйте. Пытаюсь запускать АЦП с частотой 50 Гц в прерывании таймера. В прерывании АЦП останавливаю последнее. Если частота запуска 50 Гц и количество измерений 500 то время заполнения массива должно быть около 10 сек . Однако массив заполняется очень быстро - приблизительно за 0.5 сек . Что не так ? Код таймера void InitTimerA() { CCR1 = PERIOD; TACTL = TASSEL_1+ TACLR + MC_2 + TAIE;// Contonios-Up mode, ACLK CCTL1 = CCIS1+CCIE; } #pragma vector = TIMERA1_VECTOR __interrupt void IntTimerA1(void) { switch (TAIV){ case CCR1_IFG: CCR1 = CCR1+665; //проверяем нажата ли кнопка if(!(P6IN&BIT3)){ if(timeout++>=10){ key = 1; P4OUT |= BIT0; timeout = 0; } } //если кнопка была нажата и флаг готовности данных опущен, запускаем ацп if(!data_ready && key) ADC12CTL0 |= ENC + ADC12SC; //*****WATCHDOG***************************** if (TA_Dog==0){TA_Dog=1; P3OUT |= BIT3; } else {TA_Dog=0; P3OUT &= ~BIT3;} //***************************************** _NOP(); break; case CCR3_IFG: break; case CCR4_IFG: break; case TA_IFG: break; } } код прерывания таймера #pragma vector=ADC_VECTOR __interrupt void ADC12(void) { switch (ADC12IV) { case 0x00: break; // No interrupt case 0x02: break; // ADC overflow case 0x06: if(index<NUMBER_OF_MEASURING){ values.adc_value[index++] = ADC12MEM0; }else{ index = 0; data_ready = 1; key = 0; } ADC12CTL0 |= ~ENC; break; } }
  6. Палыч, спасибо вам за совет !! Думаю пока остановится на первом варианте - намерял - передал ,Ведь данные еще нужно еще и обработать , и в протокол засунуть да и количество измерений пока не больше 500 . Но на будущее буду знать.
  7. Здравствуйте Итак ,после нескольких месяцев мучений что то начинает проясняться ! АЦП что то меряет , данные как то передаются отсюда , таймер что то тикает . Дальше , буду уточнять. Сразу хотел задать вопрос : Мне нужно измерять непрерывно с частотой скажем в 50 Гц около 10секунд . Результаты измерений в итоге 2 байтные. То есть нужно будет сформировать буфер AЦП как то так int adc_buff[500] в этом случае размер буфера около 1кБ . А что если нужно будет измерять гораздо дольше,ведь размер OЗУ всего 2 кБ ???
  8. Спасибо за советы , буду разбираться с протоколами,так как еще планируется и передача данных в PC . Практически заработало ,когда установил P3DIR, а также убрал строку IFG1 &= ~UTXIFG0; из первого варианта программы .
  9. И еще хотел спросить. Мне в MK нужно передавать два параметра типа int. Как их отличить между собой при передаче ? К примеру первый параметр частота а второй время .Пока придумал только в PC программе преобразовывать эти числа в сhar , затем подставлять вперед символ 'T' или 'F' , затем в МК преобразовывать обратно в число и записывать в нужный(согласно первому символу )регистр . Может есть какие либо другие варианты ??
  10. rezident , Спасибо! Все заработало!
  11. Спасибо за советы ! Модуль тактирования проинициализировал так BCSCTL1 |= (RSEL0+RSEL1+RSEL2); мне немного непонятна первая строка. Может все таки P3DIR | = BIT4 ?? Ведь Tx висит на P3.4. void main(void) { WDTCTL = WDTPW + WDTHOLD; BCSCTL1 |= (RSEL0+RSEL1+RSEL2); U0CTL |= SWRST; U0CTL &= ~SWRST; P3SEL = 0x30; P3DIR |= BIT4; ME1 |= UTXE0 + URXE0; UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A; IE1 |= URXIE0; while(1){ while ((IFG1 & UTXIFG0)==0); //ждем когда буфер будет готов TXBUF0 = 0x30; // отсылаем символ } } #pragma vector = USART0RX_VECTOR __interrupt void RxD() { volatile char rec_char = RXBUF0; } В этом случае на Tx наблюдается сигнал . Подскажите пожалуйста , чем можно посмотреть те символы что я передаю . Я где то слышал на форуме , вроде от Вас ,rezident , что это можно сделать с помощью программы hyperterminal под Windows .Так же хочется отправить какой нибудь символ в обратную сторону .Объясните пожалуйста как.
  12. Uart обмен данными

    Здравствуйте Имеется 149 кристал ,кварцевый резонатор 32кГц. Пытаюсь отправить потоком один и тот же символ а также читать то что приходит. Результат отправки для начала смотрю осциллографом на ноге Tx , но там постоянно высокий уровень. Также пытаюсь поставить бряк в обработчике прерывания Rx но IAR почему то говорит что там точку останова ставить нельзя и она становится бледно розовой . вот код, в основном из примеров TI . Скажите пожалуйста , что здесь не так void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog P3SEL = 0x30; // P3.3,4 = USART0 TXD/RXD U0CTL = SWRST; ME1 |= UTXE0 + URXE0; // Enabled USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character, SWRST=1 UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x03; // 9600 from 1Mhz UBR10 = 0x00; // UMCTL0 = 0x4A; // Modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt IFG1 &= ~UTXIFG0; // Clear inital flag on POR _EINT(); while(1){ while ((IFG1 & UTXIFG0) == 0); //ждем пока буфер будет свободен TXBUF0 = 0x30; //отсылаем символ } } #pragma vector = USART0RX_VECTOR __interrupt void RxD() { char rec_char = RXBUF0; }
  13. Могу дать программку которая снимает скриншот экрана или активного окна и сохраняет его в BMP. Или выложить код под Visual C :rolleyes: Но причем здесь электроника? :cranky:
  14. Вот за это спасибо !!!Буду разбираться. Тут же вопрос возник , а можно представить подобный алгоритм для программы на PC которая будет принимать эти данные , для полноты картины.Как вообще происходит обмен данными ??
  15. Спасибо за ссылки,кстати среда программирования есть - IAR Это понятно что все просто, но вначале всегда не просто . Не могли бы вы привести последовательность действий ,что бы получить к примеру байт или несколько с данными АЦП контроллера . Я так понимаю что для начала необходимо настроить UART и с со стороны компьютера и стороны контроллера. Что делать дальше?Как передавать данные , как их принимать,где складывать и.тд .
×
×
  • Создать...