|
MSP430 - снова вопросы от чайника, Вопросы от чайника про MSP и магнитный компас |
|
|
|
Jul 23 2008, 19:17
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
 Здравствуйте. Кто читал предыдущую мою тему "MSP430 - вопросы от чайника", тот поймет - это снова я  Тему закрыли, слишком долго висела. А вопрсов все больше. Если кому-то вдруг окажется не влом разбираться, то Вот кусок проги: int flag;//глобальные переменные int cindex; испульзуемые функции(write_flash - пишет число во flash, read_flash - считывает) void write_flash(float* value, float *addr) { while(FCTL1 & BUSY); _BIC_SR(GIE); FCTL1 = FWKEY + ERASE; FCTL3 = FWKEY; *addr = 0; while(FCTL1 & BUSY); FCTL1 = FWKEY + WRT; for (int i=0;i<=3;i++) { *addr = value[i]; addr++; } _BIS_SR(GIE); while(FCTL1 & BUSY); FCTL1 = FWKEY; FCTL3 = FWKEY + LOCK; } void read_flash(float* addr, float* pfO) { for (int i=0;i<=3;i++) { pfO[i]=*addr; addr++; } } Чего хочу сделать - Если присылаю 0, то должны считаться два показания с выводов P6.3 и P6.4, присылается 0хАА - т.е. "считалось", записываются первые элементы двух массивоы данных. Когда набирается по четыре элемента, индекс сбрасывается Если присылаю 0xFF, то должна выполнится функция calibrovka_hmc, если она выполняется неверно, то присылается 0хСС, иначе из flash считывается и присылается вычисленная с помощью этой функции константа. Внутри функции main ADC12CTL0 = ADC12ON + REFON + SHT0_8; //настройка АЦП ADC12CTL1 = CSTARTADD0 + CSTARTADD1 + ADC12SSEL_1+ CONSEQ_1; ADC12MCTL3 = INCH_3; ADC12MCTL4 = INCH_4 + EOS; float temp[4]; flag=0; cindex=0; for(;;) { for(delay = 0; delay <20000; delay++); if( flag==0 ) {send_int(0x0); } if( flag==1 ) { if (calibrovka_hmc(CVx, CVy, temp)==0)//calibrovka_hmc - имеет параметрами два массива и вычисляет четыре константы(нужные для калибровки устройства) { send_int(0xCC); flag=0; } else { float pfO[4]; read_flash((float*)0x1000,pfO); r=(int)(pfO[0]+0.5); send_int®; flag=0; } flag=4; } if (flag==2) { ADC12CTL0 |=ADC12SC + ENC; CVx[cindex] = ADC12MEM3; CVy[cindex] = ADC12MEM4; ADC12CTL0 &= ENC; cindex++; send_int(0xAA); flag=0; } if (cindex>3) cindex=0; } } #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx ( void) { if( RXBUF0==0xFF) flag = 1; if (RXBUF0==0x0) flag = 2; } В ЧЕМ ПРОБЛЕМА: Перед выполнением калибровки присылаю элементы массива, полученного при считывании показаний с выводов, - оказывается, что в массив записываются по два-три раза одно значение, хотя этого не может быть. Соответственно, из-за этого не работает и все остальное Может, неправильно настроен АЦП? Или в чем может быть дело? И, если кому-то вдруг не влом разбираться - функции записи во flash и чтения flash - можно ли сделать как-то поумнее?
|
|
|
|
|
 |
