[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено з.а.С 04 июня 2002 г. 19:32
В ответ на: Ответ: Спасибо за советы отправлено AlCost 03 июня 2002 г. 22:16

-->Но ваще-то, если всё нормально, то что мешает модулю АЦП выполнять преобразование, пусть даже в то время, как сам PIC находится в прерывании
На самом деле, переферии PIC-а абсолютно "фиолетово", какое число записано в PC и каково содержимое ячейки по имени GIE. Анализируя собственные ошибки, могу сказать, что 90% неудач работы с ADC это процедура Read-Modify-Write (иструкции асма: BCF, BSF, BTFSS, BTFSC непосредственно применённые к порту "А" ("GPIO"). Либо модификация TRIS-а, теми же инструкциями, (было и такое, что грех таить) в процессе преобразования и в паузах между ними. Всё остальное, это: - либо неправильно выбранное время преобразования, либо неверно расчитанный ( оцененый ) выходной импеданс аналоговой цепи. Последнее, правда, влияет на результат измерения, но ни как не влияет на работоспособность ADC.

А вообще, если несколько отвлечся от темы, "ISR for PIC" - Весьма занятная штука... // то же --->(для продолжения дискусси)
Я , в свое время, "имел счастье" отдавать воинский долг Родине в качестве механика-водителя средних танков. К электронике вообще, и к микроконтроллерам в частности, это ни какого отношения не имеет. Поэтому, почему так случилось - вопросы не ко мне, а к МО . Так вот, был у нас ЗамПоТех полка, великий человек, пользовался непререкаемым авторитетом среди солдат и офицеров. Пламенной любовью женского населения военного городка и окресностей то же ... пользовался 8-). А знаменит был этот полковник тем, что обожал водить не совсем "здоровые" танки. Рулевые тяги разбты, или корбки передач вот-вот рассыпятся, а один раз вообще - "пилотировал" танк с одной целой гусеницей... Вот уж был "праздничек" у той роты, которая обслуживала танкодром в эти ночные вождения.
За два года службы, до таких высот "пилотирования" я не дорос, и более того, так и не понял - а зачем это нужно..? Ведь успешность "боевых действий" обеспечивается, помимо всего прочего, исправностью "оружия", причем не требующего для своего управления каких то сверхнавыков.

Когда мои восторги по поводу PIC-a несколько улеглись, а поризошло это, надо сказать, довольно быстро 8-), я "договорился" сам с собой таким образом, что, - если какое либо прерывание обслуживается в ISR, то в теле MAIN событие, связанное с этим прерыванием, обрабатывается только по програмному флагу. В теле ISR этот програмный флаг только устанавливается или только сбрасывается. Что то типа такого :
// Interrupt Service
.........
.........
if(TMR1IE && TMR1IF) {
.......
.......
TMR1IF = 0;
.......; // здесь, скорее всего, перезагрузка регистров TMR1
.......; // проверка на переполнение/обнуление програмного счетчика
// временного интервала, если в этом есть необходимость
TMR1IE = 0; // если требуемый временной интервал выдержан
_fTime_Out = 1;
}
// --- The Main Programm area ---
void main (void) {
......
......
......
while (_fTime_Out) {
.....
..... // делаем что то полезное
..... // если необходимо, то "перезаряжаем" прерывание от TMR1
// Но, обычно, для этих дел пишется специальный "планировщик"
// который и "принимает решение" - кому, чего и куда разрешить
_fTime_Out = 0;
}
......
}
А вот те события, которые могут устанавливать/сбрасывать флаги в регистрах SFR: (INTE,PEIE,PIR1,PIR2,PIE1,PIE2), но по которым мы не разрешаем прерываний, проверяются в соответствующих процедурах в теле main там, где это необходимо.
И вторая "договоренность", проверка состояния ножек любого порта - только через темпорарий. Вот примерно так:
#define testbit(data,bitno) ((data>>bitno)&0x01)
#define bitset(var,bitno) ((var) |= 1 << (bitno));
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)));
на асме это выглядит куда как проще, но суть та же 8-)
// Test pin
temp_PortA = PORTA;
if (testbit(temp_PortA,0) .....;
// Set pin
bitset(temp_PortA,0);
PORTA = temp_PortA;

Подобная метода в программировании едва ли может претендовать на оригинальность, но не позволяет допускать многих "промахов". И, в конце концов, ни кто ведь не требует от танка скоростей "ФормулыI", хотя неплохо бы 8-), или комфорта "Volvo", хотя, как бывший мех. водитель, от него я бы точно не отказался 8-))).

Успехов !!!

__САмый_Злостный_Анонимус_Сергей

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru