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

 
 
> Светофор в "Си"для контроллера с 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
aesok
сообщение Jan 31 2009, 16:24
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(konstatinopol @ Jan 31 2009, 18:01) *
Анатолий нащёт того чтобы обьявить cntr в SIGNAL(SIG_OVERFLOW0) точно я незнаю, но мы всегда её обьвляли до main(). Возможно и грамотнее но мы задаём ей значение в main() равное 28.


Ваш пример:

CODE
short cntr = 0;

int main()
{
...
cntr = 28;
...
}

SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}



Чем это плохо:
1. Объявление, инициализация и использование разнесены далеко по тексту
программы. Это ухудшает сопровождение программы. В С нет необходимости
инициализировать нулем глобальные переменные, по стандарту это сделает
компилятор. То есть можно просто написать "short cntr;" и в cntr будет 0 перед
входом в main.

Также Вы можете инициализировать глобальные переменные при объявлении любым
значением:
CODE
short cntr = 28;

SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}



2. Представьте что ваш проект будет увеличиваться и вам потребуется второй
таймер пишем:
CODE
short cntr;
... много текста ....
short cntr; // добавляем

int main()
{
...
cntr = 28;
... много текста ....
cntr = 144; // добавляем
...
}

SIGNAL(SIG_OVERFLOW0){
if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}

SIGNAL(SIG_OVERFLOW1){
if(!(cntr--))
{
TCNT0=244;
cntr=144;
if(a==0)
lampochki();
}
}


Но это неправильно, cntr будет изменяться сразу из двух обработчиков
прерываний, и придется переименовывать cntr в cntr_for_timer0 и добавлять
cntr_for_timer1. Для экономии своего времени на отладке проекта и
придумывании/написании имен переменых проще объявить cntr локальными
статическими переменными:

CODE
SIGNAL(SIG_OVERFLOW0){
static short cntr = 28;

if(!(cntr--))
{
TCNT0=244;
cntr=28;
if(a==0)
lampochki();
}
}

SIGNAL(SIG_OVERFLOW1){
static short cntr = 244;

if(!(cntr--))
{
TCNT0=244;
cntr=144;
if(a==0)
lampochki();
}
}


Здесь объявление, инициализация и использование находятся рядом, что
упрощает понимание и изменение кода. Этот код более безопасный, локальные
перемене cntr видны только внутри своих обработчиков SIGNAL(SIG_OVERFLOW0)
и SIGNAL(SIG_OVERFLOW1) и не могут быть изменены из других частей программы.

PS: Что означает static и чем локальная статическая переменная отличается от не статической прочтите в любой книге по языку С.

Анатолий.



Цитата(rvk @ Jan 31 2009, 18:44) *
Про задержку верно, только вместо 10000 поставить 100, этого должно с запасом хватить.


Время исполнения:
for(i = 0; i < 10000; i++);
или:
for(i = 0; i < 100; i++);
и даже:
for(i = 0; i < 10; i++);

На любом опримизирующем компиляторе одиноково и равно нулю.

Анатолий.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 31 2009, 19:40
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(aesok @ Jan 31 2009, 19:24) *
Время исполнения:
for(i = 0; i < 10000; i++);
или:
for(i = 0; i < 100; i++);
и даже:
for(i = 0; i < 10; i++);
На любом опримизирующем компиляторе одиноково и равно нулю.

Вовсе нет. Даже на Вашем любимом GCC. Зависит от способа объявления переменной i.
Она ведь может и квалификатор volatile иметь.
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
|- - _Pasha   Цитата(konstatinopol @ Jan 31 2009, 19:01...   Jan 31 2009, 15:25
||- - konstatinopol   Цитата(_Pasha @ Jan 31 2009, 19:25) То, ч...   Jan 31 2009, 15:37
||- - Сергей Борщ   Цитата(konstatinopol @ Jan 31 2009, 17:37...   Jan 31 2009, 16:16
|- - 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
|- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:30
Рейтинг@Mail.ru


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