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

Рекомендуемые сообщения

Я подлючил Atmega8 к датчику оптической мышы(датчик от МК мышы не отключал).

AdUU1urIS6.jpg

На Atmega8 создаю spi интерфейс в слайф режиме и передаю из него данные через USART на com порт компа.

Когда я соединяю землю мышки с землёй МК, то МК реагирует ток на втыкание и вытыкание мышки в комп.

При разомкнутой земле МК получает нолики при выключенной мышки и мусор при рабочей.

Я никогда раньше не работал с SPI интерфейсом, подскажите что я сделал нитак.

Код прошивки Atmega8.

#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL  // 8 MHz

#define FOSC 8000000// Clock Speed
#define BAUD 1200
#define MYUBRR FOSC/16/BAUD-1
#define DDR_SPI DDRB
#define DD_MISO DDB0



void USART_Init( unsigned int);  
void USART_Transmit( unsigned char);
void USART_TransmitC( unsigned char *);
unsigned char USART_Receive( void);

void SPI_SlaveInit(void);
char SPI_SlaveReceive(void);


  int main(void)              // начало основой программы
  {		
double i=1000;
int n=0;
unsigned char c;

SPI_SlaveInit();
USART_Init ( MYUBRR );

double i=1000;
int n=0;
unsigned char c;

_delay_ms(i);

USART_TransmitC( "Programm Start" );


           while (1) {              // Бесконечный цикл



			c=SPI_SlaveReceive();
			USART_Transmit( c );



           }       // закрывающая скобка бесконечного цикла

  }      // закрывающая скобка основной программы



void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC=0x86;//
//UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}


void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

void USART_TransmitC( unsigned char *data )
{
int i=0;
while(data[i]!=0)
{
	USART_Transmit( data[i] );
	i++;
}
}

void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}

Изменено пользователем HOMPAIN
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А накой так делать вообще? Скорости работы порта контроллера думаешь хватает чтобы перехватывать обмен?

Учение - изучение правил. Опыт - изучение исключений.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Мне вопще не нужно на комп данные передавать, щас это токо для того, чтоб разобраться.

Скорости должно полюбому хватить, поскольльку по SPI сенсор данные не сплошным потоком шлёт, а токо при перемещении и переходе в ждущий режим. Буфера контролера на эти данные вполне должно хватить.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А почему оставлен штатный контролер мыши??? Он же там как мастер работает... Вы должны быть мастером на атмега и активно брать данные из датчика.. Ну и потом с ними можете делать что хотите...

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

Он может не успевать реагировать именно на сигналы SPI.

А почему оставлен штатный контролер мыши???

Я полагаю, что мышь должна работать штатно, а второй контроллер - для реализации каких-нибудь других полезных функций...

Учение - изучение правил. Опыт - изучение исключений.

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

Читайте даташит!!! Штатный контролер там только мешает!! Он умеет только забирать данные и отсылать их в компа.... Сам датчик вполне жизнеспособный и без контролера. Перестройте мегу на мастер и читайте данные которые вам нужны...

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

Переподключил Atmega8 на мастера. От сенсора так ничего и не получл :(

OVX2B2ht91.jpg

#include <avr/io.h>
#include <avr/delay.h>


#define F_CPU 	8000000UL  // 8 MHz

#define FOSC 	8000000// Clock Speed
#define BAUD 	1200
#define MYUBRR 	FOSC/16/BAUD-1
#define DDR_SPI DDRB
#define DD_MOSI DDB0
#define DD_MISO DDB0
#define DD_SCK  DDB5



void USART_Init( unsigned int);  
void USART_Transmit( unsigned char);
void USART_TransmitS( unsigned char *);
unsigned char USART_Receive( void);

void SPI_SlaveInit(void);
void SPI_MasterInit(void);
void SPI_Transmit(char cData);
char SPI_Receive(void);


  int main(void)              // начало основой программы
  {


	SPI_MasterInit();
	USART_Init ( MYUBRR );

	double n=1000;
	int i=0;
	unsigned char c;
	unsigned char picture[324];

	_delay_ms(n);

	USART_TransmitS( "Programm Start" );




       while (1) {              // Бесконечный цикл

		_delay_ms(n);

		USART_TransmitS( "Перезапускаю мышь" );

		_delay_ms(n);

		SPI_Transmit(0x08);
		SPI_Transmit(0);

		USART_TransmitS( "Начинаю считывание" );

		SPI_Transmit(0x08);
		SPI_Transmit(11);


		for(i=0;i<324;i++)	
			picture[i]=SPI_Receive();


		_delay_ms(n);

		USART_TransmitS( "Картика получена, передаю.." );

		_delay_ms(n);

		for(i=0;i<324;i++)
			USART_Transmit(picture[i]);

		_delay_ms(n);

		USART_TransmitS( "Передача завершена" );

	}       // закрывающая скобка бесконечного цикла

  }      // закрывающая скобка основной программы



void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC=0x86;//
//UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}


void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

void USART_TransmitS( unsigned char *data )
{
int i=0;
while(data[i]!=0)
{
	USART_Transmit( data[i] );
	i++;
}
}

void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_Transmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

char SPI_Receive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}


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

А подключен кварц к датчику? Выложите полную схему... И вообще вы невнимательно смотрел в даташит - там вход данных и выход ОДНИМ ДВУХНАПРАВЛЕННЫМ выводом сделан. А по вашей схеме вы только вход подключаете... Чтобы выдало чтото надо и вход подключить и подать команду на выдачу!!! Вообще для начала изучите все варианты этой шины и примеры работы с ней и станет вам всё сразу понятно. Вообще то написать тоже самое проще програмно...

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

Вы пытаетесь читать картинку? Ну так там же написано - сначала посылаете туда 00 а потом начинаете ЧИТАТЬ 324 раза с того же адреса. У меня лично всё читалось... Проблемы были с линзой и яркостью освещения... Просто лень искать чтобы проверить - закинул оба датчика на крышу...

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...