реклама на сайте
подробности

 
 
> Светофор в "Си"для контроллера с SIG_INTERRUPT0
konstatinopol
сообщение Jan 31 2009, 12:18
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
konstatinopol
сообщение Jan 31 2009, 15:01
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 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(), на других программах уже проверенно.

Вот принцеп соединения бортов, вроде правильно.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 31 2009, 15:25
Сообщение #3


;
******

Группа: Участник
Сообщений: 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; не читабельно.
Go to the top of the page
 
+Quote Post
konstatinopol
сообщение Jan 31 2009, 15:37
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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; , препод так требует, да и я подругому не умею.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 31 2009, 16:16
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016