Страница 279 из 421

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

Добавлено: Вт окт 08, 2013 20:16:59
dimmar
Аlex писал(а):

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

delay_ms(time);
не ? :)

Или так

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

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

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

_delay(time);
Что касается первого примера я так и делал, но видимо где-то косячил, раз на меня CodeVision ругался, и сейчас разобрался где. И в EEPROM все настройки пишутся и из него при инициализации всё читается.
Спасибо.
Но возник вот какой вопрос: Продолжительность импульса на максимуме у меня составляет 120ms и шаг изменения составляет 10ms. Откуда берутся эти значения, ведь я их нигде не прописывал? и как изменять диапазон и шаг настройки?

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

Добавлено: Вт окт 08, 2013 20:21:35
Аlex
Откуда берутся эти значения
Будем ждать обладателя магического шара.

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

Добавлено: Ср окт 09, 2013 08:35:16
Greymand
Глупый теоретический вопрос от начинающего:
Есть у нас программа:
1
2
3
5
N...
Есть прерывание.Допустим,программа дошла до шага номер 2 и сработало прерывание от таймера.Допустим,я плохой программист(а так оно и есть) и обработчик прерывания получился слишком долгий и за время его обработки в очередь встало другое прерывание.(или тоже самое-таймер "тикает" слишком быстро,обработчик слишком долгий).Обработали прерывание,вернулись на строчку 2...
Внимание,вопрос:Что будет дальше-МК ускачет сразу же по второму прерыванию или все-таки выполнит шаг программы №3 а уже потом пойдет обрабатывать следующее прерывание?
То есть чисто теоретически может ли МК все время гулять по прерываниям вообще не выполняя основную программу или все же он будет ее выполнять но очень медленно?

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

Добавлено: Ср окт 09, 2013 14:13:39
ibiza11
Greymand, а причем здесь CodeVision? А вообще после обработки прерывания выполняется как минимум одна команда перед переходом в следующее прерывание.

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

Добавлено: Пт окт 11, 2013 13:59:38
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) курсор отключен. Поправьте меня!

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

Добавлено: Пт окт 11, 2013 16:32:48
FreshMan
Greymand, в прерываниях надо стараться писать максимально локанично
остальное тебе ответил ibiza11
теоретически, твоя прога не должна гулять только по прерываниях, т.к. после каждого прерывания выполняется как минимум одна команда из основного цикла

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

Добавлено: Пт окт 11, 2013 18:21:22
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); пставить)
Да и курсор сам по себе на один разряд расчитан.

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

Добавлено: Пт окт 11, 2013 20:36:02
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.

Как так сделать? кодевижинавр выдает ошибку

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

Добавлено: Пт окт 11, 2013 20:42:57
Аlex
Если опрашивать только один порт, то через маску, в которой двигается единичка.
Если порты и биты вразнобой, то через массив указателей на порты и номера битов. Как это делается в CV, я к сожалению не в курсе.

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

Добавлено: Пт окт 11, 2013 22:01:49
ploop
Допустим
Допустим, цель вы не озвучили, Аlex пытается включить телепатию :)
Во-первых, define - это тупая подстановка текста в листинг программы. #define port_0 PORTC.0 равносильно нажатию Ctrl+F, поиску в тексте "port_0", и замене на "PORTC.0".
Если надо сделать иначе - озвучьте задачу.

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

Добавлено: Сб окт 12, 2013 04:36:02
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, но при таком синтаксисе у меня кодевиждавр пишет ошибку. Как правильно это написать?

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

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

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

Добавлено: Сб окт 12, 2013 08:58:35
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:

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

Добавлено: Сб окт 12, 2013 10:39:55
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
}

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

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

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

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

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

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

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

Добавлено: Ср окт 16, 2013 07:35:50
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

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

Добавлено: Ср окт 16, 2013 07:49:29
pyzhman
v.2.03.4 ошибки не даёт, компилит.

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

Добавлено: Ср окт 16, 2013 07:51:17
FreshMan
скорее всего у тебя эта переменная обявлена как char
попробуй int cnt

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

Добавлено: Ср окт 16, 2013 07:56:35
pyzhman
char тоже компилит, просто в коде байт преобразуется в слово. Другое дело - логика сравнения. :))

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

Добавлено: Ср окт 16, 2013 08:18:33
kotriks
FreshMan писал(а):скорее всего у тебя эта переменная обявлена как char
попробуй int cnt
с int не ругается но правильно ли это?