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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Вот смотри то что надо: кнопка подключаеться к PORTD.1 , а вторым выводом на землю, светодиод подключаеться к PORTD.0 , а вторым выводом на землю.


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

#include <mega8>
#include <delay>

void main(void)
{
 
PORTD=0x02;
DDRD=0x01;


    while (1)                             // бесконечній цикл
{
 int i;


    while (PIND.1 == 0)        //условие обработки кнопки
    {
        for (i=0; i<4; i++)
             {                            //цикл
        PORTD.0=1;                //включаем пин порта
        delay_ms(200);             //задержка
        PORTD.0=0;                 //віключаем пин порта
        delay_ms(200);             //задержка
            };
       
    };
};
}


по поводу первого варианта программы который я писал выше он тоже рабочий просто там кнопка включалась по другому с помощью внешнего подтягивающего резистора. :)
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

А вот Ваш вариант подправленой программы с использованием оператора " if " и нужно ставить оператор while без него работать не будет !!!

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

#include <mega8>
#include <delay>

void main(void)
{
 
PORTD=0x02;
DDRD=0x01;

    while (1)                             // бесконечній цикл
{
 int i;
   if (PIND.1==0)
   {
         for (i=0; i<4; i++)
          {
         PORTD.0=1;
         delay_ms(200);
         PORTD.0=0;
         delay_ms(200);
         };       
    };
};
}
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

sheva_s писал(а):А вот Ваш вариант подправленой программы с использованием оператора " if " и нужно ставить оператор while без него работать не будет !!!

Работать будет, но только 1 раз после включения и настолько быстро это время пройдет, что автор не заметит.
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Ищю русский хелп для CodeVisionAVR
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

sheva_s писал(а):Ищю русский хелп для CodeVisionAVR

Зачем?
Там не так много всего написано, если что-то не ясно, то и со словарем можно разобраться.
Лучше учите английский, а не CodeVision.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Всем спасибо вроде бы разобрался с вашей помощью! =)
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Вот у меня опять возник ещё один вопрос, не как не могу сделать счётчик замыкания кнопки. Максимум что удаётся это переменной С присвоить 1. Может надо както сохранять?

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

#include <mega8>
#include <delay>
void main(void)
{
 
PORTD=0x02;
DDRD=0x01;

    while (1) 
{
 int i,c;
 c=0;
   if (PIND.1==0) // считает количество замыканий
   { c++;    }
   
         for (i=0; i<c; i++) //цикл индикации,
          {                 //светодиод мигает столько раз, сколько замкнута кнопка
         PORTD.0=1;
         delay_ms(200);
         PORTD.0=0;
         delay_ms(200);
         };       
       
     }
}
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

mr.Kirill писал(а):
sheva_s писал(а):Ищю русский хелп для CodeVisionAVR

Зачем?
Там не так много всего написано, если что-то не ясно, то и со словарем можно разобраться.
Лучше учите английский, а не CodeVision.

Да вот невыходит со словарем нужно настроить таймеры что то невыходит вот и ищю русский хелп.
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Sounds писал(а):Вот у меня опять возник ещё один вопрос, не как не могу сделать счётчик замыкания кнопки. Максимум что удаётся это переменной С присвоить 1. Может надо както сохранять?

Напиши пожалуста алгоритм работы программы которую ты хочеш сделать, а то немного непонятен вопрос. и что и как у тебя подключено.
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

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

...
    while (1) 
{
 int i,c;
 c=0;
...         
     }

Ты по каждому кругу работы программы постоянно обнуляешь переменную С, вот потому и ничего дальше 1 и не идет.
Эти 2 строки что я оставил - вынеси их перед while(1).
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

sheva_s писал(а):Да вот невыходит со словарем нужно настроить таймеры что то невыходит вот и ищю русский хелп.

Так это лучше почитать основы AVR и конфигурирования внутреннего "железа", тогда и станет ясно.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Вынес только светодиод теперь постоянно мигает
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

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

#include <mega8> 
#include <delay>
void main(void)
{
 int c; 
PORTD=0x02;
DDRD=0x01;
c=0;

    while (1) 
{
 int i;
 
 
   while(PIND.1==0) // считает количество замыканий
   { c++;
    while(PIND.1==0)  {};
     delay_ms(60);
   
       };
   
         for (i=0; i<c; i++) //цикл индикации,
          {                 //светодиод мигает столько раз, сколько замкнута кнопка
         PORTD.0=1;
         delay_ms(200);
         PORTD.0=0;
         delay_ms(200);
         };       
c=0;       
     }
}

