CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Здравствуйте! Я к вам присоединился только вчера, но читаю на форуме уже давно. итак пачему я тут. решил я для своих детеи один деваис смастерит, а он на ATMEGA16, деваис делает простые вещи, зажигает светодиоды, да и я в этом деле не профи! а вопрос вот в чём! как сделать так чтобы с клавиатуры с цифрами, нажимая на цифры, переменной присвоить сразу 3 разрядную цифру: к примеру нажав на 2, патом на 0 и ещё на 0, присвоить переменной=200. програмка на С подобном для CVAVR. Если каму интересно будет прикреплю ZIP-чик! Спасибо заранее!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Еще было бы не плохо дать программе понять, что ввод закончен. Или предполагается ввод только трехзначных чисел? И еще: а если при вводе ошибетесь?
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
именно по этому я тут и припарковался
вашы замечания для меня очень важны!
это можно реализовать с помощю знака '*' а ВВОД закончен с помощью '#'
к примеру:
while (!key=='#') {присваиват значения (так как я гаварил ранее) key}
а при помощи '*' обнулять значение key и начать заново, пока к примеру key не примет значение 3 значного числа.
Еще было бы не плохо дать программе понять, что ввод закончен
а если при вводе ошибетесь?
это можно реализовать с помощю знака '*' а ВВОД закончен с помощью '#'
к примеру:
while (!key=='#') {присваиват значения (так как я гаварил ранее) key}
а при помощи '*' обнулять значение key и начать заново, пока к примеру key не примет значение 3 значного числа.
- Вложения
-
- Pult i ochki s komentami.rar
- тоже но с коментами для тех кто начинает т.е. таких как я!
- (58.24 КБ) 165 скачиваний
-
- Pult i ochki.rar
- это вот zip-чик со всеми пришмандофками :)))
- (58.33 КБ) 127 скачиваний
Re:
benin писал(а):Сори, прерву Вашу беседу....
У мну вопрос по поводу codevisionavr, а вчастности - не стартует на WinXp x64. Кто-то сталкивался с такой проблемой ?? Есть варианты решения ? Google толком ничего не дал.....
сталкнулся с win7 x64, нада заити админом а не юзером, потом кликните на иконку правой кнопкой мыши и потом запустить как win 98
у меня работает по сей день
Последний раз редактировалось zippoge Вт апр 03, 2012 15:29:59, всего редактировалось 1 раз.
Re:
ipkin писал(а):а существует ли описалово для CV на русском если да то можно ли его поиметь?
http://letitbit.net/download/68036.63cb ... 509e99094/Лебедев_М.Б._CodeVisionAVR._Пособие_для_начинающих_(_CD__2008).rar.html
самый лучший по моему
Re: CodeVision AVR в вопросах и ответах
спасибо друзья что не успели ответить, честно! по этому Я сам подумав решил своюже задачу!
вот так:
int count; //это счотчик
//после определения нажатой кнопки
count++;
if (count>0)
{key=key*10;}
правда этот код не без уродство, но в моём случае это приемлемо.
дело в том что (если кому интересно) после каждого нажатия на кнопку для ввода этой цифры над нажать ещё и на '#'
вот сам код в целом:
unsigned char _key_scan(char key)
{
int count=0;
while (!key=='#')
{
PORTA|=0x01; //устанавливаем портА.0 в 1
if ((PINA.3)&&(PORTA.0)) {key=1;} //если на ножках 1
if ((PINA.4)&&(PORTA.0)) {key=4;}
if ((PINA.5)&&(PORTA.0)) {key=7;}
if ((PINA.6)&&(PORTA.0)) {key='*';}
PORTA&=(~0x01); // сбрасываем портА.0 в 0
PORTA|=0x02; //устанавливаем портА.1 в 1
if ((PINA.3)&&(PORTA.1)) {key=2;}
if ((PINA.4)&&(PORTA.1)) {key=5;}
if ((PINA.5)&&(PORTA.1)) {key=8;}
if ((PINA.6)&&(PORTA.1)) {key=0;}
PORTA&=(~0x02); // сбрасываем портА.1 в 0
PORTA|=0x04; //устанавливаем портА.2 в 1
if ((PINA.3)&&(PORTA.2)) {key=3;}
if ((PINA.4)&&(PORTA.2)) {key=6;}
if ((PINA.5)&&(PORTA.2)) {key=9;}
if ((PINA.6)&&(PORTA.2)) {key='#';}
PORTA&=(~0x04); // сбрасываем портА.2 в 0
}
count++;
if (count>0)
{key=key*10;}
return key; //вазвращаем значение key в аснавную программу
}
вот так:
int count; //это счотчик
//после определения нажатой кнопки
count++;
if (count>0)
{key=key*10;}
правда этот код не без уродство, но в моём случае это приемлемо.
дело в том что (если кому интересно) после каждого нажатия на кнопку для ввода этой цифры над нажать ещё и на '#'
вот сам код в целом:
unsigned char _key_scan(char key)
{
int count=0;
while (!key=='#')
{
PORTA|=0x01; //устанавливаем портА.0 в 1
if ((PINA.3)&&(PORTA.0)) {key=1;} //если на ножках 1
if ((PINA.4)&&(PORTA.0)) {key=4;}
if ((PINA.5)&&(PORTA.0)) {key=7;}
if ((PINA.6)&&(PORTA.0)) {key='*';}
PORTA&=(~0x01); // сбрасываем портА.0 в 0
PORTA|=0x02; //устанавливаем портА.1 в 1
if ((PINA.3)&&(PORTA.1)) {key=2;}
if ((PINA.4)&&(PORTA.1)) {key=5;}
if ((PINA.5)&&(PORTA.1)) {key=8;}
if ((PINA.6)&&(PORTA.1)) {key=0;}
PORTA&=(~0x02); // сбрасываем портА.1 в 0
PORTA|=0x04; //устанавливаем портА.2 в 1
if ((PINA.3)&&(PORTA.2)) {key=3;}
if ((PINA.4)&&(PORTA.2)) {key=6;}
if ((PINA.5)&&(PORTA.2)) {key=9;}
if ((PINA.6)&&(PORTA.2)) {key='#';}
PORTA&=(~0x04); // сбрасываем портА.2 в 0
}
count++;
if (count>0)
{key=key*10;}
return key; //вазвращаем значение key в аснавную программу
}
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Неоптимальный код.Можно было использовать таймер- тот же самый, что создает динамику для 7сегментного дисплея.
И еще нужно было сделать вот так:
При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
И еще нужно было сделать вот так:
Код: Выделить всё
#define Max_cifr 3
int count;
unsigned int key;
count++;
if ((count>0)&&(count<(Max_cifr-1)))//Ограничиваем область определения функции
{key=key*10;}
При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
ну да! это патаму что я код ёщё не закончил!
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
а вот за это спасибо! не дадумался!
Ну я же сказал я не профи, CVAVR и С выучил за 1 неделю чтобы для детеи сделать этот пульт, сами посудите для них учоба в играх более удобнее и при этом не будут зубрить, а выученная информация остаётся навсегда!
код буду писать постепенно и надеюсь дакончу с вашей помощю!
Спасибо всем!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
ну вот и я подумал,что это недочет

