CodeVision AVR в вопросах и ответах
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
Здравствуйте! Я к вам присоединился только вчера, но читаю на форуме уже давно. итак пачему я тут. решил я для своих детеи один деваис смастерит, а он на ATMEGA16, деваис делает простые вещи, зажигает светодиоды, да и я в этом деле не профи! а вопрос вот в чём! как сделать так чтобы с клавиатуры с цифрами, нажимая на цифры, переменной присвоить сразу 3 разрядную цифру: к примеру нажав на 2, патом на 0 и ещё на 0, присвоить переменной=200. програмка на С подобном для CVAVR. Если каму интересно будет прикреплю ZIP-чик! Спасибо заранее!
- Реклама
Еще было бы не плохо дать программе понять, что ввод закончен. Или предполагается ввод только трехзначных чисел? И еще: а если при вводе ошибетесь?
Docendo discimus
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
именно по этому я тут и припарковался
вашы замечания для меня очень важны!
к примеру:
while (!key=='#') {присваиват значения (так как я гаварил ранее) key}
а при помощи '*' обнулять значение key и начать заново, пока к примеру key не примет значение 3 значного числа.
Еще было бы не плохо дать программе понять, что ввод закончен
это можно реализовать с помощю знака '*' а ВВОД закончен с помощью '#'а если при вводе ошибетесь?
к примеру:
while (!key=='#') {присваиват значения (так как я гаварил ранее) key}
а при помощи '*' обнулять значение key и начать заново, пока к примеру key не примет значение 3 значного числа.
- Вложения
-
- Pult i ochki s komentami.rar
- тоже но с коментами для тех кто начинает т.е. таких как я!
- (58.24 КБ) 166 скачиваний
-
- Pult i ochki.rar
- это вот zip-чик со всеми пришмандофками :)))
- (58.33 КБ) 131 скачивание
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
сталкнулся с win7 x64, нада заити админом а не юзером, потом кликните на иконку правой кнопкой мыши и потом запустить как win 98benin писал(а):Сори, прерву Вашу беседу....
У мну вопрос по поводу codevisionavr, а вчастности - не стартует на WinXp x64. Кто-то сталкивался с такой проблемой ?? Есть варианты решения ? Google толком ничего не дал.....
у меня работает по сей день
Последний раз редактировалось zippoge Вт апр 03, 2012 15:29:59, всего редактировалось 1 раз.
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
http://letitbit.net/download/68036.63cb ... ).rar.htmlipkin писал(а):а существует ли описалово для CV на русском если да то можно ли его поиметь?
самый лучший по моему
- Реклама
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
спасибо друзья что не успели ответить, честно! по этому Я сам подумав решил своюже задачу!
вот так:
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 в аснавную программу
}
Неоптимальный код.Можно было использовать таймер- тот же самый, что создает динамику для 7сегментного дисплея.
И еще нужно было сделать вот так:
При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
И еще нужно было сделать вот так:
Код: Выделить всё
#define Max_cifr 3
int count;
unsigned int key;
count++;
if ((count>0)&&(count<(Max_cifr-1)))//Ограничиваем область определения функции
{key=key*10;}
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
В поисках истины человек развивается.
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
ну да! это патаму что я код ёщё не закончил!При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
а вот за это спасибо! не дадумался!И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
Ну я же сказал я не профи, CVAVR и С выучил за 1 неделю чтобы для детеи сделать этот пульт, сами посудите для них учоба в играх более удобнее и при этом не будут зубрить, а выученная информация остаётся навсегда!
код буду писать постепенно и надеюсь дакончу с вашей помощю!
Спасибо всем!
ну вот и я подумал,что это недочет

если делать эту часть в основном коде,то можно так:
тут бы еще добавить антидребезг
и переработать немного функцию кей скан.
(ну и проверить,конечно же в деле эти строки,а то честно я их только что сидя в секретном месте вместо разгадывания кроссворда накатал) творчество так сказать...
можно кстати эту часть тоже переработать и написать с использованием оператора 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.
пусть парни подумают
В поисках истины человек развивается.
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
канечно было бы лучше но сам деваис к дребезгу контактов не очень критично, так как при первом же переключении с 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 раз.
Тут вопросы по 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 раза.
В поисках истины человек развивается.
- Сообщения: 11
- Зарегистрирован: Пн апр 02, 2012 20:34:55
Здравствуйте! После открытия готового проекта в CodeVision и попытки компиляции выдается сообщение "The estimated Data Stack usage of 30 bytes...". Во вкладке "Конфигурация проекта"? при выборе "Chip ATiny13A" "Data Stack size 16 bytes" Вопрос "Требуется редактирование параметров RAM вручную или программа это сделает сама"?
- Вложения
-
- Скриншот.rar
- Скриншоты
- (111.31 КБ) 148 скачиваний
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Ничего она не сделает. Стек у вас мал.
Увеличте до 32 например. Всёравно у вас в куче 1 байт .
Увеличте до 32 например. Всёравно у вас в куче 1 байт .
После изменения "Data Stack size 16 bytes" на "Data Stack size 30 bytes" ошибок не выдает.
- Вложения
-
- Скриншот_1.rar
- Скриншот_1
- (97.15 КБ) 134 скачивания
Есть функция
Как правильно вызывать так
или так
В обоих случаях компилятор ошибок не показывает.
Код: Выделить всё
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);
«И всё-таки она вертится!»
в обоих случаях правильно, но первый вариант длиннееApparatchik писал(а):В обоих случаях компилятор ошибок не показывает.
битва с дураками проиграна, победители торжествуют. слава победителям!
эти две записи почти эквивалентны.Насколько я понял имя буфера это адрес нулевой ячейки.
а вы хотите четвертой ячейке этого буфера присвоить значение,возвращаемое функцией?
а вы хотите четвертой ячейке этого буфера присвоить значение,возвращаемое функцией?
В поисках истины человек развивается.
ЗДравствуйте, уважаемые! Нужна помощь знатоков)
К Мега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 раз.
как хорошо, что я не знаток! поэтому вместо помощи посоветую прошерстить да хоть бы и эту самую тему - найдется очень много полезного... если форум почитать про Си - будет еще лучше. после чтения - обязательно все переделать. а вот потом, если не заработает - тогда обращаться к знатокам.Vatson4ik писал(а):Нужна помощь знатоков)
битва с дураками проиграна, победители торжествуют. слава победителям!