только кнопкой нужно клацать так чтобы между нажатиями незажегся светодиод иначе подсчет будет неверный а вобще тут наверное неверный алгоритм работы задуман
#include <mega8>
#include <delay>
эти строки должны писаться с буквой h
почемуто на форум вылаживаются подругому.
в твоих программах ты не пишиш могут вылазить ошибки покрайней мере у меня непроходит без той буквы.
Алгоритм работы такой клацаеш кнопкой довольно быстро программа подсчитывает нажатия перестаеш клацать она начинает моргать светодиодом.
delay_ms(60);- этой строчка нужно что бы программу удержать в цикле подсчета нажатия в период пока ты отпускаеш и нажимаеш кнопку после этой строчки программа проверяет нажата ли кнопка если да повтаряеться все заново если не нажата она вываливаеться с цикла
while(PIND.1==0) // считает количество замыканий
{ c++;
while(PIND.1==0) {};
delay_ms(50);

};
и переходит на индикацию твоих нажатий после чего обнуляет переменную С и все повторяеться.
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Sounds писал(а):Вот у меня опять возник ещё один вопрос, не как не могу сделать счётчик замыкания кнопки.

Для этих целей удобние использовать внешнии прерывания (INT). Тоесть кнопку нажал, основная программа останавливается, и выполняется прерывание, в котором ты увеличуеш переменную на 1, и потом программа начинает работать с места где была остановлена. Очень удобно, попробуйте. :wink:
Изображение
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

To Krik99
Спасибо за совет, но я пока до этого ещё не дошёл, мне кажется что мне на это не хватает знаний
To sheva_s
Это нето.=(
To All
А можно как нибудь переменную $C записать в память, и потом её от туда считать?
Аватара пользователя
Илья79
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Вс июн 29, 2008 13:53:03
Контактная информация:

Сообщение Илья79 »

Подскажите, как в CVAVR узнать, что пришли данные с USART, а потом считать?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Sounds, мне кажется, ваши проблемы во многом из-за того, что вы не используете подавление дребезга. Да и возможностями языка Си пользуетесь не в полной мере: советую шире использовать функции - легче станет писать и понимать.

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

// описываем порт ввода состояния кнопки
#define KEY PIND.1

// описываем порт управления светодиодом
#define LED PORTD.0

char key_pressed(void){
// функция, которая возвращает 0, если кнопка не нажата и не ноль, если нажата

   if(KEY) return 0; // если на нужном пине 1 - не нажата

   delay_ms(15); // 15 мс задержки для подавления дребезга

   if(KEY) return 0; // если на пине 1 - первый раз был дребезг - вернем 0

   return 1; // а иначе дребезг кончился и надо вернуть 1
}

void main(void){
// главная функция

   DDRD.0 = 1; // настроим линию управления светодиодом

   PORTD.1 = 1; // включим подтяжку на кнопку

   // основной цикл
   while(1){
       if( key_pressed() ) LED = !LED; // если нажали кнопку - изменим состояние светодиода

       while( key_pressed() ); // поджождем, пока кнопку отпустят
   }
}

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

Мой уютный бложик... заходите!
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Вот может поможет, код который на 7-ми сегментный индикатор выводит число от 0 до 9 кнопки подключены через внешнии прерывания.

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

#include <mega8>
#include <delay>
unsigned char counter;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(100);
counter++;
if(counter>9)counter=9;                                   //не даём переменной быть больше 9
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
delay_ms(100);
counter--;
if(counter<0)counter=0;                                   //не даём переменной быть менше 0
}

void main(void){

// Port B initialization
PORTB=0x00;
DDRB=0x00;

// Port C initialization
PORTC=0x7F;
DDRC=0x7F;

// Port D initialization
PORTD=0x00;
DDRD=0x00;


// Инициализация внешних прерываний
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;

//разрешаем прерывания
#asm("sei")

while (1)
      {
       switch(counter){                     //выводим то число которое в переменной counter

           case 0:{PORTC=0b11000000; break;} //0
           case 1:{PORTC=0b11111001; break;}  //1
           case 2:{PORTC=0b10100100; break;}  //2
           case 3:{PORTC=0b10110000; break;}  //3
           case 4:{PORTC=0b10011001; break;}  //4
           case 5:{PORTC=0b10010010; break;}  //5
           case 6:{PORTC=0b10000010; break;}  //6
           case 7:{PORTC=0b11111000; break;}  //7
           case 8:{PORTC=0b10000000; break;}  //8
           case 9:{PORTC=0b10010000; break;}  //9
                   }
      };
}
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Krik99, вы уверены, что этот код нормально работает? у меня есть сомнения... и зачем такие громадные задержки в обработчиках прерываний?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

ARV писал(а):Krik99, вы уверены, что этот код нормально работает? у меня есть сомнения... и зачем такие громадные задержки в обработчиках прерываний?!

А в чём именно сомнения? Этот код в качестве ознакомления с внешними прерываниями, задержку можно поменять... да знаю, что индикацию цифр можно было записать в массив и выводить от туда, но так уж написал для начинающих. :) Схему рисовать надеюсь не надо, и думаю выводы к которым подключать кнопки INT0 и INT1 можно найти по даташиту.
PS. Не ленитесь и пользуйтесь генератором начального кода в Code Vision AVR, там довольно таки легко всё железо МК настроить...
Изображение
Ответить

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