Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Не выпоняется основной код в PIC16F877A

Непрочитано 07.10.2007, 14:36  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию Не выпоняется основной код в 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;
}
Реклама:
maxNTF вне форума  
Непрочитано 07.10.2007, 19:15  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Я скомпилировал исходник, код у меня получился такой же, как и Ваш. Не должна вешаться пауза, должен прописываться епром и я склоняюсь к мысли о том, что неисправен контроллер. Не уверен насчет кода для компараторов - мало с ними работал, не было необходимости. И относительно длинных выражений на электрониксе было, что новый хайтек плохо воспринимает.
Пропишите часть программы в контроллер - что он тогда скажет ?
Хотя и так уже по минимуму обрезали... Вот когда нужен исд2..
urry вне форума  
Непрочитано 07.10.2007, 22:31  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию

А что такое исд2?
Да закажу ка я сначало еще пару контроллеров, апотом уже буду делать выводы.
maxNTF вне форума  
Непрочитано 08.10.2007, 10:44  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

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);  // перезапись всего
	} 
}
urry вне форума  
Непрочитано 08.10.2007, 13:43  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию

Цитата:
Слишком сильно доверяете епрому - информация периодически будет портиться
А портится она будет, в процесе чтения или записи, или само по себе?
Дело в том что она туда будет записываться очень редко, а вот считываться часто.

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

А на счет того что не выполняется основная программа, все таки возможно что мой контроллер подгорел? Дело в том что у меня програматор упал на провод 12В именно питанием контроллера, один контроллер в нем у меня не работает вообще, а второй возможно то же попал под это чудо, но он записывается, читается, и работает так как я описывал выше. Что скажете по этому поводу, возможно ли неправельная работа контроллера, или он или работает или вообще не работает?
maxNTF вне форума  
Непрочитано 08.10.2007, 14:52  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Сообщение от 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 вольтами вошли в низковольтовое программирование. Но опять - проверить не могу, именно такого контроллера у меня сейчас нет.
urry вне форума  
Непрочитано 08.10.2007, 18:53  
maxNTF
Вид на жительство
 
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
maxNTF на пути к лучшему
По умолчанию

Цитата:
Я, в общем, пользую, но информацию прописываю в 3 области и закрываю контрольной суммой
Да вот так засада, не знал что память в пиках не надежная. А какой % приблизительно стираимости памяти?
К сожалению добавить внешнюю память в данный прект уже не удастся, так что я наверно буду дублировать дапись, памяти вроде хватает, и буду делать контрольные суммы, если где то всплывет ошибка буду читать из копии.
Я думаю стиреться одни и те же данные в разных ячейках одновременно менее вероятно А?
maxNTF вне форума  
Непрочитано 08.10.2007, 22:59  
ices
Частый гость
 
Регистрация: 02.04.2007
Сообщений: 37
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
ices на пути к лучшему
По умолчанию

Сообщение от maxNTF
Да вот так засада, не знал что память в пиках не надежная. А какой % приблизительно стираимости памяти?
Процесс порчи ячеек EEPROM связан с медленным нарастанием напряжения питания.
Питание начинает нарастать, контроллер запускается (но напряжение еще не достигло номинального), начинается процесс инициализации переменных и как правило программа лезет в EEPROM за данными, вот тут может возникнуть неоднозначность. Логика работы с ЕЕПРОМом операцию чтения может распознать как операцию записи (из-за низкого напряжения) и как следствие имеем испорченную ячейку.
В качестве решения могу порекомендовать использовать внешний супервизор питания (сам ставлю MAX809 - дешево и сердито ), или в начале программы делать задержку на несколько десятков милисекунд.
ices вне форума  
Непрочитано 08.10.2007, 23:07  
ices
Частый гость
 
Регистрация: 02.04.2007
Сообщений: 37
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
ices на пути к лучшему
По умолчанию Re: Не выпоняется основной код в PIC16F877A

Сообщение от maxNTF
А вот в жизни работает только то что обрабатывается в прерываниях, а основной кодж после инициализации делает несколько действий и зависает.
попробуйте воспользоваться действиями, описанными здесь.

http://www.microchip.su/showthread.php?t=1465#16

Цитата:
Возможно ли что не рабочий контроллер,
А вот это врядли

Цитата:
В данном коде клавиатура работает идеально, и если индикаторо переключать в прерывании все работает, а вот в основном коде как у меня не работает.
ну первое что бросилось в глаза, это бесконечный цикл в прерываниях.
[/quote]
ices вне форума  
Непрочитано 09.10.2007, 08:56  
vvd
Временная регистрация
 
Регистрация: 20.08.2005
Сообщений: 53
Сказал спасибо: 4
Сказали Спасибо 25 раз(а) в 21 сообщении(ях)
vvd на пути к лучшему
По умолчанию 877A

По поводу надежности EEPROM в PIC16F877A
Не храните данных в нулевой ячейке EEPROM.
На 877А делал несколько проектов. Работают
несколько лет, круглосуточно, в производственных
условиях.
vvd вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Применение PIC16F877A kostyan-sokolov Микроконтроллеры, АЦП, память и т.д 12 24.04.2009 08:17
преобразователь код-код zazan111 TTL и CMOS логика 18 05.01.2009 06:11
RA4 в PIC16F877A maxNTF Микроконтроллеры, АЦП, память и т.д 8 06.02.2008 23:28
pic16f877a + DV-16230 Mozart Микроконтроллеры, АЦП, память и т.д 3 23.02.2006 21:50
PIC16F877A pawelk Микроконтроллеры, АЦП, память и т.д 17 28.05.2005 23:54


Часовой пояс GMT +4, время: 08:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.