Страница 2 из 2

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 14:58:01
Prosperous
как происходит прием/передача по SPI я вроде разобрался. Но все равно спасибо :) Вопрос немного в другом. Почему когда есть строка

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

 PORTE=SPI_receive()
по нажатии кнопки первая нога порта F не меняет свое состояние (т.е. не правильно работает), а когда эта строка закоментирована, то состояние ноги меняется при нажатии кнопки (как и должно быть). Они же никак не связаны вроде

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 15:06:10
pyzhman
Как может меняться состояние ноги, если управление ею отсутствует? Программа у вас крутится в ожидании приема байта. Когда комментируете строку, то ожидания нет и программа крутится в управлении ногой.

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 15:22:06
phanis
Можно так попробовать, а лучше обработчик прерывания по приему организовать.

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

#include <spi.h>

unsigned char SPI_receive(void)
{
unsigned char data;
while(!(SPSR & (1<<SPIF)));
data = SPDR; 
return data;
}

void main(void)
{
PORTB=0x00;
DDRB=0x08;

PORTC=0x00;
DDRC=0x00;

PORTE=0x00;
DDRE=0xFF;

PORTF=0x00;
DDRF=0x01;

SPCR=0x40;
SPSR=0x00;

// PORTF=  SPI_receive();
while (1)
{
while(!(SPSR & (1<<SPIF)))
{
   PORTF=    PINC  & 1;
//PORTF= (~PINC) & 1;// инверсное дейсвие
}
PORTE = SPDR;
};

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 15:44:13
Prosperous
Спасибо :) Похоже, то, что надо )

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 15:45:29
pyzhman
<Терпеть не можу когда из-за спины начинают подсказывать. Особенно в Spider.> :)
Ан нет! Нравится.

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 15:53:01
Prosperous
Прошу прощения за оффтоп: 2pyzhman в смысле? )))

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 16:17:10
pyzhman
Забудь, это про смысл существа бытия.

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 16:25:01
phanis
Если это по поводу меня, прошу прощения, больше не повторится..

Re: Не меняется состояние вывода.

Добавлено: Сб мар 03, 2012 16:29:42
pyzhman
Да нет, дружище phanis. Сколько не гоняй, все равно найдется кто-нибудь, кто считает своим долгом испакостить весь кайф. Хотя считает, что делает одолжение. Или думает, что умнее/эрудированнее/расчетливее. Или хочет просто похвастаться.
Хотя могу и ошибаться. Может вопрошающий ждет именно решения и ему сам процесс познания не так уж и важен.

Re: Не меняется состояние вывода.

Добавлено: Вт мар 06, 2012 18:48:30
ukr823f
Ув. опытные коты, я уже начинаю потихоньку сума сходить с этими портами ввода\вывода.
Собрал в протеусе схемку с одной кнопкой и светодиодом Написал программку, но в ответ тишина. Нехочет МК понимать что я нажимаю кнопку. Хотя в протеусе даже видно что на ножке PINB0 - появляется 0.

пишу в десятичной системе, может тут ошибка?
для получения статуса кнопки может нужно использовать битовую операцию (которые я вообще немогу понять....) (REGISTR & (1<<N))

вот код и файл протеуса. Подскажите где я ошибся, а то это уже тихий ужас...

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


#include <avr/io.h>    // Хотим использовать порты ввода/вывода
#include <util/delay.h>  // Хотим использовать функции задержек

 
int main()
{
	 
 DDRB = 0;
 DDRD = 255;
 
 PORTB = 255;
 PORTD  = 0;
 
	while(1)
	{
		if (PINB0==1)
		{
			PORTD=(0<<0);
			_delay_ms(1000);
			PORTD=(1<<0);
			_delay_ms(1000);
			
		} 
		else
		{
			PORTD=0;
		}
     
	}	  
 
}

Re: Не меняется состояние вывода.

Добавлено: Вт мар 06, 2012 18:54:31
ukr823f
Мне в этом плане больше нравиться CodeVisionAVR.
Там понятно можно описывать. Но как я понял синтаксис как в AVR studio более правильный и именно его нужно использовать.
И вообще есть ли у CAVR недостатки перед AVR Studio?

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 07:15:25
pyzhman
так в порт d все время 0 засылается.

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 09:21:18
ukr823f
А почему всё время 0 засылается.? это в какой строке кода происходит?

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 09:29:26
pyzhman

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

int main()
{
    
DDRB = 0;//здесь установили 0
DDRD = 255;

PORTB = 255;
PORTD  = 0;

   while(1)
   {
      if (PINB0==1)
      {
         PORTD=(0<<0);//здесь установили 0
         _delay_ms(1000);
         PORTD=(1<<0);//здесь установили 0
         _delay_ms(1000);
         
      } 
      else
      {
         PORTD=0;//здесь установили 0
      }
     
   }     

}
Гидэ адын?

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 10:37:34
ukr823f

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

{
         PORTD=(0<<0);//здесь установили 0
         _delay_ms(1000);
         PORTD=(1<<0);//здесь установили 1 (в коментарии ошибка была.)
         _delay_ms(1000);
         
      } 
PORTD=(1<<0); - вот тут - Мы же устанавливаем 1 в нулевой пин порта D

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 10:44:03
ploop
Тут мы устанавливаем все пины порта D в ноль. Надо (0<<1). Тогда все в ноль, а нулевой в 1

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 11:09:36
ukr823f
ув. опытные коты.
Ну а если допустим

мне вот в этом выражении нужно выставить пины 0,3,6 в 1, а остальные в ноль

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

if (PINB0 == 0) // если кнопка нажата и на ноге PINB0  - лог ноль
   {
      PORTD......   // делаем на пинах 0,3,6  - единицу а на остальных пинах ноль

    }
Просто уже и в интернете сколько страниц пересмотрел, везде попадаются то примеры под CodeVision, то вообще ничего непонятно.

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 11:19:22
pyzhman

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

PORTD= 0b01001001;
или

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

PORTD= 0x49;
Применять операторы надо с умом, а не тягать,не думая. Разберитесь, как работает << или >>, и тогда применяйте. А до тех пор просто устанавливайте/сбрасывайте лапки порта.

Re: Не меняется состояние вывода.

Добавлено: Ср мар 07, 2012 11:31:54
Мастер Ломастер
ukr823f писал(а):мне вот в этом выражении нужно выставить пины 0,3,6 в 1, а остальные в ноль

Просто уже и в интернете сколько страниц пересмотрел, везде попадаются то примеры под CodeVision, то вообще ничего непонятно.
а вот это читали?

Re: Не меняется состояние вывода.

Добавлено: Чт мар 08, 2012 13:36:28
phanis
ukr823f писал(а):для получения статуса кнопки может нужно использовать битовую операцию (которые я вообще немогу понять....) (REGISTR & (1<<N))

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

#define PINB0   0
if (0==1)
или
if (0==0)