Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 64

urry: clear_interrupt(int_RDA); - какой флаг Вы здесь сбрасываете и зачем ?
--------------------
ццс, насколько я увидел из самплов, сам заботится о сбросе флагов, кроме того
флаг RCIF доступен только для чтения, сбрасывается аппаратно при чтении байта из RCREG...
в общем, "вещь в себе" этот ццс...

 

Недавно бодался с прерываниями на ЦЦС, пока вот таким образом не сбрасывал, ничего не работало... Конкретно флаги переполнений счётчиков и внешнее.

 

rfc: 1. Судя по приведённому выше фрагменту кода, разбором прерываний занимается сам css. т.е. программист предоставляет ему только обработчик конкретного прерывания. плюсы подобного подхода - простота использования, и сокрытие аппаратных тонкостей. минусы - увеличивается время входа в прерывание.

2. В других компиляторах (например HITECH или C18) разбор действительно возложен на программиста. Но. делать так:

Прежде всего прочитай раздел справки:
#INT_xxxx
Конкретно это :

These directives specify the following function is an interrupt function. Interrupt functions may not have any parameters. Not all directives may be used with all parts. See the devices .h file for all valid interrupts for the part or in PCW use the pull down VIEW | Valid Ints

The compiler will generate code to jump to the function when the interrupt is detected. It will generate code to save and restore the machine state, and will clear the interrupt flag. To prevent the flag from being cleared add NOCLEAR after the #INT_xxxx. The application program must call ENABLE_INTERRUPTS(INT_xxxx) to initially activate the interrupt along with the ENABLE_INTERRUPTS(GLOBAL) to enable interrupts.

The keywords HIGH and FAST may be used with the PCH compiler to mark an interrupt as high priority. A high-priority interrupt can interrupt another interrupt handler. An interrupt marked FAST is performed without saving or restoring any registers. You should do as little as possible and save any registers that need to be saved on your own. Interrupts marked HIGH can be used normally. See #DEVICE for information on building with high-priority interrupts.

A summary of the different kinds of PIC18 interrupts:

#INT_xxxx

Normal (low priority) interrupt. Compiler saves/restores key registers.

This interrupt will not interrupt any interrupt in progress.

#INT_xxxx FAST

High priority interrupt. Compiler DOES NOT save/restore key registers.

This interrupt will interrupt any normal interrupt in progress.

Only one is allowed in a program.

#INT_xxxx HIGH

High priority interrupt. Compiler saves/restores key registers.

This interrupt will interrupt any normal interrupt in progress.

#INT_GLOBAL

Compiler generates no interrupt code. User function is located

at address 8 for user interrupt handling.

Есть там и управление сбросом флаг - авто\вручную и управление приоритетом...

 

dosikus: Прежде всего прочитай раздел справки:
#INT_xxxx
Конкретно это :

Интересно, зачем мне читать справку от компилятора, которым я не пользуюсь? Мне от того, которым пользуюсь, чтива за глаза хватает.

Если дочитать ветку до конца, то станет ясно, что проблемы ни у кого нет.

Обязательно копипастить по килобайту вырезок? ссылки, обычно, достаточно.

 

rfc: Интересно, зачем мне читать справку от компилятора, которым я не пользуюсь? Мне от того, которым пользуюсь, чтива за глаза хватает.

Что бы не делать скоропалительных выводов, сбивая других с толку.

 

dosikus: Что бы не делать скоропалительных выводов, сбивая других с толку.
Если читать не скоропалительно, а внимательно, то можно заметить, что парой постов выше сказано: "rfc: (я не работаю с CSS, про тонкости могу не знать)". Как правило, подобные ремарки сказанные перед остальным текстом, означают, что воспринимать всё нижеизложенное стоит исключительно как скромное, не претендующее на истину, мнение автора (мнение или предположение, но ни коим образом не выводы). И, таким образом, сбивание с толку возможно только для индивидуумов, самостоятельно к тому склонных. Впрочем, ничего непоправимого, при возникновении подобного сбивания, не случится, т.к. практика показывает, что подобные индивидуумы способны с толку сбиться и без посторонней помощи.
На этом оффтоп завершаю. Если кто желает продолжить - контакты в профиле.

 

Добрый день! Работаю в связке MPLAB+CCS уже почти год! Перешел с Hi-Tach. Из-за чего на работе на меня постоянно пытаются "наехать" - мол какой-то он глючный! До недавнего времени мне с легкостью удавалось отбиваться, но недавно столкнулся с проблемой! До этого проекта я использовал однолистинговую систему - т.е. писал всю программу в одном исходнике. А здесь поддался на уговоры и разделил на несколько листингов и тут началось! Отладчик перестал работать - не ставятся точки останова как при отладке в MPLAB SIM, так и при отладки через PICkit2. Неужели он не поддерживает такой способ написания программ? Может кто сталкивался с подобным?
Спасибо!

 

никаких проблем такого рода в хайтеке нет. Глючность присутствует при применении "про" версий компилятора, использовать "стд" вариант.

 

Shokin: Работаю в связке MPLAB+CCS уже почти год! ... А здесь поддался на уговоры и разделил на несколько листингов и тут началось!
А как разделяете листинги? Я вкладываю директивой #include - все работает, да и в проекте практически всегда есть #include в начале (с описанием адрессов регистров). И отладка в MPLab SIM и PICKit2 работают.

 
1 64