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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

как происходит прием/передача по SPI я вроде разобрался. Но все равно спасибо :) Вопрос немного в другом. Почему когда есть строка

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

 PORTE=SPI_receive()
по нажатии кнопки первая нога порта F не меняет свое состояние (т.е. не правильно работает), а когда эта строка закоментирована, то состояние ноги меняется при нажатии кнопки (как и должно быть). Они же никак не связаны вроде
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Как может меняться состояние ноги, если управление ею отсутствует? Программа у вас крутится в ожидании приема байта. Когда комментируете строку, то ожидания нет и программа крутится в управлении ногой.
Docendo discimus
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение 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;
};
Контактная информация:
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

Спасибо :) Похоже, то, что надо )
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

<Терпеть не можу когда из-за спины начинают подсказывать. Особенно в Spider.> :)
Ан нет! Нравится.
Docendo discimus
Контактная информация:
Реклама
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Сообщение Prosperous »

Прошу прощения за оффтоп: 2pyzhman в смысле? )))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Забудь, это про смысл существа бытия.
Docendo discimus
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Если это по поводу меня, прошу прощения, больше не повторится..
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Да нет, дружище phanis. Сколько не гоняй, все равно найдется кто-нибудь, кто считает своим долгом испакостить весь кайф. Хотя считает, что делает одолжение. Или думает, что умнее/эрудированнее/расчетливее. Или хочет просто похвастаться.
Хотя могу и ошибаться. Может вопрошающий ждет именно решения и ему сам процесс познания не так уж и важен.
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 79
Зарегистрирован: Чт мар 01, 2012 18:30:00
Откуда: ВМ

Сообщение 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;
		}
     
	}	  
 
}
Вложения
my1.zip
Симуляция в протеусе
(6.68 КБ) 124 скачивания
Открыл глаза
Сообщения: 79
Зарегистрирован: Чт мар 01, 2012 18:30:00
Откуда: ВМ

Сообщение ukr823f »

Мне в этом плане больше нравиться CodeVisionAVR.
Там понятно можно описывать. Но как я понял синтаксис как в AVR studio более правильный и именно его нужно использовать.
И вообще есть ли у CAVR недостатки перед AVR Studio?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

так в порт d все время 0 засылается.
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 79
Зарегистрирован: Чт мар 01, 2012 18:30:00
Откуда: ВМ

Сообщение ukr823f »

А почему всё время 0 засылается.? это в какой строке кода происходит?
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение 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
      }
     
   }     

}
Гидэ адын?
Docendo discimus
Контактная информация:
Открыл глаза
Сообщения: 79
Зарегистрирован: Чт мар 01, 2012 18:30:00
Откуда: ВМ

Сообщение ukr823f »

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

{
         PORTD=(0<<0);//здесь установили 0
         _delay_ms(1000);
         PORTD=(1<<0);//здесь установили 1 (в коментарии ошибка была.)
         _delay_ms(1000);
         
      } 
PORTD=(1<<0); - вот тут - Мы же устанавливаем 1 в нулевой пин порта D
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Тут мы устанавливаем все пины порта D в ноль. Надо (0<<1). Тогда все в ноль, а нулевой в 1
Открыл глаза
Сообщения: 79
Зарегистрирован: Чт мар 01, 2012 18:30:00
Откуда: ВМ

Сообщение ukr823f »

ув. опытные коты.
Ну а если допустим

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

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

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

    }
Просто уже и в интернете сколько страниц пересмотрел, везде попадаются то примеры под CodeVision, то вообще ничего непонятно.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

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

PORTD= 0b01001001;
или

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

PORTD= 0x49;
Применять операторы надо с умом, а не тягать,не думая. Разберитесь, как работает << или >>, и тогда применяйте. А до тех пор просто устанавливайте/сбрасывайте лапки порта.
Docendo discimus
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

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

Просто уже и в интернете сколько страниц пересмотрел, везде попадаются то примеры под CodeVision, то вообще ничего непонятно.
а вот это читали?
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

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

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

#define PINB0   0
if (0==1)
или
if (0==0)
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»