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

Обсуждаем контроллеры компании Atmel.
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

Здравствуйте! Я к вам присоединился только вчера, но читаю на форуме уже давно. итак пачему я тут. решил я для своих детеи один деваис смастерит, а он на ATMEGA16, деваис делает простые вещи, зажигает светодиоды, да и я в этом деле не профи! а вопрос вот в чём! как сделать так чтобы с клавиатуры с цифрами, нажимая на цифры, переменной присвоить сразу 3 разрядную цифру: к примеру нажав на 2, патом на 0 и ещё на 0, присвоить переменной=200. програмка на С подобном для CVAVR. Если каму интересно будет прикреплю ZIP-чик! Спасибо заранее!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Еще было бы не плохо дать программе понять, что ввод закончен. Или предполагается ввод только трехзначных чисел? И еще: а если при вводе ошибетесь?
Docendo discimus
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

именно по этому я тут и припарковался :) вашы замечания для меня очень важны!
Еще было бы не плохо дать программе понять, что ввод закончен
а если при вводе ошибетесь?

это можно реализовать с помощю знака '*' а ВВОД закончен с помощью '#'
к примеру:
while (!key=='#') {присваиват значения (так как я гаварил ранее) key}
а при помощи '*' обнулять значение key и начать заново, пока к примеру key не примет значение 3 значного числа.
Вложения
Pult i ochki s komentami.rar
тоже но с коментами для тех кто начинает т.е. таких как я!
(58.24 КБ) 165 скачиваний
Pult i ochki.rar
это вот zip-чик со всеми пришмандофками :)))
(58.33 КБ) 127 скачиваний
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

Re:

Сообщение zippoge »

benin писал(а):Сори, прерву Вашу беседу....
У мну вопрос по поводу codevisionavr, а вчастности - не стартует на WinXp x64. Кто-то сталкивался с такой проблемой ?? Есть варианты решения ? Google толком ничего не дал.....


сталкнулся с win7 x64, нада заити админом а не юзером, потом кликните на иконку правой кнопкой мыши и потом запустить как win 98
у меня работает по сей день
Последний раз редактировалось zippoge Вт апр 03, 2012 15:29:59, всего редактировалось 1 раз.
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

Re:

Сообщение zippoge »

ipkin писал(а):а существует ли описалово для CV на русском если да то можно ли его поиметь?

http://letitbit.net/download/68036.63cb ... 509e99094/Лебедев_М.Б._CodeVisionAVR._Пособие_для_начинающих_(_CD__2008).rar.html
самый лучший по моему
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

спасибо друзья что не успели ответить, честно! по этому Я сам подумав решил своюже задачу!

вот так:

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 в вопросах и ответах

Сообщение vitalik_1984 »

Неоптимальный код.Можно было использовать таймер- тот же самый, что создает динамику для 7сегментного дисплея.
И еще нужно было сделать вот так:

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

#define Max_cifr 3
int count;
unsigned int key;
count++;
if ((count>0)&&(count<(Max_cifr-1)))//Ограничиваем область определения функции
{key=key*10;}
 

При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?
В поисках истины человек развивается.
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

При этом непонятно что будет происходить когда вашу переменную # или * умножают на 10

ну да! это патаму что я код ёщё не закончил!
И почему у вас вообще это умножение стоит?Если вы вернули в основную функцию, то почему нельзя там это обработать?

а вот за это спасибо! не дадумался!
Ну я же сказал я не профи, CVAVR и С выучил за 1 неделю чтобы для детеи сделать этот пульт, сами посудите для них учоба в играх более удобнее и при этом не будут зубрить, а выученная информация остаётся навсегда!
код буду писать постепенно и надеюсь дакончу с вашей помощю!
Спасибо всем!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

ну вот и я подумал,что это недочет
:-)
если делать эту часть в основном коде,то можно так:

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

#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.
пусть парни подумают ;-) также нужно еще добавить обработку нажатия звезды
В поисках истины человек развивается.
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

тут бы еще добавить антидребезг

канечно было бы лучше но сам деваис к дребезгу контактов не очень критично, так как при первом же переключении с 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 в вопросах и ответах

Сообщение vitalik_1984 »

Тут вопросы по 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 раза.
В поисках истины человек развивается.
zippoge
Родился
Сообщения: 11
Зарегистрирован: Пн апр 02, 2012 20:34:55

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

Сообщение zippoge »

ОК
Делаем пульт для игры в вапросики и атветики
viewtopic.php?f=20&t=68776
Аватара пользователя
pegast20009
Открыл глаза
Сообщения: 63
Зарегистрирован: Сб мар 03, 2012 07:53:25
Откуда: г.Киев

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

Сообщение pegast20009 »

Здравствуйте! После открытия готового проекта в 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 в вопросах и ответах

Сообщение demiurg301 »

Ничего она не сделает. Стек у вас мал.
Увеличте до 32 например. Всёравно у вас в куче 1 байт .
Аватара пользователя
pegast20009
Открыл глаза
Сообщения: 63
Зарегистрирован: Сб мар 03, 2012 07:53:25
Откуда: г.Киев

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

Сообщение pegast20009 »

После изменения "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 в вопросах и ответах

Сообщение Apparatchik »

Есть функция

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

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 в вопросах и ответах

Сообщение vitalik_1984 »

эти две записи почти эквивалентны.Насколько я понял имя буфера это адрес нулевой ячейки.
а вы хотите четвертой ячейке этого буфера присвоить значение,возвращаемое функцией?
В поисках истины человек развивается.
Vatson4ik
Родился
Сообщения: 16
Зарегистрирован: Ср мар 04, 2009 06:57:47
Откуда: Москва

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

Сообщение Vatson4ik »

ЗДравствуйте, уважаемые! Нужна помощь знатоков)
К Мега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 писал(а):Нужна помощь знатоков)
как хорошо, что я не знаток! поэтому вместо помощи посоветую прошерстить да хоть бы и эту самую тему - найдется очень много полезного... если форум почитать про Си - будет еще лучше. после чтения - обязательно все переделать. а вот потом, если не заработает - тогда обращаться к знатокам.
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

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