Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SILABS переполнение PCA0 не вызывает прерывание
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
firstvald
Отсмотрел все.
Прерывание разрешено : ECF в PCA0MD выставлен, EPCA0 в EIE1 выставлен. Видно, что счетчик считает и что флаг CF в PCA0CN выставляется. А прерывания нет.
Процессор 340.
alexunder
Цитата(firstvald @ Apr 30 2015, 13:14) *
Отсмотрел все.
Прерывание разрешено : ECF в PCA0MD выставлен, EPCA0 в EIE1 выставлен. Видно, что счетчик считает и что флаг CF в PCA0CN выставляется. А прерывания нет.
Процессор 340.

И все же: флаг EA выставлен? Скиньте сюда код инициализации системы прерываний
firstvald
Цитата(alexunder @ Apr 30 2015, 23:38) *
И все же: флаг 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;//ïåðåõîä âûçîâåò ïðåðûâàíèå



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

Код
PCA0CPM3=0;
   PCA0CPM3|=0X08;//MAT=1 программный таймер
   PCA0CPM3|=0x01;//ECCF=1  прерывание от компаратора этого регистра
  
   PCA0CPL3=0XFF;//число для сравнения  0xFFFF
   PCA0CPH3=0XFF;
firstvald
как написал обход на 3 регистре, так появилось прерывание от переполнения основного счетчика PCA0. что изменилось - не знаю. заремарил все что связано с 3 регистром - прерывание от переполнения основного осталось. вроде в тексте кода я никуда не лазил и состояние флагов отладчиком смотрел. непонятно.... sad.gif
alexunder
В самом деле смахивает на баг. Хочу заметить, что силабс не утруждает себя оформлением errata (на 340 не находится). Это упоминалось не раз на их форуме в том числе.
firstvald
ну я на всякий случай обрисовал ситуацию и предложил обходной метод - у кого-то что-то такое может всплыть, причем, не обязательно по 340 серии.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.