Перейти к содержанию
    

SILABS переполнение PCA0 не вызывает прерывание

Отсмотрел все.

Прерывание разрешено : ECF в PCA0MD выставлен, EPCA0 в EIE1 выставлен. Видно, что счетчик считает и что флаг CF в PCA0CN выставляется. А прерывания нет.

Процессор 340.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отсмотрел все.

Прерывание разрешено : ECF в PCA0MD выставлен, EPCA0 в EIE1 выставлен. Видно, что счетчик считает и что флаг CF в PCA0CN выставляется. А прерывания нет.

Процессор 340.

И все же: флаг EA выставлен? Скиньте сюда код инициализации системы прерываний

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все же: флаг EA выставлен? Скиньте сюда код инициализации системы прерываний

 

для пробы я смотрю как генерируется прерывание по изменению состояния ножки - все генерируется. Т е и вектор по правилному адресу и в EIE1 все как надо. Единственным битом который управляет от работающей части (можно заключить, что от или, который собирает флаги массива счетчиков все работает) до неработающей остается ECF.Но он выставлен. На силабовском форуме нашел упоминание, что для 120 кристаллов был баг, что переполнение не вызывало прерывание. Народ ржал что силабовцы его не занесли в еррату, а обозвали фичей. Про 340 не нашел(первый раз за 8 лет пользования этого проца понадобился этот узел и как то сразу не пошел).

 

 

void Interrupts_Init(void)
{
    IP        = 0x20;
    EIE1      = 0x80;
    IT01CF    = 0x98;
//    IE        = 0xA0;
//IE  ðàçðåøåíèå ïðåðûâàíèÿìè
//
// EA    
// ESPI0
// ET2
// ES0 
// ET1
// EX1
// ET0
// EX0
//
//EA   ESPI0  ET2   ES0   ET1   EX1   ET0   EX0
// 7    6      5     4     3     2     1     0    
// 80   40     20    10    8     4     2     1 
// 1    -      1     -     -     -     -     -
// ET2=1;

//*****************************
//EIE1
//
// ET3
// ECP1 êîìïàðàòîð 1
// ECP0 êîìïàðàòîð 0
// EPCA0 ìàññèâ òàéìåðîâ
// EADC0
// EWADC0
// EUSB0
// ESMB0
//
// ET3  ECP1  ECP0  EPCA0  EADC0  EWADC0  EUSB0  ESMB0
//  7     6    5     4       3      2       1     0
//  80    40   20    10      8      4       2     1

  //ET3=1;
  EIE1|=0X80;
  EIE1|=0X10;// EPCA0
//********************************
// IP
//
// PSPIO
// PT2
// PS0
// PT1
// PX1
// PT0
// PX0

//  -    PSPI0  PT2  PS0  PT1  PX1  PT0  PX0
//  7     6      5    4    3    2    1    0
//  80    40     20   10   8    4    2    1
   IP=0X20;


//*********************************
// EIP1
//
// PT3
// PCP1 êîìïàðàòîð 1
// PCP0
// PPCA0
// PADC0
// PWADC0
// PUSB0
// PSMB0
//
//
// PT3   PCP1   PCP0  PPCA0  PADC0  PWADC0  PUSB0  PSMB0
//  7     6      5     4      3      2       1      0
//  80    40     20    10     8      4       2      1
   EIP1=0X80;


   EA=1;

}


void PCA_Init(void)
{
    PCA0MD    &= ~0x40;//çàïðåòèëè ñîáàêó
  
    PCA0MD=0x00;
    PCA0CN=0x00;

//Âèáèðàåì èñòî÷íèê òàêòèðîâàíèÿ äëÿ ðåãèñòðà-ñ÷åò÷èêà PCA0H 
    PCA0MD&=~0x0e;//òàêòèðóåì îò  SYSCLK/12
//  PCA0MD|=0x02;//òàêòèðóåì îò  SYSCLK/4
//    PCA0MD|=0x04;//òàêòèðóåì îò  T0
//    PCA0MD|=0x06;//òàêòèðóåì îò  íîæêè ECI
//    PCA0MD|=0x08;//òàêòèðóåì îò  SYSCLK
    PCA0MD|=0x0A;//òàêòèðóåì îò  EXOSC/8  

    EA=1;
    EIE1|=0X10;
    PCA0MD|=0x01;//ECF=1  ðàçðåøàåì ïðåðûâàíèå
    //PCA0MD&=~1;//ECF=0  ðàçðåøàåì ïðåðûâàíèå

    PCA0H=0;
    PCA0L=0;

    PCA0CPM0=0;
    PCA0CPM1=0;
    PCA0CPM2=0;
    PCA0CPM3=0;
    PCA0CPM4=0;
//    PCA0CPM5=0;

    //íà÷èíàåì ñ÷åò
    PCA0MD&=~0X80;//CIDL=0;
    //PCA0MD|=0X80;//CIDL=1;
    PCA0CN|=0x40;//CR=1  ðàçðåøàåì ñ÷åò

//PCA0CN    = 0x40;
   // PCA0MD    &= ~0x40;
   // PCA0MD    = 0x0B;
   // PCA0CPL4  = 0x00;
   // PCA0MD    |= 0x40;


//ïåðåâîäèì 0 çàùåëêó â ðåæèì çàõâàòà ïî ïåðåõîäó 0->1
    //PCA0CPM0|=0x20;//çàõâàò ïî ïåðåõîäó 0->1
    PCA0CPM0|=0x10;//çàõâàò ïî ïåðåõîäó 1->0    

    PCA0CPM0|=0x01;//ïåðåõîä âûçîâåò ïðåðûâàíèå



}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

придется использовать обход. Для этого счетчик 3 перевожу в режим программного таймера. В PCA0CPL3 записываю 0xffff. При этом получается прерывание при достижении 0xffff, те при переходе 0xfffe->0xffff. Ну это почти 0xffff->0x10000. Разницу в 1 надо будет учитывать при рассчетах.

 

PCA0CPM3=0;
   PCA0CPM3|=0X08;//MAT=1 программный таймер
   PCA0CPM3|=0x01;//ECCF=1  прерывание от компаратора этого регистра
   
   PCA0CPL3=0XFF;//число для сравнения  0xFFFF
   PCA0CPH3=0XFF;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как написал обход на 3 регистре, так появилось прерывание от переполнения основного счетчика PCA0. что изменилось - не знаю. заремарил все что связано с 3 регистром - прерывание от переполнения основного осталось. вроде в тексте кода я никуда не лазил и состояние флагов отладчиком смотрел. непонятно.... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В самом деле смахивает на баг. Хочу заметить, что силабс не утруждает себя оформлением errata (на 340 не находится). Это упоминалось не раз на их форуме в том числе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну я на всякий случай обрисовал ситуацию и предложил обходной метод - у кого-то что-то такое может всплыть, причем, не обязательно по 340 серии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...