|
Светофор в "Си"для контроллера с SIG_INTERRUPT0 |
|
|
|
Jan 31 2009, 12:18
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Такое дело надо спрограмировать светофор. Есть 2 микроконтроллера которые соединяются друг с другом и на каждый из них зашивается одна и таже программаю. Программа почти готова, но есть одна проблемка, у меня неправильно вызыватся SIG_INTERRUPT0. Буду ОЧЕНЬ благодарен любой помощи !!!! Зарание благодарю. Так выглядит борт :  CODE #include <stdint> #include <avr> #include <avr> #include <avr> #include <avr> // In/Outputs
short cntr = 0; int a=0; int b=0;
void lampochki() { if(PORTB==1) { PORTB=3; } else if(PORTB==3){ PORTB=4; }else if(PORTB==4) { PORTB=2; }else if(PORTB==2) { PORTB=1; a=1; PORTC = 1; //long i; //for(i = 0; i < 1000000; i++); } PORTC = 0; }
int main() { DDRB=7; DDRD=0; PORTB=1; DDRC = 7; PORTC=0; TCNT0 = 244; cntr = 28; TCCR0 = 5; TIMSK = 1; GICR = 64; // interrupt port D0 ein MCUCR = 1; // oder 2 sei();
while(1){} }
SIGNAL(SIG_OVERFLOW0){ if(!(cntr--)) { TCNT0=244; cntr=28; if(a==0) lampochki(); } }
SIGNAL(SIG_INTERRUPT0){ a=0; }
|
|
|
|
|
 |
Ответов
|
Jan 31 2009, 15:01
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
_Pasha что вы подразумеваете под " программа очень кривая и страшная"?? Как она написанна, отредоктированна или что то в ней не потдаётся логике. что значит обьявить volatile?? Код volatile short cntr = 0; volatile int a=0; Видимо так. Анатолий нащёт того чтобы обьявить cntr в SIGNAL(SIG_OVERFLOW0) точно я незнаю, но мы всегда её обьвляли до main(). Возможно и грамотнее но мы задаём ей значение в main() равное 28. Возможно я неправильно выразился нащёт "SIG_INTERRUPT0". Дело в том что 2 борта соединяются и на них зашивается почти одна и таже программа, единственное отличие между программами это первое значение "а". При запуске у обоих бортов зажигаются крассные лампочки. Тот борт у которого "а=0" зажигает лампочки в таком порядке : крассная-> крассно-желтая -> зелёная -> желтая -> крассная и сажает значение а=1 и останавливается, но в тот момент когда он останавливается(ботр) в SIG_INTERRUPT0 он посылает второму борту сигнал и тот сажает своё а=0 и проходит цепочку так же как и первый. Такая логика моего светофора. Мне кажется что в программе неправильно написал принцип отправления а=0. В моей версии avr-gcc ещё используется SIGNAL(), на других программах уже проверенно. Вот принцеп соединения бортов, вроде правильно.
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 31 2009, 15:25
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(konstatinopol @ Jan 31 2009, 19:01)  _Pasha что вы подразумеваете под " программа очень кривая и страшная"?? Мне кажется что в программе неправильно написал принцип отправления а=0. То, что мы сейчас делаем - как раз следствие "кривоватости" void lampochki()Попробуйте кроме всего сказанного выше вернуть задержку, только зачем Вам такая огромная задержка? Код PORTB=1; a=1; PORTC = 1; //long i; //for(i = 0; i < 1000000; i++); } PORTC = 0; И еще. Настройка периферии не через символические имена сильно напрягает, потому что надо лазать в инфу. Т.е. мало кто захочет смотреть и проверять, все ли правильно установлено. Так что вот это GICR = 64; не читабельно.
|
|
|
|
|
Jan 31 2009, 15:37
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 31-01-09
Пользователь №: 44 210

|
Цитата(_Pasha @ Jan 31 2009, 19:25)  То, что мы сейчас делаем - как раз следствие "кривоватости" void lampochki() Попробуйте кроме всего сказанного выше вернуть задержку, только зачем Вам такая огромная задержка?
И еще. Настройка периферии не через символические имена сильно напрягает, потому что надо лазать в инфу. Т.е. мало кто захочет смотреть и проверять, все ли правильно установлено. Так что вот это GICR = 64; не читабельно. Под вернуть задержку вы подразумиваете это?? Код PORTB=1; a=1; PORTC = 1; long i; for(i = 0; i < 10000; i++); } PORTC = 0; А что нащёт GICR = 64; , препод так требует, да и я подругому не умею.
|
|
|
|
|
Jan 31 2009, 16:16
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(konstatinopol @ Jan 31 2009, 17:37)  А что нащёт GICR = 64; , препод так требует, да и я подругому не умею. Объсните преподу, что он не прав. Заодно и лишний балл (если препод адекватный) заработаете. Не умеете - учитесь, ведь именно этому (учиться) и должны учить в институте, не так ли?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
konstatinopol Светофор в "Си"для контроллера с SIG_INTERRUPT0 Jan 31 2009, 12:18 _Pasha Цитата(konstatinopol @ Jan 31 2009, 15:18... Jan 31 2009, 13:55 aesok Цитата(_Pasha @ Jan 31 2009, 16:55) Надо ... Jan 31 2009, 14:09 Сергей Борщ Цитата(konstatinopol @ Jan 31 2009, 14:18... Jan 31 2009, 14:19 aesok Цитата(konstatinopol @ Jan 31 2009, 18:01... Jan 31 2009, 16:24  konstatinopol Спасибо Анатолий, теперь я понял что вы имели введ... Jan 31 2009, 16:29  rvk Цитата(aesok @ Jan 31 2009, 19:24) Время ... Jan 31 2009, 16:58   singlskv Цитата(rvk @ Jan 31 2009, 19:58) Вот тако... Jan 31 2009, 21:46  Qwertty Цитата(aesok @ Jan 31 2009, 19:24) Время ... Jan 31 2009, 19:40   aesok Цитата(Qwertty @ Jan 31 2009, 22:40) Вовс... Jan 31 2009, 21:00 rvk Если у Вас трудности с прерыванием, зачем его вооб... Jan 31 2009, 15:33 rvk Про задержку верно, только вместо 10000 поставить ... Jan 31 2009, 15:44 konstatinopol Такая ситуация что в данный момент я немогу опробо... Jan 31 2009, 16:18 Rst7 Цитатаfor(i=0;i<100;i++){
PORTC=rand();
}
Не, ... Jan 31 2009, 22:07 singlskv Цитата(Rst7 @ Feb 1 2009, 01:07) Вообще-т... Jan 31 2009, 22:13 Rst7 Цитатачерез пару страничек обсуждений
Будем счита... Jan 31 2009, 22:20 singlskv Цитата(Rst7 @ Feb 1 2009, 01:20) Будем сч... Jan 31 2009, 22:23 delamoure 2Rst7
"for(i=0;i<100;i++){*((volatile int*... Feb 1 2009, 01:14 konstatinopol Цитата(singlskv @ Feb 1 2009, 01:13) Ну в... Feb 1 2009, 13:12 SysRq Цитата(konstatinopol @ Feb 1 2009, 16:12)... Feb 1 2009, 13:45 rvk Цитата(konstatinopol @ Feb 1 2009, 16:12)... Feb 1 2009, 15:13 konstatinopol Всё работает не так как нужно, а именно :
первый б... Feb 1 2009, 15:30 aesok Зачем Вы переменую "a" сделали локальной... Feb 1 2009, 15:44 aesok У Вас прерывание настроенно по обеим фронтам MCUCR... Feb 1 2009, 22:11 konstatinopol Цитата(aesok @ Feb 1 2009, 18:44) Зачем В... Feb 1 2009, 15:54 SysRq А у вас ATMega8? Или 48? Feb 1 2009, 17:25 konstatinopol Цитата(SysRq @ Feb 1 2009, 21:25) Если у ... Feb 1 2009, 17:36 SysRq Я углядел что на картинке m48 и выше, а m8 не заме... Feb 1 2009, 17:52 konstatinopol Цитата(SysRq @ Feb 1 2009, 20:52) Я угляд... Feb 1 2009, 18:04 konstatinopol Цитата(aesok @ Feb 2 2009, 01:11) У Вас п... Feb 1 2009, 22:15 aesok Цитата(konstatinopol @ Feb 2 2009, 01:15)... Feb 1 2009, 22:34 konstatinopol Цитата(aesok @ Feb 2 2009, 01:34) Биты IS... Feb 1 2009, 23:10 _Pasha Цитата(konstatinopol @ Feb 2 2009, 03:10)... Feb 1 2009, 23:27  SysRq Цитата(_Pasha @ Feb 2 2009, 02:27) Если б... Feb 2 2009, 00:05 konstatinopol Господа благодарю всех за содействие программа раб... Feb 2 2009, 13:09 aesok Код#include <stdint.h>
#include <avr/i... Feb 2 2009, 17:28 konstatinopol Цитата(aesok @ Feb 2 2009, 21:28) Ах........ Feb 2 2009, 18:24
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|