CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
dimmar
Открыл глаза
Сообщения: 78
Зарегистрирован: Чт июл 07, 2011 14:42:13

Re: CodeVision AVR в вопросах и ответах

Сообщение dimmar »

Аlex писал(а):

Код: Выделить всё

delay_ms(time);
не ? :)

Или так

Код: Выделить всё

void _delay(unsigned int ms){
while(ms--)  delay_ms(1);
}

.............
.............

_delay(time);


Что касается первого примера я так и делал, но видимо где-то косячил, раз на меня CodeVision ругался, и сейчас разобрался где. И в EEPROM все настройки пишутся и из него при инициализации всё читается.
Спасибо.
Но возник вот какой вопрос: Продолжительность импульса на максимуме у меня составляет 120ms и шаг изменения составляет 10ms. Откуда берутся эти значения, ведь я их нигде не прописывал? и как изменять диапазон и шаг настройки?
Что поиск рулит знаю. Забанен во всех поисковых системах.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Откуда берутся эти значения
Будем ждать обладателя магического шара.
Greymand
Родился
Сообщения: 5
Зарегистрирован: Пн окт 07, 2013 09:20:53

Re: CodeVision AVR в вопросах и ответах

Сообщение Greymand »

Глупый теоретический вопрос от начинающего:
Есть у нас программа:
1
2
3
5
N...
Есть прерывание.Допустим,программа дошла до шага номер 2 и сработало прерывание от таймера.Допустим,я плохой программист(а так оно и есть) и обработчик прерывания получился слишком долгий и за время его обработки в очередь встало другое прерывание.(или тоже самое-таймер "тикает" слишком быстро,обработчик слишком долгий).Обработали прерывание,вернулись на строчку 2...
Внимание,вопрос:Что будет дальше-МК ускачет сразу же по второму прерыванию или все-таки выполнит шаг программы №3 а уже потом пойдет обрабатывать следующее прерывание?
То есть чисто теоретически может ли МК все время гулять по прерываниям вообще не выполняя основную программу или все же он будет ее выполнять но очень медленно?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение ibiza11 »

Greymand, а причем здесь CodeVision? А вообще после обработки прерывания выполняется как минимум одна команда перед переходом в следующее прерывание.
Ставим плюсы: )
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Re: CodeVision AVR в вопросах и ответах

Сообщение Marchello »

Вот код мигания подчеркивающего курсора
lcd_gotoxy(x, y); delay_ms(150); _lcd_write_data(0x0e); delay_ms(150); _lcd_write_data(0x0c);

А как сделать чтобы курсор мигал одновременно в 2-х ячейках. нужно чтобы при корректировке даты и времени курсор подчеркивал не первое или второе число в дате и времени, а целое значение!

И еще вопрос, неужели мерцание курсора можно организовать только вышеуказанным способом!? В инструкции к контролеру KS0066U написано, что мерцание включается (blink on) при следующих значениях

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0___0___0___0___0__0___1___D__C___B

что соответствует _lcd_write_data(0x0f); но это не работает без _lcd_write_data(0x0c); т.е. включаем курсор и выключаем. А разве слово blink не означает что курсор должен сам мерцать. Я думал _lcd_write_data(0x0f) - курсор мерцает, _lcd_write_data(0x0c) курсор отключен. Поправьте меня!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

Greymand, в прерываниях надо стараться писать максимально локанично
остальное тебе ответил ibiza11
теоретически, твоя прога не должна гулять только по прерываниях, т.к. после каждого прерывания выполняется как минимум одна команда из основного цикла
Tell Me The Truth
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 0867532 »

Marchello писал(а):. . . lcd_gotoxy(x, y); delay_ms(150); _lcd_write_data(0x0e); delay_ms(150); _lcd_write_data(0x0c); . . .

Ну и фиг с ним, что мигает один раз.
поставь прерывание по таймеру, пару переменных флагов и всё.
а мигай сразу двумя так:
допустим у нас меняются часы(первые два слота):
lcd_gotoxy(0, 0); delay_ms(150); _lcd_write_data(0x0e); //зажигаем 1й
lcd_gotoxy(1, 0); #asm("NOP"); _lcd_write_data(0x0e); //зажигаем 2й
delay_ms(150); _lcd_write_data(0x0c); #asm("NOP"); //гасим 2й
lcd_gotoxy(0, 0); #asm("NOP"); _lcd_write_data(0x0c); //возвращаемся к первому и гасим его.
Не уверен что будет работать. можно задержки побольше (delay_us(300); пставить)
Да и курсор сам по себе на один разряд расчитан.
Если возникнут вопросы - посмотрите на мой аватар.
cas2010
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт апр 23, 2013 16:46:07

Re: CodeVision AVR в вопросах и ответах

Сообщение cas2010 »

Здрасте. А как объявить порты так чтобы я мог их прокрутить оператором for?
Допустим
#define port_0 PORTC.0
#define port_1 PORTC.1
#define port_2 PORTC.2
#define port_3 PORTC.3
#define port_4 PORTC.4
#define port_5 PORTC.5
#define port_6 PORTC.6
#define port_7 PORTC.7

А потом ниже

for (int i=0; i<8; i++) {
port_i=1;
delay_ms(1);
port_i=0;
};
port_i - переменная i это индекс определенного порта прокручивается оператором for.

