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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
aesok
сообщение Jan 31 2009, 21:00
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 31 2009, 21:46
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 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();
}
smile.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 31 2009, 22:07
Сообщение #18


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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 присутствует smile.gif

Хотя, это конечно шутка. Вообще-то такая затычка имеет право на существование в таком виде
Код
for(i=0;i<100;i++){SREG;}


Разве что в плюсах обматерит, где-то тут целый топик по этому поводу был.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 31 2009, 22:13
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Rst7 @ Feb 1 2009, 01:07) *
Вообще-то такая затычка имеет право на существование в таком виде
Код
for(i=0;i<100;i++){SREG;}
Ну вот, Вы всю "малину" иcтоптали, я то хотел автора сего "шедевра" задержек подвести через пару
страничек обсуждений smile.gif к мысли что нужно SREG;
А тут Вы... sad.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 31 2009, 22:20
Сообщение #20


Йа моск ;)
******

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



Цитата
через пару страничек обсуждений


Будем считать, что я Вас спас от бана за флуд. Так что не жалуйтесь wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 31 2009, 22:23
Сообщение #21


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Rst7 @ Feb 1 2009, 01:20) *
Будем считать, что я Вас спас от бана за флуд. Так что не жалуйтесь wink.gif
Спасибо... beer.gif
Go to the top of the page
 
+Quote Post
delamoure
сообщение Feb 1 2009, 01:14
Сообщение #22


Частый гость
**

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



2Rst7
"for(i=0;i<100;i++){*((volatile int*)i)=rand();}"

Ну нельзя гнать так ночью.
Посмотрел на конструкцию, мысль: все понятно, но что это за "{" и "}"...
Думал секунд 10 smile.gif
Пипец, иду спать...


--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
Go to the top of the page
 
+Quote Post
konstatinopol
сообщение Feb 1 2009, 13:12
Сообщение #23


Участник
*

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



Цитата(singlskv @ Feb 1 2009, 01:13) *
Ну вот, Вы всю "малину" иcтоптали, я то хотел автора сего "шедевра" задержек подвести через пару
страничек обсуждений smile.gif к мысли что нужно SREG;
А тут Вы... sad.gif


Товарищи а что собственно такое это SREG ??? Облазил гугл, форум посмотрел, ничего дельного не нашел.
Есть догадки, но не осмеливаюсь произнести их в слух т.к слишком глупые догатки....
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 1 2009, 13:45
Сообщение #24


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(konstatinopol @ Feb 1 2009, 16:12) *
Товарищи а что собственно такое это SREG ???

Регистр состояния smile.gif http://www.atmel.ru/Articles/Atmel15.htm
Go to the top of the page
 
+Quote Post
rvk
сообщение Feb 1 2009, 15:13
Сообщение #25


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
konstatinopol
сообщение Feb 1 2009, 15:30
Сообщение #26


Участник
*

Группа: Новичок
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 1 2009, 15:44
Сообщение #27


Знающий
****

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



Зачем Вы переменую "a" сделали локальной???????

Она то как раз должна быть глобальной и volatile.

Анатолий.

Сообщение отредактировал aesok - Feb 1 2009, 15:47
Go to the top of the page
 
+Quote Post
konstatinopol
сообщение Feb 1 2009, 15:54
Сообщение #28


Участник
*

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



Цитата(aesok @ Feb 1 2009, 18:44) *
Зачем Вы переменую "a" сделали локальной???????

Она то как раз должна быть глобальной и volatile.

Анатолий.


Теперь она глобальная и volatile, но всё же не идёт программка ...
В чём может быть проблемма???? Я немогу найти ошибку.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 1 2009, 17:25
Сообщение #29


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



А у вас ATMega8? Или 48?

Сообщение отредактировал SysRq - Feb 1 2009, 17:28
Go to the top of the page
 
+Quote Post
konstatinopol
сообщение Feb 1 2009, 17:36
Сообщение #30


Участник
*

Группа: Новичок
Сообщений: 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. Страна Германия.
Причина редактирования: Уменьшение цитируемого сообщения.
Go to the top of the page
 
+Quote Post

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

 


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


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