|
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 13 2008, 18:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Aug 13 2008, 23:06)  Но - запрещение прерываний в прерывании таймера и АЦП делаю осознанно  , при переключении вывода должен пройти переходной процесс, прежде чем можно разрешать преобразование АЦП. Если вы еще раз заглянете в User's Guide и внимательно прочитаете главу 2.2.3 Interrupt Processing -> Interrupt Acceptance, то там пункт №6 гласит Цитата 6) The SR is cleared with the exception of SCG0, which is left unchanged. This terminates any low-power mode. Because the GIE bit is cleared, further interrupts are disabled. Бит GIE находится к статусном регистре SR, который при переходе по вектору прерывания очищается (за исключением бита SCG0). Т.е. переход на программу обработки прерывания запрещает все маскируемые прерывания автоматически. Поэтому дополнительно запрещать все прерывания в обработчике прерывания нет необходимости. Находясь в прерывании можно разрешить прерывания, если вы контролируете размер стека и готовы к ситуации с вложенными прерываниями. Цитата(Daria @ Aug 13 2008, 23:06)  Так что переключение вывода и старт АЦП должны совершенно точно делаться в разные моменты времени. Такие дела. Вы можете запустить преобразование АЦП синхронно с переключением выхода, но выкинуть из расчета результат первого преобразования, используя время, затраченное на это преобразование, как временнУю паузу. Либо использовать этот же таймер (CCR2, например) для генерации временнОй отметки запуска преобразования АЦП. Ожидать в прерывании возможности запуска АЦП имеет смысл только, если требуемая пауза совсем небольшая, не более полусотни тактов MCLK. ИМХО.
|
|
|
|
|
Aug 13 2008, 19:59
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(rezident @ Aug 13 2008, 22:19)  Ясно, спасибо
|
|
|
|
Сообщений в этой теме
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  zhevak Ух-х, какие крутые виражи! Ух, как человека мы... Aug 14 2008, 08:09   Daria Цитата(zhevak @ Aug 14 2008, 12:09) Rezid... Aug 14 2008, 20:47    rezident Цитата(Daria @ Aug 15 2008, 02:47) Rezide... Aug 14 2008, 21:01     Daria Ага, будем считать с буфером приема разобрались ... Aug 17 2008, 11:13      zhevak О-хо-хо... Ну да ладно!
Даша, я предполагаю, ... Aug 17 2008, 14:49      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
|
|
|