Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Совсем ламерский вопрос.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
BlauTood
сконфигурировал порт на вход
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;

если да, то или у меня код не работает или на проце порты подпалил ( тогда тока не знаю как sad.gif )
vet
Цитата
подал я на него внешне 1, мне ее нужно считывать с PORTD?


чтение портов производится из регистров PINх.
Если кнопки замыкаются на общий провод, то биты PORTx, на которых висят кнопки, лучше выставить в 1 - так включаем внутренние подтягивающие резисторы и избегаем необходимости навешивать внешние.
sseett
Если читаешь port, то получаешь значение, которое ранее выводил в порт или было установлено по умолчанию – это состояние регистра защелки порта. Если желаешь считать состояние физических выводов порта, то читай pin.
BlauTood
Так у меня же порт на вход настроен. На pine появляется 1 только когда портнастроен на выход. Покрайней мере так видно в avr studio. при отладки
andk
Ну ты блин даешь!!!!
А документашку кто за тебя читать будет?

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 smile.gif
И по С книжку найди и прочитай.
И у Атмелов "Getting Started With C for AVR"
И у них же - обязательно - "Efficient C Coding for AVR"
Потом приходи задавать вопросы. smile.gif
IgorKossak
Цитата(andk @ Mar 20 2005, 14:08)
...
Потом приходи задавать вопросы. smile.gif
*

Последняя фраза явно была лишней.
Предупреждение, чтобы не повадно было решать кому и куда ходить!
DimonD
DDDn=0 PORTDn=0 третье состояние подт.резистор в мк отключен
Чтение состояния порта(вход) с регистра PINn

DDDn=0 PORTDn=1 порт сконфигурирован как вход. подт.резистор включен
andk
Цитата(IgorKossak @ Mar 21 2005, 14:36)
Цитата(andk @ Mar 20 2005, 14:08)
...
Потом приходи задавать вопросы. smile.gif
*

Последняя фраза явно была лишней.
Предупреждение, чтобы не повадно было решать кому и куда ходить!
*



Вот спасибо! smile.gif
Да, погорячился немного, извините.
Но документашку читать надо.
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;
}
BlauTood
#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;
}


Эфект:
горят постоянно все лампочки и на кнопки не реагирует sad.gif
в чем трабл?
vet
Цитата(BlauTood @ Mar 22 2005, 18:05)
void port(void) {

...

port();
}

*



Процедура вызывает самое себя. У вас моментально переполняется стек вызовов подпрограмм, и контроллер виснет, перегружается или ещё как-нибудь с ума сходит. Зацикливание обычно делают в main, например, так:
Код
void main(void)
{
 init();
 while (1) {
   port();
 }
}


Со switch-case правильно обращаться так:
Код
       Knopka=PINA;
       switch (Knopka)
       {
               case 0xFE:
      ...


Да, вот ещё: компилятору проще сделать PORTB |= 0x01, чем PORTB++; wink.gif
andk
В твоем варианте программа зациклена не правильно - выполняется рекурсивно функция port() поэтому и ломается.
Должно быть примерно так:
...........
.........

// эта штука называется основной цикл.
// алгоритм программы живет именно здесь.
// все остальные функции служат для реализации частных задач.
// именно по этому он называется MAIN - главный.
void main(void)
{
init(); // ну, понятно, инициализация

for(;;) // крутимся тут всегда
{
port(); // собственно задача, ради которой все и затевалось smile.gif

}

}

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; //
}
BlauTood
Большое ТЕБЕ andk спасибо за полный, качественый и понятный ответ.
andk
пожалуйста! smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.