если делать эту часть в основном коде,то можно так:
тут бы еще добавить антидребезг
и переработать немного функцию кей скан.
(ну и проверить,конечно же в деле эти строки,а то честно я их только что сидя в секретном месте вместо разгадывания кроссворда накатал) творчество так сказать...
можно кстати эту часть тоже переработать и написать с использованием оператора switch.
пусть парни подумают
также нужно еще добавить обработку нажатия звезды
если делать эту часть в основном коде,то можно так:
Код: Выделить всё
#define Max_cifr 3
int number;
unsigned char key,count;
key=_key_scan();//тут кстати нужно убрать ввод переменой в кей скан
if (!key=='#')&&(key)&&((count>0)&&(count<(Max_cifr-1))){//Ограничиваем область определения и если кнопка была нажата и не конец
count++;
number= number*10;key=0;}
else beep ();//если конец ввода выдаем сигнал тут бы еще добавить антидребезг
и переработать немного функцию кей скан.
(ну и проверить,конечно же в деле эти строки,а то честно я их только что сидя в секретном месте вместо разгадывания кроссворда накатал) творчество так сказать...
можно кстати эту часть тоже переработать и написать с использованием оператора switch.
пусть парни подумают
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
тут бы еще добавить антидребезг
канечно было бы лучше но сам деваис к дребезгу контактов не очень критично, так как при первом же переключении с 0 на 1 на входных ножках , даже при наличии дребезга на контактах, выход переключится на противаположное састаяние и оратно не переключится пока ...... я этот код пока ещё не написал, но сабираюсь обмозгавать.
ну к слову можно примерно так:
при помощи таво же самого '*' обнулить key=0; PORTD.4=0; PORTD.5=0; PORTD.6=0; PORTD.7=0;
или даже после набора трёхзначной цифы с помощю '#' обнулить key=0; а с помощю '*' обнулить PORTD.4=0; PORTD.5=0; PORTD.6=0; PORTD.7=0;
мдааа тут коечто мы упустили в _key_scan.
то что после нажатия на саатветствующий номер кнопки, key принимает саатветствующее значение и после это значение умножается на 10, не достаточно для получения правилнои цифры.
вот почему:
если нажата кнопка 3, key=3, после 3 передаётся в главный код и умножается на 10, палучаем 30, а если нужно однозначное число?
палучается что код не правильный.
и ещё, к слову хотим трёхзначное число 352, нажали ещё на 5-ку, key=5, передали в главны код, там переменная=5, а куда делась 30? вот вот. значит сперва нада прибавить к переменной 5, а патом умножить на10 и записать в переменную пока не палучим трёхзначное число.
или можно ещё по другому!
нажал 3, сразуже прибавил к переменнои и записал в той же переменной, при необхадимости нажал на # и умножыл на 10 и записал в перем, патом нажал на 5
и прибавил к перем, получил 35, ещё нажал на 2, записал в той же переменной, потом на * чиобы умножыть на 10 и записал в перем, палучил 352.
правильно я думаю? получится так правильно?
Последний раз редактировалось zippoge Чт апр 05, 2012 21:53:43, всего редактировалось 1 раз.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Тут вопросы по CodeVision AVR может создадите свою тему?
киньте ссылку может чего еще подкину идей
или в вопросы по си перейти.
Вот так можно
код требует проверки опять от балды написал.
полный код компилируется только требуется проверить как работает.
киньте ссылку может чего еще подкину идей
или в вопросы по си перейти.
Вот так можно
Спойлер
Код: Выделить всё
#define MAX_CIFR 3
#define DREBEZG_COUNT 100u
int number;
unsigned char key,key_old,count,key_count;
key=_key_scan();//Читаем клавиатуру
if(key==key_old)key_count++;
if(key==-1)key_count=0;
if((count<(MAX_CIFR-1))&&(key_count>DREBEZG_COUNT)){//Ограничиваем область определения и добавляем антидребезг
key_count=0;
switch(key){
case 1: case 2:case 3:
case 4:case 5:case 6:
case 7:case 8:case 9:
case 0:
count++;number=number*10;key=0;break;
case '#':
beep ();/*тут можно сделать передачу в порт или еще что*/ break;
case '*':
count=0;number=0;key=0;beep ();break ;
default : beep ();break;
} //end switch
}
key_old=key;
}//end while
код требует проверки опять от балды написал.
полный код компилируется только требуется проверить как работает.
Последний раз редактировалось vitalik_1984 Чт апр 05, 2012 22:36:41, всего редактировалось 3 раза.
В поисках истины человек развивается.
- pegast20009
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Сб мар 03, 2012 07:53:25
- Откуда: г.Киев
Re: CodeVision AVR в вопросах и ответах
Здравствуйте! После открытия готового проекта в CodeVision и попытки компиляции выдается сообщение "The estimated Data Stack usage of 30 bytes...". Во вкладке "Конфигурация проекта"? при выборе "Chip ATiny13A" "Data Stack size 16 bytes" Вопрос "Требуется редактирование параметров RAM вручную или программа это сделает сама"?
- Вложения
-
- Скриншот.rar
- Скриншоты
- (111.31 КБ) 146 скачиваний
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
Ничего она не сделает. Стек у вас мал.
Увеличте до 32 например. Всёравно у вас в куче 1 байт .
Увеличте до 32 например. Всёравно у вас в куче 1 байт .
- pegast20009
- Открыл глаза
- Сообщения: 63
- Зарегистрирован: Сб мар 03, 2012 07:53:25
- Откуда: г.Киев
Re: CodeVision AVR в вопросах и ответах
После изменения "Data Stack size 16 bytes" на "Data Stack size 30 bytes" ошибок не выдает.
- Вложения
-
- Скриншот_1.rar
- Скриншот_1
- (97.15 КБ) 131 скачивание
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Есть функция
Как правильно вызывать так
или так
В обоих случаях компилятор ошибок не показывает.
Код: Выделить всё
unsigned char buf[5];
.............
unsigned char CRC8(unsigned char *pcBlock, unsigned char len)
{
unsigned char crc = 0xFF;
while (len--) crc = CRC8Table[crc ^ *pcBlock++];
return crc;
}
Как правильно вызывать так
Код: Выделить всё
buf[4]=CRC8(&buf[0], 4);
или так
Код: Выделить всё
buf[4]=CRC8(buf, 4);
В обоих случаях компилятор ошибок не показывает.
«И всё-таки она вертится!»
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Apparatchik писал(а):В обоих случаях компилятор ошибок не показывает.
в обоих случаях правильно, но первый вариант длиннее
битва с дураками проиграна, победители торжествуют. слава победителям!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
эти две записи почти эквивалентны.Насколько я понял имя буфера это адрес нулевой ячейки.
а вы хотите четвертой ячейке этого буфера присвоить значение,возвращаемое функцией?
а вы хотите четвертой ячейке этого буфера присвоить значение,возвращаемое функцией?
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
ЗДравствуйте, уважаемые! Нужна помощь знатоков)
К Мега16 подсоединяю датчик уклономер(sca103t-d04), и вывожу данные на ЖКИ. В описании датчика сказано что он передает 11 битное число. На ЖКИ высвечивается постоянное число, и не реагирует на изменение положения датчика...
Посмотрите, пожалуйста, правильно ли я реализую программно
#include <mega16.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
#include <spi.h>
#include <delay.h>
#include <string.h>
// int i=0;
char buffer [64];
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned data;
// ?????? MSB, ????????? SPI
data=(unsigned) spi(0)<<8;
// ?????? LSB, ????????? SPI, ? ????????? ? MSB
data|=spi(0);
sprintf(buffer, "%3d",data);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(buffer);
// Place your code here
}
// Declare your global variables here
void main(void)
PORTB=0x00;
DDRB=0xB0;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 250.000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD1;
SPSR=0x00;
// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
unsigned data;
SPDR=data;
}
}
К Мега16 подсоединяю датчик уклономер(sca103t-d04), и вывожу данные на ЖКИ. В описании датчика сказано что он передает 11 битное число. На ЖКИ высвечивается постоянное число, и не реагирует на изменение положения датчика...
Посмотрите, пожалуйста, правильно ли я реализую программно
#include <mega16.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
#include <spi.h>
#include <delay.h>
#include <string.h>
// int i=0;
char buffer [64];
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned data;
// ?????? MSB, ????????? SPI
data=(unsigned) spi(0)<<8;
// ?????? LSB, ????????? SPI, ? ????????? ? MSB
data|=spi(0);
sprintf(buffer, "%3d",data);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(buffer);
// Place your code here
}
// Declare your global variables here
void main(void)
PORTB=0x00;
DDRB=0xB0;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 250.000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD1;
SPSR=0x00;
// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
unsigned data;
SPDR=data;
}
}
Последний раз редактировалось Vatson4ik Пн апр 09, 2012 19:38:58, всего редактировалось 1 раз.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
как хорошо, что я не знаток! поэтому вместо помощи посоветую прошерстить да хоть бы и эту самую тему - найдется очень много полезного... если форум почитать про Си - будет еще лучше. после чтения - обязательно все переделать. а вот потом, если не заработает - тогда обращаться к знатокам.Vatson4ik писал(а):Нужна помощь знатоков)
битва с дураками проиграна, победители торжествуют. слава победителям!