Перейти к содержанию
    

Совсем ламерский вопрос.

сконфигурировал порт на вход

DDRA=0x00;

DDRC=0x00;

 

 

 

подал я на него внешне 1, мне ее нужно считывать с PORTD? Правельно?

вот код считывания:

 

switch (Knopka) //êíîïêà 1 è 9

{

Knopka=PORTA+PORTC;

case 0x01: //êíîïêà 1,2,3

PORTB.1=1;

delay_ms(20);

break;

case 0x02:

PORTB.2=1;

delay_ms(20);

break;

 

если да, то или у меня код не работает или на проце порты подпалил ( тогда тока не знаю как :( )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подал я на него внешне 1, мне ее нужно считывать с PORTD?

 

чтение портов производится из регистров PINх.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если читаешь port, то получаешь значение, которое ранее выводил в порт или было установлено по умолчанию – это состояние регистра защелки порта. Если желаешь считать состояние физических выводов порта, то читай pin.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у меня же порт на вход настроен. На pine появляется 1 только когда портнастроен на выход. Покрайней мере так видно в avr studio. при отладки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ты блин даешь!!!!

А документашку кто за тебя читать будет?

 

DDxn PORTxn PUD (in SFIOR) I/O Pull-up Comment

0 0 X Input No Tri-state (Hi-Z)

0 1 0 Input YesPxn will source current if ext. pulled low.

0 1 1 Input No Tri-state (Hi-Z)

1 0 X Output No Output Low (Sink)

1 1 X Output No Output High (Source)

Сказано же черным по русски - Pull-Up :)

И по С книжку найди и прочитай.

И у Атмелов "Getting Started With C for AVR"

И у них же - обязательно - "Efficient C Coding for AVR"

Потом приходи задавать вопросы. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Потом приходи задавать вопросы. :)

Последняя фраза явно была лишней.

Предупреждение, чтобы не повадно было решать кому и куда ходить!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DDDn=0 PORTDn=0 третье состояние подт.резистор в мк отключен

Чтение состояния порта(вход) с регистра PINn

 

DDDn=0 PORTDn=1 порт сконфигурирован как вход. подт.резистор включен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Потом приходи задавать вопросы. :)

Последняя фраза явно была лишней.

Предупреждение, чтобы не повадно было решать кому и куда ходить!

 

Вот спасибо! :)

Да, погорячился немного, извините.

Но документашку читать надо.

To BlauTood:

В твоем случае, если я все правильно понимаю, должно быть примерно так:

 

char Knopka=PIND;

 

switch (Knopka) //

{

case 0x01: PORTB |= 1 << YouBit2; delay_ms(20); break;

case 0x02: PORTB |= 1 << YouBit2; delay_ms(20); break;

default: delay_ms(20); break;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include <mega8535.h>

#include <delay.h>

 

unsigned char temp;

unsigned char Knopka;

 

void init(void);

void port(void);

void main(void)

{

init();

port();

}

 

void port(void) {

temp=PINA;

if (temp==0xFF){

PORTB=0;

delay_ms(20);

port();

}

else

switch (Knopka)

{

Knopka=PINA;

case 0xFE:

PORTB++;

delay_ms(1000);

break;

default:

delay_ms(20);

break;

}

 

port();

}

 

 

void init(void)

{

PORTA=0x00; подтягивается внешне к +

DDRA=0x00;

 

PORTB=0x00;

DDRB=0xFF;

}

 

 

Эфект:

горят постоянно все лампочки и на кнопки не реагирует :(

в чем трабл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void port(void) {

 

...

 

port();

}

 

 

 

Процедура вызывает самое себя. У вас моментально переполняется стек вызовов подпрограмм, и контроллер виснет, перегружается или ещё как-нибудь с ума сходит. Зацикливание обычно делают в main, например, так:

void main(void)
{
 init();
 while (1) {
   port();
 }
}

 

Со switch-case правильно обращаться так:

        Knopka=PINA;
       switch (Knopka) 
       {
               case 0xFE:
      ...

 

Да, вот ещё: компилятору проще сделать PORTB |= 0x01, чем PORTB++; ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В твоем варианте программа зациклена не правильно - выполняется рекурсивно функция port() поэтому и ломается.

Должно быть примерно так:

...........

.........

 

// эта штука называется основной цикл.

// алгоритм программы живет именно здесь.

// все остальные функции служат для реализации частных задач.

// именно по этому он называется MAIN - главный.

void main(void)

{

init(); // ну, понятно, инициализация

 

for(;;) // крутимся тут всегда

{

port(); // собственно задача, ради которой все и затевалось :)

 

}

 

}

 

void port(void)

{

temp=PINA; // читаем кнопки

switch (temp)

{

case 0xFE : PORTB=0x01; delay_ms(20); break; // кнопка 1

case 0xFD : PORTB=0x02; delay_ms(20); break; // кнопка 2

case 0xFB : PORTB=0x04; delay_ms(20); break; // кнопка 3

case 0xF7 : PORTB=0x08; delay_ms(20); break; // кнопка 4

 

case 0xFF:PORTB=0x00; delay_ms(20); break; // если не нажато ни

//одной тушим лампочки

 

default: break; // неизвестная или не нужная комбинация

//кнопок - ничего не делаем

}

}

 

void init(void)

{

PORTA=0x00; //подтягивается внешне к +

DDRA=0x00; // на ввод

 

PORTB=0x00; // выключаем - лампочки.

DDRB=0xFF; //

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...