| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Не выпоняется основной код в PIC16F877A
07.10.2007, 14:36
|
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Не выпоняется основной код в PIC16F877A
У меня по какой то причине не выполняется основной код в PIC16F877A, хотя во всех симуляторах все работает. А вот в жизни работает только то что обрабатывается в прерываниях, а основной кодж после инициализации делает несколько действий и зависает.
Возможно ли что не рабочий контроллер, или он бы не работал вообще.
В данном коде клавиатура работает идеально, и если индикаторо переключать в прерывании все работает, а вот в основном коде как у меня не работает.
|
Код:
|
#include ‹pic.h›
/*****************Functions*******************/
void Keypres(void);//обработка нажатой клавиши
void Expectation(void);//дежурный режим
void Protection(void);//режим охраны
void Pause(int time, int divider);
void ReadStandartSetings(void);//записать стандартные установки
/******************Variable*******************/
char key=0x00;//код нажатой кнопки
char pass_exp=0;//счетчик соответствия пароля
//постановки/снятия охраны
int bank1 key_seconds=0;
int bank1 seconds_1=0;//счетчик для паузы
int bank1 seconds_2=0;//счетчик для индикации
/*************Setings variable****************/
char bank1 setings[4];//опции
/******************Flags**********************/
char f_buzzer=0;//включает buzzer
char f_pause=0;//пауза
char f_keypres=0;//состояние клавиши
char f_expectation=1;//вход в режим ожидания
char f_protection=0;//вход в режим охраны
char f_indication=0;//общая индикация
void interrupt other(void)
{
int i=0;
if (TMR2IF==1)
{
//обработка клавиатуры
key_seconds++;
if (key_seconds›=20)
{
for(;;)
{
if (RB4==1 & RB5==1 & RB6==1 & RB7==1) f_keypres=0,f_buzzer=0;
if (f_keypres==0)
{
RB3=1,RB1=0;
if (RB4==0) {key=0x31;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB5==0) {key=0x34;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB6==0) {key=0x37;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB7==0) {key=0x2a;f_keypres=1;f_buzzer=1; Keypres();break;}
RB1=1,RB2=0;
if (RB4==0) {key=0x32;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB5==0) {key=0x35;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB6==0) {key=0x38;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB7==0) {key=0x30;f_keypres=1;f_buzzer=1; Keypres();break;}
RB2=1,RB3=0;
if (RB4==0) {key=0x33;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB5==0) {key=0x36;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB6==0) {key=0x39;f_keypres=1;f_buzzer=1; Keypres();break;}
else if (RB7==0) {key=0x23;f_keypres=1;f_buzzer=1; Keypres();break;}
}
break;
}
key_seconds=0;
}
//зедержка для функции Pause
if (f_pause==1) seconds_1++;
//общая индикация
if (f_indication==0) RE1=0, seconds_2=0;
if (f_indication==1) RE1=1, seconds_2=0;
//buzzer
if (f_buzzer==0) RB0=0;
if (f_buzzer==1) RB0=1;
TMR2IF=0;
}
}
int main()
{
int i=0;
__CONFIG(HS & PWRTDIS & WDTDIS & BORDIS & LVPDIS);
STATUS=0x00;
RCSTA=0b10010000;//настройка приемника uart
TXSTA=0b00100100;//настройка передатчика uart
SPBRG=10;// скорость uart 57600 baund
INTCON=0b11000000;//разрешения прирываний
T2CON=0b00001110;//предделитель TMR2 256
RCIE=1;//прерывания от приемника uart
TMR2IE=1;//прерывания от TMR2
ADCON1=0b00001001;;//выключаем компараторы
TRISA=0b00101111;//настройка порта A
TRISB=0b11110000;//настройка порта В
TRISC=0b10011111;//настройка порта C
TRISD=0b00000000;//настройка порта D
TRISE=0b00000101;//настройка порта E
PORTD=0b00000000;//значение порта D
RB0=0;//buzzer
RB1=1;//клавиатура
RB2=1;//клавиатура
RB3=1;//клавиатура
RE1=0;//индикатор состаяния
ReadStandartSetings();
Pause(2,1);
f_expectation=1;
for(;;)
{
if (f_expectation==1) Expectation();
if (f_protection==1) Protection();
}
}
void Expectation(void)
{
f_indication=0;//индикация выключена
while (f_expectation==1) continue;
return;
}
void Protection(void)
{
f_indication=1;//включаем индикацию
while (f_protection==1) continue;
return;
}
void Keypres(void)
{
int i=0;
if (f_expectation==1 | f_protection==1)
{
if (key==setings[pass_exp]) pass_exp++;
else pass_exp=0;
if (pass_exp==4 & f_expectation==1)
{
f_expectation=0;
f_protection=1;
pass_exp=0;
return;
}
if (pass_exp==4 & f_protection==1)
{
f_expectation=1;
f_protection=0;
pass_exp=0;
return;
}
}
}
void Pause(int time, int divider)
{
seconds_1=0;//обнуления переменной таймера TMR0
f_pause=1;
if (divider==1)
{
while (seconds_1‹(time*305)) continue;//ждем
}
if (divider==0)
{
while (seconds_1‹(time*30)) continue;//ждем
}
f_pause=0;
return;
}
void ReadStandartSetings(void)
{
char adress=0x00;
int i=0;
setings[0]=0x31;
setings[1]=0x32;
setings[2]=0x33;
setings[3]=0x34;
for (;i‹4;i++) EEPROM_WRITE(adress++, setings[i]);
RC5=1;
return;
} |
|
|
|
|
07.10.2007, 19:15
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
Я скомпилировал исходник, код у меня получился такой же, как и Ваш. Не должна вешаться пауза, должен прописываться епром и я склоняюсь к мысли о том, что неисправен контроллер. Не уверен насчет кода для компараторов - мало с ними работал, не было необходимости. И относительно длинных выражений на электрониксе было, что новый хайтек плохо воспринимает.
Пропишите часть программы в контроллер - что он тогда скажет ?
Хотя и так уже по минимуму обрезали... Вот когда нужен исд2..
|
|
|
|
07.10.2007, 22:31
|
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
А что такое исд2? 
Да закажу ка я сначало еще пару контроллеров, апотом уже буду делать выводы.
|
|
|
|
08.10.2007, 10:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
http://www.microchip.ua/index.php?pa...p&pz=microchip
http://www.microchip.ua/index.php?pa...p&pz=microchip
https://kazus.run/forum/topics/8349.html
И замечания по коду -
не открывайте по уарту одновременно прерывания по приему и передаче - используйте асинхронный режим.
Вывод TX настраивается (TRIS) не на передачу, а на прием.
Слишком сильно доверяете епрому - информация периодически будет портиться. В жизни - насколько я заметил - разработчики стараются ее не использовать - вплоть до установки 24с рядом с контроллером.
Я, в общем, пользую, но информацию прописываю в 3 области и закрываю контрольной суммой. При несовпадении - перезапись всех областей
|
Код:
|
void ep_read(void)
{
unsigned char data,crc1;
unsigned char de;
unsigned char a1,a2,a3;
data=eeprom_read(e_adr_1); // читаю свой байт из епром
crc1=eeprom_read(e_adr_1+1); // читаю контрольную сумму к нему
de=crc(data); // снимаю контрольную сумму с прочитанного
if (crc(data) == crc1) // сверяю кс
{
a1=1; // прошло - первая запись в норме
test=data; // результату можно верить
}
else a1=0; // иначе фиксируем ошибку
data=eeprom_read(e_adr_2);
crc1=eeprom_read(e_adr_2+1);
if (crc(data) == crc1)
{
a2=1;
test=data;
}
else a2=0;
data=eeprom_read(e_adr_3);
crc1=eeprom_read(e_adr_3+1);
if (crc(data) == crc1)
{
a3=1;
test=data;
}
else a3=0;
if (! (a1 & a2 & a3)) // если хоть одна область
{ // не совпала
ep_save(test); // перезапись всего
}
} |
|
|
|
|
08.10.2007, 13:43
|
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
|
Цитата:
|
|
Слишком сильно доверяете епрому - информация периодически будет портиться
|
А портится она будет, в процесе чтения или записи, или само по себе?
Дело в том что она туда будет записываться очень редко, а вот считываться часто.
А по поводу всех инициализаций, я практически все взял с проги под pic16f628, у меня на нем уже есть устройство которое работает безотказно.
А на счет того что не выполняется основная программа, все таки возможно что мой контроллер подгорел? Дело в том что у меня програматор упал на провод 12В именно питанием контроллера, один контроллер в нем у меня не работает вообще, а второй возможно то же попал под это чудо, но он записывается, читается, и работает так как я описывал выше. Что скажете по этому поводу, возможно ли неправельная работа контроллера, или он или работает или вообще не работает?
|
|
|
|
08.10.2007, 14:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
|
|
Сообщение от maxNTF
|
А портится она будет, в процесе чтения или записи, или само по себе?
Дело в том что она туда будет записываться очень редко, а вот считываться часто.
|
При включении/отключении затирается. Где-то спасает супервизор питания, но я бы не стал так уж сильно на это рассчитывать.
|
Сообщение от maxNTF
|
|
А по поводу всех инициализаций, я практически все взял с проги под pic16f628, у меня на нем уже есть устройство которое работает безотказно.
|
|
Сообщение от urry
|
|
Вывод TX настраивается (TRIS) не на передачу, а на прием.
|
Действительно, проверил на своем проекте, даже если перевести ногу на выход, то tx все равно работает.
Но в даташите сказано - на вход, так что у меня идей включить по- другому не возникало. В самлах тоже
|
Код:
|
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
#define init_comms()
RX_PIN = 1;
TX_PIN = 1; |
|
Сообщение от maxNTF
|
|
А на счет того что не выполняется основная программа, все таки возможно что мой контроллер подгорел? Дело в том что у меня програматор упал на провод 12В именно питанием контроллера, один контроллер в нем у меня не работает вообще, а второй возможно то же попал под это чудо, но он записывается, читается, и работает так как я описывал выше. Что скажете по этому поводу, возможно ли неправельная работа контроллера, или он или работает или вообще не работает?
|
Я бы еще, для очистки совести, объявил, что маин - не интовская функция, а воид. Здесь не вижуал си, аргументы не передаются. И я бы подумал, что все произошло гораздо раньше, когда с 12 вольтами вошли в низковольтовое программирование. Но опять - проверить не могу, именно такого контроллера у меня сейчас нет.
|
|
|
|
08.10.2007, 18:53
|
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
|
Цитата:
|
|
Я, в общем, пользую, но информацию прописываю в 3 области и закрываю контрольной суммой
|
Да вот так засада, не знал что память в пиках не надежная. А какой % приблизительно стираимости памяти?
К сожалению добавить внешнюю память в данный прект уже не удастся, так что я наверно буду дублировать дапись, памяти вроде хватает, и буду делать контрольные суммы, если где то всплывет ошибка буду читать из копии.
Я думаю стиреться одни и те же данные в разных ячейках одновременно менее вероятно А?
|
|
|
|
08.10.2007, 22:59
|
|
|
Частый гость
Регистрация: 02.04.2007
Сообщений: 37
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
|
Сообщение от maxNTF
|
|
Да вот так засада, не знал что память в пиках не надежная. А какой % приблизительно стираимости памяти?
|
Процесс порчи ячеек EEPROM связан с медленным нарастанием напряжения питания.
Питание начинает нарастать, контроллер запускается (но напряжение еще не достигло номинального), начинается процесс инициализации переменных и как правило программа лезет в EEPROM за данными, вот тут может возникнуть неоднозначность. Логика работы с ЕЕПРОМом операцию чтения может распознать как операцию записи (из-за низкого напряжения) и как следствие имеем испорченную ячейку.
В качестве решения могу порекомендовать использовать внешний супервизор питания (сам ставлю MAX809 - дешево и сердито  ), или в начале программы делать задержку на несколько десятков милисекунд.
|
|
|
|
08.10.2007, 23:07
|
|
|
Частый гость
Регистрация: 02.04.2007
Сообщений: 37
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Не выпоняется основной код в PIC16F877A
|
Сообщение от maxNTF
|
|
А вот в жизни работает только то что обрабатывается в прерываниях, а основной кодж после инициализации делает несколько действий и зависает.
|
попробуйте воспользоваться действиями, описанными здесь.
http://www.microchip.su/showthread.php?t=1465#16
|
Цитата:
|
|
Возможно ли что не рабочий контроллер,
|
А вот это врядли
|
Цитата:
|
|
В данном коде клавиатура работает идеально, и если индикаторо переключать в прерывании все работает, а вот в основном коде как у меня не работает.
|
ну первое что бросилось в глаза, это бесконечный цикл в прерываниях.
[/quote]
|
|
|
|
09.10.2007, 08:56
|
|
|
Временная регистрация
Регистрация: 20.08.2005
Сообщений: 53
Сказал спасибо: 4
Сказали Спасибо 25 раз(а) в 21 сообщении(ях)
|
877A
По поводу надежности EEPROM в PIC16F877A
Не храните данных в нулевой ячейке EEPROM.
На 877А делал несколько проектов. Работают
несколько лет, круглосуточно, в производственных
условиях.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:37.
|
|