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

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

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

Сообщение pyzhman »

А как же вы собираетесь сравнивать байтовую переменную с 264?
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

pyzhman писал(а):А как же вы собираетесь сравнивать байтовую переменную с 264?

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

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

Сообщение pyzhman »

char имеет размерность в байт, т.е. может иметь значения от 0 до 255 при беззнаковом определении. Переменная типа int может принимать значения от 0 до 65535. И где число 264, с которым вы собираетесь сравнивать переменную типа char? :))
Поменяется только размер программы, и то не намного.
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

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

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

Сообщение kotriks »

люди добрые подскажите мне как удалить символ предыдущий в буфере. есть функция вот такая

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

unsigned int  Buf=0;
void buff() {

if (Buf<8) {

} else {
код
 }
}


тоесть как попало в буфер 8 символов выполняется код.
так собственно вопрос как удалить предыдущий символ как бы введённый не правильно, как будет выглядеть код.

нужно что то типа отсупить на 1 байт или символ назад и обнулить его что то типа такого Buf-1=Buf=0;
но как будет правильно?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

приведите всю функцию, ничего непонятно. где сам буфер то?
Ставим плюсы: )
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

ibiza11 писал(а):приведите всю функцию, ничего непонятно. где сам буфер то?

в сам буфер а имено Buf заношу символы 12345678 например если мне какойто из них не понравился при нажатии например на кнопку подключенную к контроллеру удалялся с Buf предыдущий символ 1 символ раз нажал стёрлось ещё нажал ещё стёрлось и так хоть все хоть 8 стереть.

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

unsigned char tmpBuf[100];
tmpBuf[Buf]=заносится символ; Buf++;
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

может так

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

tmpBuf[Buf]=0xFF; Buf--;

так виснет при нажатии на кнопку

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

void enter(){
if (PINC & (1<<0)){
tmpBuf[Buf]=0xFF; Buf--;

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

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

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

kotriks писал(а):может так

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

tmpBuf[Buf]=0xFF; Buf--;

Что значит "удалить" ? Сдаётся мне, нужно просто записать туда конец строки, а это нулевой байт.

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

tmpBuf[Buf]=0x00; Buf--;
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

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

Сообщение uni »

Я делаю это так:

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

        case VK_BACK: {

           tmp = strlen( CommandString );

            // Удаляем предыдущий символ, если буфер командной строки не пуст.
            if ( tmp > 0 ) {

                CConsole::PutChar( VK_BACK );
                CConsole::ClearForward(1);

                CommandString[ --tmp ] = 0;

            }

            break;

        }

        default: {

            tmp = strlen( CommandString );

            if ( tmp >= sizeof( CommandString ) - 1 ) return;

            // Выводим символ на экран.
            CConsole::PutChar( ( uint8_t ) Key );

            CommandString[ tmp++ ] = ( uint8_t ) Key;
            CommandString[ tmp ] = 0;

        }
Россия навсегда!
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

всем доброго времени суток. помогите написать маленькую программу на си, в код вижен есть программка для мигания светдиодами в разных последовательностях, так же могу поставить количество повторений но не получается это дело запустить при нажатии кнопки . если я пишу программку мигания и подключаю питание к контролеру все работает а я хочу что бы мигания начинались после нажатия на кнопку но когда вставляю в код работы кнопки мигания то в лучшем случае у меня светодиоды просто светятся(((помогите написать код для включения мигания светодиодов от кнопки контролер тини 13 portb.0 включен на вход
Вложения
Text file.txt
(1.01 КБ) 139 скачиваний
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

Аlex писал(а):
kotriks писал(а):может так

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

tmpBuf[Buf]=0xFF; Buf--;

Что значит "удалить" ? Сдаётся мне, нужно просто записать туда конец строки, а это нулевой байт.

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

tmpBuf[Buf]=0x00; Buf--;

Ничего не пойму как удалить (((
ничерта не работает

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

void del(){
if (PINC & (1<<0)){
tmpBuf[Buf]=0xFF; --Buf;

}}


если делать так

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

void del(){
if (PINC & (1<<0)){
 Buf=0;

}}


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

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

Сообщение pyzhman »

2pashaumnov:

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

PORTB=0x01; // !!!!!!!  подтягиваем к питанию, чтобы не бултыхалось в воздухе
DDRB=0x3E;


  { int p;

while(!PINB.0); // ждем отпускания
while(PINB.0); // ждем нажатия


for (p=1; p<=5; p++)
      {
PORTB.1=1; // устанавливаем 1 на выходе 0
delay_ms(2000); // Ждем 200 мс
PORTB.1=0; // устанавливаем 1 на выходе 1
delay_ms(200); // Ждем 200 мс
PORTB.2=1; // устанавливаем 0 на выходе 0

Пара замечаний: переменная цикла меняется от 1 до 5. Вполне можно объявить ее как байтовую величину и не тратить память на интеджер. Второе - delay_ms(2000) даст задержку в две секунды.
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

а не могли бы вы мне разъяснить вот эти строчки, что они конкретно выполняют и можно ли было их написать по другому???
{ int p;

while(!PINB.0); // ждем отпускания (тут ведь отрицание прописано восклицательным знаком??или я ошибаюсь???
while(PINB.0); // ждем нажатия


for (p=1; p<=5; p++)
а если вот так написать??
например while(PINB.0=1); // это отслеживает положении кнопки и если там 1 то работает дальше , если ноль то стоит и ждет?? так?
while(PINB.0=0);
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Если уж писать так, то так:

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

while(PINB.0== 0); // ждем отпускания
while(PINB.0== 1); // ждем нажатия

Восклицательный знак - да, отрицание. А вашей записи (один знак равенства) идет не сравнение, а присваивание.
PS. Я порой как собака - всё понимаю, а сказать не могу. :))
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

а что нужно добавить в эту программу для того что бы при нажатии на кнопку на выходе появилась единица и оставалась там до следующего нажатия на кнопку . кнопка без фиксации.

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

PORTB=0x01; // !!!!!!!  подтягиваем к питанию, чтобы не бултыхалось в воздухе
DDRB=0x3E;


  { int p;

while(!PINB.0); // ждем отпускания
while(PINB.0); // ждем нажатия


for (p=1; p<=5; p++)
      {
PORTB.1=1; // устанавливаем 1 на выходе 0
delay_ms(2000); // Ждем 200 мс
PORTB.1=0; // устанавливаем 1 на выходе 1
delay_ms(200); // Ждем 200 мс
PORTB.2=1; // устанавливаем 0 на выходе 0
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Вы как-то несуразно высказались. Вот смотрите, делаем по-вашему: вначале на выходе 0. Нажали кнопку. Появилась 1. Что-то там сделали и приходим опять на опрос кнопки (1 по-прежнему висит). Нажимаем кнопку (т.е. опять сначала) и выставляем 1. В чем суть?
Вообще, скажите чего вы хотите. Иначе, так и будете бултыхаться сами и время отнимать у людей.
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

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

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

Сообщение pyzhman »

:)) Давайте так. Опишите алгоритм.
1. Делаем то-то(ждем нажатия на кнопку, например)
2. Делаем то-то.
и т.д. Думаю, многим желающим вам помочь это поспособствует.
Docendo discimus
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

ок))
1 . нажимаем на кнопку и отпускаем ее (кнопка без фиксации)
2. начинает работать программа бегущих огоньков которая повторяется 5 раз по кругу и останавливается.
3. если програма бегущие огоньки еще не закончила свою работу и в это время еще раз нажать кнопку (которая без фиксации) то работа программы огоньков прерывается .
как то так.
Ответить

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