Ответов
|
Aug 12 2008, 23:30
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Daria, извините за откровенность, но у вас какой-то бред получается  Вы вообще понимаете суть и механизм работы прерываний? Я не знаю вашего возраста и семейного статуса, но надеюсь что "детская" ассоциация разъяснения сути прерываний будет вам понятна. Представте себе, что вы - мама. Сидите на лавочке с подругой и беседуете. Рядом в песочнице ковыряется и бегает возде нее ваш малыш. И вот в произвольный момент времени малыш подбегает к вам и, прерывая ваш разговор с подругой, спрашивает: "мама, а правда, что море мокрое?" "Правда", отвечаете вы. Малыш, удовлетворенный ответом, убегает, а вы возвращаетесь к разговору с подругой. Через некоторое (опять недетерменированное время) малыш снова подбегает к вам и, прерывает разговор, очередным вопросом: "мама, а небо голубое?" "Конечно голубое, сынок. Подними голову и убедись сам", отвечаете вы. Малыш, задрав высоко голову, долго рассматривает проплывающие в голубом небе облака, а вы по-прежнему продолжаете отложенный разговор с подругой. Такая аналогия вам понятна?  Развиваю мысль дальше. Запрет прерываний. "Сынок, перестань отвлекать маму вопросами. Дай маме с тетей спокойно поговорить." Разрешение прерываний. "Сынок, у тебя там все нормально? Никто тебя не обижает? Ну если что-то случится сразу беги ко мне и скажи." Тот исходник, что вы привели можно переложить на детский сюжет так. Мама, вместо того, чтобы разговаривать с подругой, отпускает малыша в песочницу и внимательно следит, чтобы он не упал и не перепачкался. Как только ребенок падает, она, отряхнув его одежду, говорит: "Ну вот, смотри как ты перепачкался! Не ходи больше в песочницу, поиграй рядом с мамой, пока я с этой тётей побеседую". Усадив ребенка рядом, продолжает беседу. А эта аналогия понятна? Вы запускаете преобразование АЦП и, не выходя из прерывания, ждете окончания преобразования и установки бита готовности. Спрашивается ЗАЧЕМ?  Факт возникновения прерывания УЖЕ является свидетельством о том, что преобразование выполнено и в регистре ADC12MEMx находится готовое значение. После перехода по вектору прерывания вам нужно только считать это значение и при необходимости (пере)запустить или остановить цикл последующих преобразований АЦП. Ждать готовности преобразования, находясь прямо в прерывании нет никакой необходимости! По структуре всей программы. У вас есть основной цикл, где вы что-то там вычисляете, усредняете и при необходимости передаете наружу. У вас есть таймер, по которому вычисляются временные интервалы и идет управление переключением выходного сигнала и работой АЦП. Работа таймера происходит асинхронно (НЕсинхронно) работе основного цикла. АЦП в принципе тоже работает асинхронно и основному циклу и таймеру, но запуск цикла преобразований АЦП происходит синхронно с таймером. Поэтому запуск АЦП после переключения выходного сигнала должен производится из таймерного прерывания. А останов уже в прерывании АЦП. Обмен между прерываниями и основным циклом можно реализовать посредством семафоров (флагов). В прерывании устанавливается семафор, сигнализирующий. например, о том, что цикл измерений был завершен. В основном цикле этот семафор постоянно опрашивается и как только обнаруживается, что он установлен, результаты измерения обрабатываются, а семафор завершения цикла измерений сбрасывается. Таким образом производится взаимодействие асинхронных процессов. Ну насчет буферов, как средства синхронизации потоков данных для асинхронных процессов, по-моему вы уже знаете. И еще просьба. Оформляйте, пожалуйста, ваш текст исходников в теги code. Это такая решеточка  над полем редактирования сообщения. Так сохраняются все отступы и код получается более удобным для восприятия.
|
|
|
|
|
Aug 13 2008, 17:06
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Aug 13 2008, 03:30)  Rezident, циклы while совершенно случайно оказались в прерывании! Просто копировала и ... дело было вечером...  Так что совершенно зря разразились такой тирадой  Впрочем, не зря, долго еще могла не заметить. А история про маленького мальчика - супер.  Но - запрещение прерываний в прерывании таймера и АЦП делаю осознанно  , при переключении вывода должен пройти переходной процесс, прежде чем можно разрешать преобразование АЦП. Так что переключение вывода и старт АЦП должны совершенно точно делаться в разные моменты времени. Такие дела. А вообще - как всегда, спасибо
|
|
|
|
|
Aug 14 2008, 08:09
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Ух-х, какие крутые виражи! Ух, как человека мысли колбасят: Цитата( @ Aug 13 2008, 23:06)  ... Так что совершенно зря разразились такой тирадой  И сразу же, не давая осознать -- ба-бах! Цитата Впрочем, не зря, ... Rezident -- восхищаюсь Вашим терпением. Буду счастлив, если даму удастся выдернуть из девичьего восприятия мира. Да, длинный путь предстоит, долго ей топать. Но, человека надо вытаскивать. Тем более, сам чел этого хочет. Daria, не останавливайтесь на полпути! Мы все за Вас переживаем и хотим получить полноценного товарища. Глупой Вас никто не считает, просто склад ума/логика мышления у Вас несколько иные. Это не плохо и не хорошо, это -- просто имеет быть. "Не важно -- кто ты и где ты сейчас. Важно -- куда ты живешь" (С) не помню чье. Всех благ!
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 14 2008, 20:47
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(zhevak @ Aug 14 2008, 12:09)  Rezident -- восхищаюсь Вашим терпением. Буду счастлив, если даму удастся выдернуть из девичьего восприятия мира. Да, длинный путь предстоит, долго ей топать. Но, человека надо вытаскивать. Тем более, сам чел этого хочет. Я сама восхищаюсь его терпением  Я бы себя уж давно послала, причем с громкими выкриками Цитата(zhevak @ Aug 14 2008, 12:09)  Daria, не останавливайтесь на полпути! Ну не знаю, не знаю. мы женщины все такие непоследовательные - то почитать, то пострелять... Цитата(zhevak @ Aug 14 2008, 12:09)  Мы все за Вас переживаем Надеюсь, аппетит не пропал? Цитата(zhevak @ Aug 14 2008, 12:09)  Всех благ! И Вам!! Спасибо за мнение Rezident, по поводу буфера, пример которого вы приводили. А что, если cbuf.rIdx будет равен cbuf. wIdx +1? Т.е. если считывание "обгонит" запись? Может, стоит поверять if((cbuf.cntr< max_bufsize)&(cbuf.rIdx !=cbuf. wIdx +1))? Или опять мойс клад ума/логика мышления меня подвел?  тогда - ой, беда, беда - огорчение.
|
|
|
|
|
Aug 14 2008, 21:01
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Aug 15 2008, 02:47)  Rezident, по поводу буфера, пример которого вы приводили. А что, если cbuf.rIdx будет равен cbuf. wIdx +1? Т.е. если считывание "обгонит" запись? Может, стоит поверять if((cbuf.cntr< max_bufsize)&(cbuf.rIdx !=cbuf. wIdx +1))? Или опять мойс клад ума/логика мышления меня подвел?  тогда - ой, беда, беда - огорчение. Вы про циклический буфер? Считывание не может обогнать запись, т.к. перед считыванием должен проверяется счетчик записей. Если счетчик равен нулю, то буфер пуст. А если при этом имеется "разбег" индексов, то его нужно обнулить, установив оба индекса в начало буфера. Только при этом конечно же нужно соблюдать атомарность доступа, чтобы не произошло сбоев записей при одновременном доступе к переменным индексов и счетчика. Атомарность доступа можно обеспечить временным запретом прерываний. В дополнение. Ситуация когда cbuf.rIdx будет равен cbuf. wIdx +1 не исключена. Но она может быть только в случае, когда весь буфер заполнен. При этом счетчик элементов буфера должен иметь значение равное размеру буфера. Хотя пожалуй нет. Я ошибся. Счетчик в этом случае будет равен размер_буфера-1. Т.к. для полностью заполненного (и для пустого) циклического буфера значения индексов д.б. равны.
|
|
|
|
|
Aug 17 2008, 11:13
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Ага, будем считать с буфером приема разобрались  Теперь что касается передачи. Во-первых, все-таки мой старый вопрос - как в этом случае обойтись без этих циклов while, которые ждут установки флага о готовности? ведь тут тоже пустой простой... Что касается буфера, то у меня как-то не получилось  и даже наверное не буду приводить код, опять будете смеяться  Хотя бы принцип верный? - Запись в буфер идет в прерывании АЦП, считывается постоянно в цикле for(;;); так как вообще говоря передача должна идти посылками по 4 байт (стартовый символ"*", два байта данных (int) и стоповый "#"), то считывается сначала в массив [4], а этот массив передается по байтам через регистр U0TXBUF. Но, когда передается, как обойтись без этих while?
|
|
|
|
|
Aug 17 2008, 14:49
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
О-хо-хо... Ну да ладно! Даша, я предполагаю, что Вы только-только подходите к понятью принципов работы событийно-управляемых (event-driven) автоматов. Вы уже освоили линейное и процедурное программирование, теперь перед Вам открывается совершенно другой мир. Другая планета. Здесь все не так. Извините, маленькая лекция. Допустим, у нас есть некоторый девайс, который имеет клавиатуру и дислей. Например, нечто типа калькулятора. Наша программа должна считывать клавиатуру, выполнять какие-то определенные действия и результат выводить на экран. Как бы мы написали такую программу? Во первых, это бесконечный цикл, тело которого состоит из вызова трех функций. Пусть они будут называться так: GetKey() DoSomething() DisplayResult() чтобы не усложнять, аргументы функций пока опустим из рассмотрения. А вот названия функций говорят сами за себя -- получить код нажатой клавиши, выполнить какое-то действие, вывести результат. Вот основной цикл нашей программы: Код while (1) { GetKey(); DoSomething(); DisplayResult(); } Рассмотрим вызов функция GetKey(). Вроде бы все ясно -- функция должна вернуть код нажатой клавиши. А что делать, если ни одна клавиша не нажата? Значит, функция не вернет управление. Допустим, что это так. Тогда получается, что наше устройство постоянно как-бы зависает на этой функции. И действительно, посчитать результат и вывести его -- занимает не так уж и много времени по сравнению с тем, что юзер нажимает кнопочки. Юзер вообще может вообще пойти попить кофейку. Но для этого устройства такое построение программы допустимо. Поскольку предопределенные действия выполняются только тогда, когда юзер соизволит нажать кнопочку. С другой стороны, нет нажатия -- значит, и делать ничего не надо! Пока все срастается. Так было раньше, когда программы были маленькие, процессоры глупенькие, а деревья большие. Но мир изменился. Сейчас МК стали обладать многими периферийными устройствами и интерфейсами, которые зачастую работают одновременно. Противоречие в современных устройствах заключается в том, что периферийных устройств много, а "думатель" (АЛУ) -- один. Давайте-ка теперь к нашему чудо-калькулятору добавим часы, которые раз в секунду должны подновлять свои показания на дисплее, и посмотрим как это повлияет на нашу программу. Добавляя в цикл две функции GetCurrentTime() и (), мы не решим проблему. Код while (1) { GetKey(); DoSomething(); DisplayResult(); GetCurrentTime(); DisplayTime (); } Понятно, что управление, зависая в GetKey(), будет блокировать всю программу. Понятно, что часы будут подновляться только при нажатии какой-либо кнопочки. Страшно неудобно. Такое изделие никто не купит. Что делать? Можно пойти двумя путями. (Сразу скажу, Вы, Daria, как мне кажется, в своей программе идете первым путем.) Путь первый (а-ля-DOS): добавить еще пару функций IsKeyHit() и IsTimeChanged(), которые будут возвращать управление сразу. Такие функции еще называют неблокирующими. Эти функции "говорят" только о том, что нажата ли вообще какая-нибудь клавиша или нет, изменилось ли время или еще нет. Теперь наш цикл будет выглядеть так: Код while (1) { if (IsKeyHit()) { GetKey(); DoSomething(); DisplayResult(); } if (IsTimeChanged()) { GetCurrentTime(); DisplayTime(); } } В этом случае, наша программа будет со скоростью света совершать холостые обороты. Вот смотрите, скорость работы МК составляет миллионы инструкций в секунду, скорость нажатия клавиш -- максимум десяток-другой в секунду, а про именение текущего времени, так вообще раз в секунду. Единственное, что напрягает, -- это кпд программы. Но, с другой стороны, прога-то работает! А это есть самое главное. Ибо ведь никому не нужно устройство, которое не выполняет своей функции. А наше устройство свою функцию выполняет. Ведь так? (Заказчика не интересует, как и на какой парадигме строится программа, Его интересует только конечный результат. А мы его, не смотря на дремучесть нашего кода, обеспечиваем.) Второй путь (а-ля-Windows): Это то, о чем я говорил в самом начале поста, это событийно-управляемый автомат. Работает эта штука следующим образом. В таком автомате (системе) есть два дуальных механизма. Первый -- регистрирует происходящие в системе изменения (события) и записывает в очередь соответствующее сообщение об этом событии. Очередь надо понимать чисто в компьютерном смысле -- т.е. бесконечный (кольцевой) буфер. Второй механизм периодически опрашивает эту очередь, и, если она не пуста, извлекает из нее очередное сообщение и вызывает соответствующий обработчик. В результате получается, что если в системе нет событий, ничего не делаем. Т.е. опять-таки совершаем холостые обороты. Но в этом случае у нас оказалось, что постановка в очередь и обработка сообщений будут (программно) разнесены в разные части. По началу, это кажется крайне неудобным. Но создав несколько проектов Вы придете к мысли, что так все же намного легче разрабатывать свои программы, а потом их сопровождать. Т.е. даже по прошествии какого-то времени, возвращаясь к коду, его легче понять и добить запоздалыми требованиями заказчика по недостающей функциональности устройства. Итак, возвращаемся к событийно-управляемым системам. Поставщиками событий в первую очередь являются не что иное, как всевозможные прерывания от периферийных устройств. Во вторую очередь, это могут быть какие-то результаты работы программы. (Я догадываюсь, сейчас это несколько сложно понять. Но что делать? Ведь не всегда бывает легко с первого раза въехать в какие-то новые понятия. Тем более, если эти понятия очень емкие и не вписываются в установившиеся, привычные для нас рамки. Терпите. Учитесь. Другого пути нет.) Произошло в системе нажатие на кнопочку -- возникает прерывание. Попадаем в функцию прерывания. В ней записываем соответствующее сообщение в очередь, выходим. Прерывание отработано очень быстро. Событие в ситеме зарегистрировано Больше-то и делать сейчас ничего не надо. Еще пару-тройку раз для уяснения: Произошло перещелкивание секунды в таймере -- возникло прерывание. Заходим, записываем сообщение в очередь, выходим. Закончил АЦП измерение -- прерывание. Заходим, сообщение в очередь, выходим. Очередной байт отправлен (по USART-у) -- прерывание. Заходим, сообщение в очередь, выходим. Думаю, идея понятна? С другой стороны программы, имеем опять тот же самый бесконечный цикл. Но работает он уже чуть-чуть по-другому, не совсем так, как в нашем исходном варианте в начале статьи. Теперь нам не надо периодически пробегать (говорят – заниматься поллингом) по всем нашим ПУ, опрашивать каждое – есть ли нажатие кнопочки или нет, говов ли АЦП или нет, тикнул ли таймер или нет. Вместо всего этого, теперь имеется единственная функция GetMessage() и вслед за ней располагается так называемый кракер сообщений (т.е. расшифровщик). Задача этой "парочки" -- вытянуть из очереди сообщение, и вызывать соответствующую функцию по его обработке. Выглядит это намного приятнее: Код unsigned char msg;
while () { if (GetMessage(&msg)) switch (msg) { case MSG_KEYPRESS: DoKey(); break;
case MSG_TICK: DisplayCurrentTime(); break; case MSG_ADCREADY: SendResult(); break;
case MSG_TXD: SendNextByte(); break;
... }
// а здесь вот -- самое удобное место пинать собаку (WDR) } Теперь пара слов о переменной msg. У меня здесь это -- просто байт, но в случае очень навороченной системы Вам никто не запрещает для кодирования сообщений вместо байта использовать слово или вообще структуру. Важно только одно: важно соблюсти атамарность операций занесения и извлечения из очереди сообщений. Т.е., другими словами, сделать так, чтобы не получилось, что система, начав записывать одно сообщение в очередь, окажется в состоянии другого прерывания, которое запишет свое сообщение. Потом в очередь будет дозаписан остаток от первого сообщения. В результате в очереди сообщений получится фигня полная. Все рухнет. Есть еще некоторые тонкие моменты. Поскольку обработка сообщений конечна по времени (т.е. они не обрабатываются мгновенно), а источников событий несколько, и они работают асинхронно, то нужно делать очередь сообщений достаточно длинную. Но какую? Ее хоть и называют "бесконечной", но создается-то она на основе обычного линейного буфера, какой-то конкретной длины. И Ваша задача (О-о, это искусство!) найти оптимальную длину буфера. Маленький буфер может быть легко переполнится, большой -- буфер сожрет память, которой и так кот наплакал. Не надо также забывать, что обработчики сообщений не должны долго работать, т.е. они не должны узурпировать процессорное время. Я как-то занимался одним проектом. Там нужно было выводить инфу на графический LCD, одновременно нужно было оперативно реагировать на кнопочки и держать связь с компом и дюжиной периферых устройств, подцепленных к двух UART'ам. Сложность состояла в том, что LCD подключался по квадратной (I2C) шине. Длина шлейфа была метра полтора. Я не рискнул, "зажигать" его на 400 кГц. А на 100 кГц, обновление экрана занимало почти четверть (или даже более, не помню точно!) секунды. Если бы обновление LCD было реализовано в одной функции-обработчике, то это легко бы привело к переполнению очереди сообщений. В моменты перерисовки дисплея реакция на клавиатуру отсутствовала бы, связь бы с ПУ нарушалась бы. Приятного мало. Я сделал так, я разбил LCD на несколько областей, и для перерисовки каждой области создавал свое индивидуальное сообщение. В результате, перерисовка LCD выполнялась как серия перерисовок его отдельных областей. Эта серия сообщений, понятно что, могла быть "разбавлена" сообщениями от клавиатуры и от других ПУ. В целом это создало картину практически мгновенной реакции на нажатие клавиш, способности устройства рисовать на экране и одновременно (и без задержек) заниматься периферией, отвечать компу на его запросы. Не знаю, что еще можно добавить. С одной стороны, сказать еще много чего можно, а с другой... а то-ли это место (форум), где надо много говорить? Насчет критики. Я, вобщем-то, как-то не рассчитывал на нее. Просто писал и все. Даже не столько пытался ответить Daria, сколько вообще хотел поделиться своим опытом. Но поскольку я тут много чего сказал, критика должна быть.
Сообщение отредактировал zhevak - Aug 17 2008, 15:42
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
Сообщений в этой теме
Daria MSP430 - снова вопросы от чайника Jul 23 2008, 19:17 rezident Некоторое (продолжительное) время не заглядывал в ... Jul 23 2008, 22:03 Daria Ага, все же заглянули спасибо за комментарии и кр... Jul 24 2008, 19:29  =DS= Цитата(Daria @ Jul 24 2008, 23:29) А по п... Jul 25 2008, 03:03   Daria Цитата(=DS= @ Jul 25 2008, 07:03) *addr ... Jul 25 2008, 18:27    rezident Цитата(Daria @ Jul 26 2008, 00:27) а к... Jul 25 2008, 19:47     Daria И версии, и настройки. А кикстарт - потому что сн... Jul 25 2008, 21:05      rezident Цитата(Daria @ Jul 26 2008, 03:05) И верс... Jul 25 2008, 21:38       Daria Цитата(rezident @ Jul 26 2008, 01:38) Ну ... Jul 26 2008, 12:38        rezident Цитата(Daria @ Jul 26 2008, 18:38) rezide... Jul 26 2008, 12:58         Daria Так вот. Галочка стоит. А состояние переменных все... Jul 28 2008, 20:14          rezident Цитата(Daria @ Jul 29 2008, 02:14) Так во... Jul 28 2008, 23:05           Daria Цитата(rezident @ Jul 29 2008, 03:05) Ну ... Jul 30 2008, 19:31           Daria Здравствуйте, снова я
Цитата(rezident @ Jul... Aug 7 2008, 20:43            rezident Цитата(Daria @ Aug 8 2008, 02:43) ЗКак бы... Aug 8 2008, 01:29             Daria Цитата(rezident @ Aug 8 2008, 05:29) Можн... Aug 8 2008, 20:28              rezident Цитата(Daria @ Aug 9 2008, 02:28) а вот п... Aug 9 2008, 01:10               Daria Цитата(rezident @ Aug 9 2008, 05:10) Коли... Aug 9 2008, 20:42                rezident Цитата(Daria @ Aug 10 2008, 02:42) Ну и п... Aug 9 2008, 22:10                 Daria Так. Ну вот, как-то не выходит ничего
Если в пре... Aug 11 2008, 20:19                  Dog Pawlowa Цитата(Daria @ Aug 11 2008, 23:19) Как бы... Aug 12 2008, 06:14                   Daria Цитата(Dog Pawlowa @ Aug 12 2008, 10:14) ... Aug 12 2008, 19:55      =DS= Цитата(Daria @ Jul 26 2008, 01:05) Дебагг... Jul 25 2008, 21:40 Т.Достоевский Может так?
Код#pragma vector=ADC_VECTOR
{
if ... Aug 11 2008, 21:52 rezident Все дело в том, что вы маски неверно накладываете.... Aug 11 2008, 23:19  rezident Цитата(Daria @ Aug 13 2008, 23:06) Но - з... Aug 13 2008, 18:19   Daria Цитата(rezident @ Aug 13 2008, 22:19)
Яс... Aug 13 2008, 19:59      rezident Цитата(Daria @ Aug 17 2008, 17:13) Запись... Aug 17 2008, 15:09       zhevak Цитата(rezident @ Aug 17 2008, 21:09) Изв... Aug 17 2008, 15:51        rezident Цитата(zhevak @ Aug 17 2008, 21:51) Не, н... Aug 17 2008, 15:56         zhevak Цитата(rezident @ Aug 17 2008, 21:56) Да ... Aug 17 2008, 16:38          Daria Да-а-а утром отправляю вопрос, иде себе спокойне... Aug 17 2008, 20:49           Daria здравствуйте снова. Такой вопрос - во время работ... Aug 19 2008, 17:42            rezident Цитата(Daria @ Aug 19 2008, 23:42) можно ... Aug 19 2008, 21:40             Daria Цитата(rezident @ Aug 20 2008, 01:40) А т... Aug 20 2008, 18:20              Daria Здравствуйте. rezident, по поводу примера буфера п... Aug 21 2008, 18:01               rezident Цитата(Daria @ Aug 22 2008, 00:01) для че... Aug 21 2008, 21:19                Daria Как всегда - большое спасибо! про выравниван... Aug 24 2008, 17:36                 Daria Здравствуйте снова.
Вот опять вопросы_
Делаю усред... Aug 29 2008, 18:53                  rezident Цитата(Daria @ Aug 30 2008, 00:53) Делаю ... Aug 29 2008, 20:16                   Daria Да знаю я, знаю, что долго сидеть в прерывании нех... Aug 30 2008, 18:33                    rezident Цитата(Daria @ Aug 31 2008, 00:33) Да зна... Aug 30 2008, 21:04                     Daria Цитата(rezident @ Aug 31 2008, 01:04) Ест... Aug 31 2008, 16:48                      rezident Цитата(Daria @ Aug 31 2008, 22:48) Нужно.... Aug 31 2008, 18:39                       Daria Цитата(rezident @ Aug 31 2008, 22:39) В п... Aug 31 2008, 20:29                        Daria Ну вот, отпуск кончился, пошли суровые будни
И в... Sep 12 2008, 18:04                         rezident Цитата(Daria @ Sep 13 2008, 00:04) Вот та... Sep 12 2008, 18:27                          Daria Цитата(rezident @ Sep 12 2008, 22:27)
re... Sep 18 2008, 13:34                           Daria Здравствуйте. Такие вопросы -
сейчас я прошиваю ... Sep 23 2008, 18:33                            rezident Цитата(Daria @ Sep 24 2008, 00:33) В даль... Sep 23 2008, 19:56                             Daria Ага, но мне, как пока неквалифицированному програм... Sep 23 2008, 20:12                              rezident Цитата(Daria @ Sep 24 2008, 02:12) Значит... Sep 23 2008, 20:47                               Daria Цитата(rezident @ Sep 24 2008, 00:47) Для... Sep 23 2008, 20:56                                rezident Цитата(Daria @ Sep 24 2008, 02:56) А UIF ... Sep 23 2008, 21:35                                Сергей Борщ Цитата(Daria @ Sep 23 2008, 23:56) Как-то... Sep 23 2008, 21:52                                 Daria Цитата(Сергей Борщ @ Sep 24 2008, 01:52) ... Sep 24 2008, 17:18                            Сергей Борщ Цитата(Daria @ Sep 23 2008, 21:33) мне ск... Sep 23 2008, 20:01                            LCD Цитата(Daria @ Sep 23 2008, 22:33) Не под... Sep 24 2008, 19:14                         MrYuran Цитата(Daria @ Sep 12 2008, 22:04) Как бы... Sep 13 2008, 10:53                          rezident Цитата(MrYuran @ Sep 13 2008, 16:53) И с ... Sep 13 2008, 16:48                           MrYuran Цитата(rezident @ Sep 13 2008, 20:48) А в... Sep 13 2008, 17:31                           Сергей Борщ Цитата(rezident @ Sep 13 2008, 19:48) А в... Sep 13 2008, 18:20                            rezident Цитата(MrYuran @ Sep 13 2008, 23:31) А во... Sep 13 2008, 20:13                             AHTOXA Цитата(rezident @ Sep 14 2008, 02:13) При... Sep 15 2008, 17:38 Kurt 2rezident: я восхищен силой вашего воображения )) Aug 13 2008, 04:41 _3m Цитата(Kurt @ Aug 13 2008, 08:41) 2rezide... Aug 13 2008, 06:34 rezident Я не вижу функции инициализации UART, но попробуйт... Sep 24 2008, 18:12 Daria Цитата(rezident @ Sep 24 2008, 22:12) Я н... Sep 25 2008, 18:43  rezident Цитата(Daria @ Sep 26 2008, 00:43) Ну, те... Sep 25 2008, 19:30   Daria Цитата(rezident @ Sep 25 2008, 23:30) Пок... Sep 26 2008, 15:21 VAI ЦитатаКварц, кстати, подходящий нашла у Murata - C... Sep 25 2008, 06:57 rezident Ну вот она и ошибка. Первой командой инициализации... Sep 26 2008, 15:33 Daria Цитата(rezident @ Sep 26 2008, 19:33) Ну ... Sep 29 2008, 19:16  rezident Цитата(Daria @ Sep 30 2008, 01:16) не-а, ... Sep 29 2008, 20:23   Daria Цитата(rezident @ Sep 30 2008, 00:23) Дел... Sep 30 2008, 19:00    rezident Цитата(Daria @ Oct 1 2008, 01:00) NData -... Sep 30 2008, 19:49     Daria Кодtypedef struct CharBuffer
{
unsigned char* Dat... Sep 30 2008, 20:26      rezident Цитата(Daria @ Oct 1 2008, 02:26) но так ... Sep 30 2008, 23:05       Daria Цитата(rezident @ Oct 1 2008, 03:05) Поче... Oct 1 2008, 18:23        rezident Цитата(Daria @ Oct 2 2008, 00:23) Да, но ... Oct 1 2008, 19:34         Daria Цитата(rezident @ Oct 1 2008, 23:34) Если... Oct 2 2008, 19:37 VAI Кстати, по уартам, я как-то выкладывал свои исходн... Oct 3 2008, 01:12 Daria Цитата(VAI @ Oct 3 2008, 05:12) Кстати, п... Oct 4 2008, 17:01  Daria Опять я теперь нужен еще буфер - для АЦП. посмот... Oct 5 2008, 15:42   Daria И еще Мне нужно обмениваться с двумя устройствам... Oct 5 2008, 19:35    Dog Pawlowa Цитата(Daria @ Oct 5 2008, 22:35) И еще ... Oct 6 2008, 06:04     Daria Цитата(Dog Pawlowa @ Oct 6 2008, 10:04) О... Oct 6 2008, 17:45      rezident Цитата(Daria @ Oct 6 2008, 23:45) одно ус... Oct 6 2008, 19:04       Daria Цитата(rezident @ Oct 6 2008, 23:04) Личн... Oct 7 2008, 17:09        rezident Цитата(Daria @ Oct 7 2008, 23:09) Ага, а ... Oct 7 2008, 17:41         Daria Цитата(rezident @ Oct 7 2008, 21:41) В IA... Oct 7 2008, 18:12          rezident Цитата(Daria @ Oct 8 2008, 00:12) Все же ... Oct 7 2008, 19:07           Daria Цитата(rezident @ Oct 7 2008, 23:07) Либо... Oct 10 2008, 20:23
3 страниц
1 2 3 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|