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

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

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

DIM4 писал(а):
Sounds писал(а):int main(void) { //Ошибка The “main” function must return

в CVAVR функция main должна иметь тип void тоесть void main(void)

Вовсе нет. Если void - ничего не возращает, если bit/char/int, тогда должна возращать этот тип, о чем в сущности и говорит компилятор "function must return" - дословно "функция должна возращать".
2 варианта:
1. в концовке добавить строку "return 0"
2. либо "int main(void)" заменить на "void main(void)".
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

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

Сообщение Sounds »

Посмотрите пожалуйста, не как не могу с кнопкой разобраться, в чём может быть дело?

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

#include <mega8>
#include <delay>
void main(void) {
int i;
DDRD = 0xbf;
if (PIND.1 == 1) {
for (i=0; i<4; i++) {
 PORTD.0=1;
delay_ms(50);
PORTD.0=0;
delay_ms(50);
   }; 
};
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

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

Сообщение Krik99 »

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

if (PIND.1 == 1) {
выполняется if когда на пине лог. 1 , тоесть кнопка не нажата.
Изображение
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

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

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

DDRD = 0xbf;
if (PIND.1 == 1) {
...
}


1. Что за "мода" такая определить направление порта и ни строчки не написать для описания начального состояния подтягивающих резисторов?
Добавьте после DDRD -> PORTD=...

2. DDRD = 0xBF = 0b10111111
Логику видите?
На вход настроили порт PIND.6, а опрашиваете PIND.1...
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

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

Сообщение Sounds »

Спасибо за подсказку про подтяжку, добавил PORTB=0xFF;
А почему на входе будет PIND.6?
Ведь получается:
PORTD.0 - 1 (Выход)
PORTD.1 - 0 (Вход)
PORTD.2 - 1 (Выход)
PORTD.3 - 1 (Выход)
PORTD.4 - 1 (Выход)
PORTD.5 - 1 (Выход)
PORTD.6 - 1 (Выход )
PORTD.7 - 1 (Выход)
Соответственно на входным будет PIND.1. Правильно?
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

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

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

Почему?
Наверное потому что в цифровой технике биты считаются справа налево.
Ваша запись 0b10111111 по правильному будет выглядеть так - 0b11111101, и следовательно DDRD=0xFD.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

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

Сообщение Sounds »

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
DIM4
Родился
Сообщения: 16
Зарегистрирован: Пн янв 21, 2008 20:21:02
Контактная информация:

Сообщение DIM4 »

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

Сообщение sheva_s »

Sounds писал(а):Посмотрите пожалуйста, не как не могу с кнопкой разобраться, в чём может быть дело?

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

#include <mega8>
#include <delay>
void main(void) {
int i;
DDRD = 0xbf;
if (PIND.1 == 1) {
for (i=0; i<4; i++) {
 PORTD.0=1;
delay_ms(50);
PORTD.0=0;
delay_ms(50);
   }; 
};
}


Я не специалист но можно попробывать так.

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


#include <mega8>
#include <delay>

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


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


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

    };
};
}

 

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

Сообщение Sounds »

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

Сообщение Krik99 »

To Sounds
Кнопка подключена одним выводом к пину МК (PIND.1), а другим на минус (GND)?!
To sheva_s

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

...
PORTD=0x00;
DDRD=0x01;
...

Тут нет программной подтяжки входа. Вот для PIND.1:

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

PORTD=0xFF; 
DDRD=0xFD;

И кажется что правельнее будет если while (PIND.1 == 0) , тоесть выпольнять когда появится лог. 0
Изображение
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Да, совершенно верно, одна нога кнопки подключена к PD1, а другая нога кнопки к GND.
В итоги у меня получился вот такой код:

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

 #include <mega8>
#include <delay>
void main(void) {
int i;
DDRD = 0xFD;
PORTD=0xff;
if (PIND.1==1){
for (i=0; i<4; i++) {
 PORTD.0=1;
delay_ms(50);
PORTD.0=0;
delay_ms(50);
}
}
}

Но работает он неправильно, во первых он не реагирует на действия с кнопкой. А во-вторых светодиод который подключён к PD0 всё время горит. Горение светодиода скорее всего связанно с тем что строка PORTD=0xff; на всех портах D устанавливает единицу, а не включает подтяжку. Если проблема в этом, то это можно как то обойти?
[/code]
Аватара пользователя
mr.Kirill
Мучитель микросхем
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

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

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

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

Но работает он неправильно, во первых он не реагирует на действия с кнопкой.

Так этот код и не будет работать так как Вы хотите. Что у Вас сделано по тексту:
1. Настроили пины на вход и выход
2. Выставили на всех пинах лог.1
3. Далее если на входе 1, то цикл из 4х морганий
По логике вещей у Вас на входе всегда будет лог.1, так как включили резистор подтяжки. Чтобы реагировало на кнопку - нужно ждать на входе не лог.1, а лог.0!
А во-вторых светодиод который подключён к PD0 всё время горит. Горение светодиода скорее всего связанно с тем что строка PORTD=0xff; на всех портах D устанавливает единицу, а не включает подтяжку. Если проблема в этом, то это можно как то обойти?

По Вашему мнению что тогда такое "включение подтяжки", если не включение внутренних резисторов между пином контроллера и напряжением питания? Что равносильно появлению ("выставлению") лог.1 на выводе.
Отключите подтяжку от PD0, чтобы исключить свечение.

Для явной наглядности моргания светодиода сделайте задержку не 50мс, а хотя бы >200мс.
Ответить

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