|
|
  |
Светофор в "Си"для контроллера с SIG_INTERRUPT0 |
|
|
|
Jan 31 2009, 21:00
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Qwertty @ Jan 31 2009, 22:40)  Вовсе нет. Даже на Вашем любимом GCC. Зависит от способа объявления переменной i. Она ведь может и квалификатор volatile иметь. Я не ипытываю никаких чувств к GCC. В контексте данного поста переменная i объявленна как long. Время задержки удобнее указывать или в секундах (ms, us) и использовать макросы _delay_ms, _delay_us или в машиных циклах используя _delay_loop_1(uint8_t __count), _delay_loop_2(uint16_t __count) и начиная с WinAVR20081205 __builtin_avr_delay_cycles(uint32_t __count), а не в попугаях меняющихся в зависимости от версии компилятора и уровня оптимизации. Анатолий.
Сообщение отредактировал aesok - Jan 31 2009, 21:09
|
|
|
|
|
Jan 31 2009, 21:46
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(rvk @ Jan 31 2009, 19:58)  Вот такой код сработает при любом уровне оптимизации. for(i=0;i<100;i++){ PORTC=1; } код задержки однозначно в мемориз... и даже лучше в такой интерпретации: Код for(i=0;i<100;i++){ PORTC=rand(); }
|
|
|
|
|
Jan 31 2009, 22:07
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата for(i=0;i<100;i++){ PORTC=rand(); } Не, не круто. Предлагаю зажечь так Код for(i=0;i<100;i++){*((volatile int*)i)=rand();} Все как любят, volatile присутствует  Хотя, это конечно шутка. Вообще-то такая затычка имеет право на существование в таком виде Код for(i=0;i<100;i++){SREG;} Разве что в плюсах обматерит, где-то тут целый топик по этому поводу был.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 31 2009, 22:13
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Rst7 @ Feb 1 2009, 01:07)  Вообще-то такая затычка имеет право на существование в таком виде Код for(i=0;i<100;i++){SREG;} Ну вот, Вы всю "малину" иcтоптали, я то хотел автора сего "шедевра" задержек подвести через пару страничек обсуждений  к мысли что нужно SREG; А тут Вы...
|
|
|
|
|
Feb 1 2009, 01:14
|

Частый гость
 
Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406

|
2Rst7 "for(i=0;i<100;i++){*((volatile int*)i)=rand();}" Ну нельзя гнать так ночью. Посмотрел на конструкцию, мысль: все понятно, но что это за "{" и "}"... Думал секунд 10  Пипец, иду спать...
--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
|
|
|
|
|
Feb 1 2009, 13:12
|
Участник

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

|
Цитата(singlskv @ Feb 1 2009, 01:13)  Ну вот, Вы всю "малину" иcтоптали, я то хотел автора сего "шедевра" задержек подвести через пару страничек обсуждений  к мысли что нужно SREG; А тут Вы...  Товарищи а что собственно такое это SREG ??? Облазил гугл, форум посмотрел, ничего дельного не нашел. Есть догадки, но не осмеливаюсь произнести их в слух т.к слишком глупые догатки....
|
|
|
|
|
Feb 1 2009, 15:13
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067

|
Цитата(konstatinopol @ Feb 1 2009, 16:12)  Товарищи а что собственно такое это SREG ??? Облазил гугл, форум посмотрел, ничего дельного не нашел. Есть догадки, но не осмеливаюсь произнести их в слух т.к слишком глупые догатки.... for(i=0;i<100;i++){SREG;} Означает прочитать 100 раз содержимое регистра SREG в никуда.
Сообщение отредактировал rvk - Feb 1 2009, 15:46
|
|
|
|
|
Feb 1 2009, 15:30
|
Участник

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

|
Всё работает не так как нужно, а именно : первый борт пробегает все лампочки и останавливается из-за а=1, но второй борт не получает а=0 и получается так что они оба стоят. Это происходит при задержке и без ней и даже с Код for(i=0;i<100;i++){SREG;} Я незнаю что ещё изменить в программе. На данный момент она выглядит так. CODE #include <stdint.h> #include <avr/io.h> #include <avr/wdt.h> #include <avr/signal.h> #include <avr/interrupt.h>
void lampochki() { if(PORTB==1) { cntr=14; PORTB=3; } else if(PORTB==3) { PORTB=4; cntr=28; } else if(PORTB==4) { PORTB=2; cntr=14; } else if(PORTB==2) { PORTB=1; cntr=28; a=1; PORTC = 1; long i; for(i = 0; i < 100; i++){ SREG; } } PORTC = 0; }
int main() { DDRB=7; DDRD=0; PORTB=1; DDRC = 7; PORTC=0; TCNT0 = 244; TCCR0 = 5; TIMSK = 1; GICR = 64; // interrupt port D0 ein MCUCR = 1; // oder 2 sei();
while(1){} }
SIGNAL(SIG_OVERFLOW0){ static short cntr = 28; static int a=0; if(!(cntr--)) { TCNT0=244; if(a==0) lampochki(); } }
SIGNAL(SIG_INTERRUPT0){ a=0; }
|
|
|
|
|
Feb 1 2009, 15:54
|
Участник

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

|
Цитата(aesok @ Feb 1 2009, 18:44)  Зачем Вы переменую "a" сделали локальной???????
Она то как раз должна быть глобальной и volatile.
Анатолий. Теперь она глобальная и volatile, но всё же не идёт программка ... В чём может быть проблемма???? Я немогу найти ошибку.
|
|
|
|
|
Feb 1 2009, 17:36
|
Участник

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

|
Цитата(SysRq @ Feb 1 2009, 21:25)  Если у вас ATMega48 (исхожу из картинки), то этот кусок: является бредом каким-то (GICR вообще не существует, а с MCUCR выполняется часть процедуры переноса таблицы векторов прерываний). Дело в том что в предыдущих программах мы работали с GICR и MCUCR и всё работало, просто в данном случае я не уверен в правильности этих значений. А с EICRA , EIFR и EIMSK мы не работали, но если вы скажите что так правильнее то не буду спорить. Но всё же хотелось зделать программу с GICR и MCUCR. Точное название борта немогу дать, но на странице производителя стоит myAVR Board MK1 LPT. Страна Германия.
Причина редактирования: Уменьшение цитируемого сообщения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|