MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Ещё один вопрос по написанию программ....

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Ещё один вопрос по написанию программ....
Автор: SVO ()
Дата:   09/03/2005 17:47

Недавно я открывал уже подобную тему, в которой выяснилось, что на всякий случай
переменные нужно делать volatile. Но в данном случае и этот совет не помог :(
Проблема в том, что в этой програмке переменная не всегда досчитывает до 280, как
должна. Это я выяснил в эмуляторе. Иногда счёт идёт до 256 и начинается выполнение
условия, хотя посмотрев в опциях эмулятора в этот момент было видно, что под неё
отведена та же самая память в размере 2-ух байт. Почему она не досчитывает до
конца???? И как-то это не постоянно: может досчитать до 280, а может и до 256. Чё я
не так сделал или может инклуда какого-нибудь не хватает?

#include <avr/io.h> //описание железа ATMega8
#include <avr/signal.h> //библиотека прерываний

volatile unsigned short a;

SIGNAL(SIG_OVERFLOW2) { //опрос 13,983 кГц
a++;
}

int main (void){
init();
while(1){
if (a>279) { //прерывание 20 мс
........
a=0;
}}}


 
 Re: Ещё один вопрос по написанию программ....
Автор: msp ()
Дата:   09/03/2005 19:04

cli();
if (a > 279) { //прерывание 20 мс
  a = 0;
  sei();
  ........
}
sei();





 
 Re: Ещё один вопрос по написанию программ....
Автор: SVO ()
Дата:   09/03/2005 19:27

Непонял? Если я так напишу, то каким образом буду попадать в подпрограмму обработки
прерываний, ведь они запрещены всё время.


int main (void){
init();
while(1){

cli(); //??????????????????????????????

if (a>279) { //прерывание 20 мс
a=0;
sei();
........
}}}


 
 Re: Ещё один вопрос по написанию программ....
Автор: msp ()
Дата:   09/03/2005 20:03

/* Непонял? Если я так напишу, то каким образом буду попадать в подпрограмму обработки прерываний, ведь
они запрещены всё время.*/

Запрещены на несколько циклов, а не на все время. Аналогично можно запрещать прерывания таймера.




 
 Кстати
Автор: msp ()
Дата:   09/03/2005 20:13

После cli() может еще потребоваться один nop, листинг смотреть нужно. По-дурацки в авр прерывания
запрещаются - один цикл после cli() они еще работают :(.




 
 Опции программатора
Автор: Alich ()
Дата:   10/03/2005 12:13

При написании программ - довольно долго мучился - то работает, то не работет. Работает
программа - еще одну процедуру добавил - перестала. Иван Зайцев подсказал - пасибо ему
большое, еще раз глянуть настройки программатора. И оп-ля, несмотря на то, что в
конфигурационное слово прописываю полный анпротект памяти - программатор Phyton (в смысле
оболочка) положил на это дело и запрещает табличное чтение. Причем частично.
Поэтому если не можете понять почему, обращайте внимание на это дело...