Как так сделать? кодевижинавр выдает ошибку
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Если опрашивать только один порт, то через маску, в которой двигается единичка.
Если порты и биты вразнобой, то через массив указателей на порты и номера битов. Как это делается в CV, я к сожалению не в курсе.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: CodeVision AVR в вопросах и ответах

Сообщение ploop »

Допустим

Допустим, цель вы не озвучили, Аlex пытается включить телепатию :)
Во-первых, define - это тупая подстановка текста в листинг программы. #define port_0 PORTC.0 равносильно нажатию Ctrl+F, поиску в тексте "port_0", и замене на "PORTC.0".
Если надо сделать иначе - озвучьте задачу.
cas2010
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт апр 23, 2013 16:46:07

Re: CodeVision AVR в вопросах и ответах

Сообщение cas2010 »

Мне нужно в одной функции(процедура) с помощью оператора for(){};, последовательно, побитно включать и выключать порт B, т.е. не расписывать что должен включиться первый бит порта B, подождав отключиться, второй бит порта B включить подождав отключиться и т. д. до седьмого бита, а сделать внутри цикла for.
Другими словами мне нужно биты порта B объявить через X, а X это биты порта B, т.е. числа от 0-7, этот X считается внутри цикла for(X=0; X<8; X++)
{
PORTB.X=1;
delay_ms(200);
PORTB.X=0;
}
//цикл for побитно включает ПОРТB, но при таком синтаксисе у меня кодевиждавр пишет ошибку. Как правильно это написать?
Последний раз редактировалось Аlex Сб окт 12, 2013 11:41:51, всего редактировалось 1 раз.
Причина: -
cas2010
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт апр 23, 2013 16:46:07

Re: CodeVision AVR в вопросах и ответах

Сообщение cas2010 »

Аlex писал(а):Если опрашивать только один порт, то через маску, в которой двигается единичка.
Если порты и биты вразнобой, то через массив указателей на порты и номера битов. Как это делается в CV, я к сожалению не в курсе.

Покажите и первый и второй вариант на том компиляторе на котором вы можете, я попробую на кодевижне
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: CodeVision AVR в вопросах и ответах

Сообщение Garin »

Допустим

Код: Выделить всё

unsigned char port[8];
unsigned char i=0;

А потом ниже

Код: Выделить всё

for ( i=0; i<7; i++) {
port[i]=1;
delay_ms(200);
port[i]=0;
};

 PORTC.0 = port[0] ;
 PORTC.1 = port[1] ;
 PORTC.2 = port[2] ;
 PORTC.3 = port[3] ;
 PORTC.4 = port[4] ;
 PORTC.5 = port[5] ;
 PORTC.6 = port[6] ;
 PORTC.7 = port[7] ;


Как это делается в CV, я к сожалению не в курсе

Аlex я по вашим примерам тут многое что почерпнул, и эти же ваши примеры прекрасно все ложатся в CodeVisionAVR .
Отдельное большое спасибо вам (это я про примеры кода которые вы тут предоставляли) :beer:
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CodeVision AVR в вопросах и ответах

Сообщение uk8amk »

cas2010 писал(а):Мне нужно в одной функции(процедура) с помощью оператора for(){};, последовательно, побитно включать и выключать порт


Через операцию сдвига.

#define OUT_PORT PORTC

uint8_t i;
for(i=0; i<8; i++)
{
OUT_PORT=(1<<i);//set bit
delay_ms(1);
OUT_PORT&=~(1<<i);//clear bit
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Garin писал(а):Аlex я по вашим примерам тут многое что почерпнул, и эти же ваши примеры прекрасно все ложатся в CodeVisionAVR .
В этой теме уже обсуждалась косвенная адресация портов. Я уже сейчас не помню, но в CV какие-то проблемы с указателями на порты, и с чем это связано я не знаю, т.к. в АВРах я ни бум-бум...
Т.е. конструкция типа

Код: Выделить всё

unsigned char *p_b = (unsigned char *)&PORTB;

.............

*p_b = 0xAA; // Записать в PORTB через указатель значение 0xAA
в нём не прокатывает, по неизвестным мне причинам, хотя работать всё должно :)
Толи там нужно явно адрес указывать, толи ещё чего-то... не помню...
Сейчас придут спецы по CV и всё расскажут :)
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

подскажите как исправить компил ругается запарил

Код: Выделить всё

   for(cnt=0;cnt<264;cnt++){  
        if(cnt==88){ 
        }

Код: Выделить всё

Warning: 168.c(616): pointless integer comparison with an out of range constant

ставлю 255 заместо 264 не ругается а мне надо именно 264
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

v.2.03.4 ошибки не даёт, компилит.
Docendo discimus
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

скорее всего у тебя эта переменная обявлена как char
попробуй int cnt
Tell Me The Truth
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

char тоже компилит, просто в коде байт преобразуется в слово. Другое дело - логика сравнения. :))
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

Re: CodeVision AVR в вопросах и ответах

Сообщение kotriks »

FreshMan писал(а):скорее всего у тебя эта переменная обявлена как char
попробуй int cnt

с int не ругается но правильно ли это?
Ответить

Вернуться в «AVR»