Страница 24 из 421

Добавлено: Чт ноя 27, 2008 22:40:01
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)".

Добавлено: Сб ноя 29, 2008 05:55:49
Sounds
Всем огромное спасибо за помощь, разобрался=)

Добавлено: Вт дек 02, 2008 11:13:44
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); 
   };  
};
}

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

Добавлено: Вт дек 02, 2008 14:03:37
Krik99

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

if (PIND.1 == 1) {
выполняется if когда на пине лог. 1 , тоесть кнопка не нажата.

Добавлено: Вт дек 02, 2008 14:39:51
mr.Kirill

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

DDRD = 0xbf;
if (PIND.1 == 1) {
...
}
1. Что за "мода" такая определить направление порта и ни строчки не написать для описания начального состояния подтягивающих резисторов?
Добавьте после DDRD -> PORTD=...

2. DDRD = 0xBF = 0b10111111
Логику видите?
На вход настроили порт PIND.6, а опрашиваете PIND.1...

Добавлено: Вт дек 02, 2008 16:30:11
sheva_s
Есть у кого то русский хелп для CodeVision поделитесь пожалуста.

Добавлено: Вт дек 02, 2008 16:40:43
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. Правильно?

Добавлено: Вт дек 02, 2008 19:01:24
Aheir
Нет, не правильно. Не с той стороны считаете. Младший разряд - крайний справа.

Добавлено: Вт дек 02, 2008 19:01:36
mr.Kirill
Почему?
Наверное потому что в цифровой технике биты считаются справа налево.
Ваша запись 0b10111111 по правильному будет выглядеть так - 0b11111101, и следовательно DDRD=0xFD.

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

Добавлено: Вт дек 02, 2008 20:16:59
Sounds
Не как не получается сделать так что бы программа реагировала на кнопку. В чём ещё может быть дело? Причём пробовал исподники и схемы с других сайтов но нечего не помогает. Может я что то не выставил при создание проекта?

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

Добавлено: Вт дек 02, 2008 20:40:07
DIM4
я думаю оператор if надо взять в бесконечный цыкл while (1)

Добавлено: Вт дек 02, 2008 21:45:22
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 раза и ждет потом следующего нажатия программа работает проверил ее в протеусе.
:))

Добавлено: Ср дек 03, 2008 00:33:10
Sounds
To ARV
Извини не заметил твоего поста!
Мне надо что бы программа хоть как то реагировала на замыкание кнопки.
Не получается у меня вообще нечего, программа не как не реагирует на замыкание и размыкание кнопки.
To sheva_s
Твой вариант к сожалению тоже неработает.=(

Добавлено: Ср дек 03, 2008 01:42:04
Krik99
To Sounds
Кнопка подключена одним выводом к пину МК (PIND.1), а другим на минус (GND)?!
To sheva_s

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

...
PORTD=0x00; 
DDRD=0x01;
...
Тут нет программной подтяжки входа. Вот для PIND.1:

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

PORTD=0xFF; 
DDRD=0xFD; 
И кажется что правельнее будет если while (PIND.1 == 0) , тоесть выпольнять когда появится лог. 0

Добавлено: Ср дек 03, 2008 02:01:41
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]

Добавлено: Ср дек 03, 2008 06:19:40
mr.Kirill
Глюк сайта

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

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