AVR ты у нас спец по протеусу, вразуми. Решил посидеть вечером, покодить. Пишу программу для PIC контроллера, программа наитупейшая, принимает символ с компа, сравнивает, если годится посылает ответ.
- Код: Выделить всё • Развернуть
#include <pic.h> // Директива подключения доп.библиотеки
__CONFIG(HS & WDTDIS); // Макрос настройки кристала
int index=0;
void interrupt main_inter(void)
{
if(RCIF)
{
PORTD=RCREG;
TXREG=RCREG;
RCIF=0;
}
}
void main (void)
{
TRISA=0b00000000;
TRISB=0b00000000;
TRISC=0b11000000;
TRISD=0b00000000;
PORTA=0b00000000;
PORTB=0b00000000;
PORTC=0b00000000;
PORTD=0b00000000;
TXSTA=0b00000000;
CSRC=1;
TXEN=1;
BRGH=1;
TRMT=1;
RCSTA=0b00000000;
SPEN=1;
CREN=1;
SPBRG=129;
SSPSTAT=0b00000000;
SMP=1;
SSPCON=0b00000000;
SSPEN=1;
INTCON=0b00000000;
GIE=1;
PEIE=1;
T0IE=1;
INTE=1;
PIE1=0b00000000;
ADIE=1;
RCIE=1;
TXIE=1;
SSPIE=1;
while(1==1)
{
for(index=0; index>1000; index++);
if (index==1000)
TXREG=RCREG+10;
}
}
Собираю устройство в протезе. Не фурычит ни рожна. Деталю в программе мигание светодиода и постоянную посылку символа в комп. Работает (значит не совсем еще дурак). Ставлю прием, не работает. Программу переписывал и так и эдак. Все по даташиту, перепроверял несколько раз каждый шаг. Закоментировал все свое и вставил чужой код из примера -
http://www.pcports.ru/articles/pic8.php. Работает. Но там сделано без прерывания, а мне нужно с прерыванием... Короче я так мучался наверное часа два, а потом просто тупо наткнулся на такие чудеса. У микрочиповских контроллеров в регистре INTCON есть бит PEIE - разрешение прерываний от периферийных модулей. Так вот протеус как то странно на него реагирует.
Если PEIE=0 программа в протеусе функционирует стабильно.
Но не работает блок
- Код: Выделить всё • Развернуть
void interrupt main_inter(void)
{
if(RCIF)
{
PORTD=RCREG;
TXREG=RCREG;
RCIF=0;
}
}
Если PEIE=1 прерывания работают, но все что стоит после while(1==1) выполняться отказывается. При пошаговой отладке курсор сразу на void interrupt main_inter(void) перескакивает игнорируя
- Код: Выделить всё • Развернуть
while(1==1)
{
for(index=0; index>1000; index++);
if (index==1000)
TXREG=RCREG+10;
}
Не могу понять в чем фигня, толи я не так с протеусом общаюсь, толи это очередной глюк протеза.
З.Ы. В железе все пашет. Прогонял дебагером через PICKit2 все нормально и цикл и прерывание, все срабатывает.