Проблемы с SPI протоколом ATmega1284

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

Всем привет! Собираю устройство, микроконтроллер и драйвер к двигателю, они общаются по SPI. С первого раза не получилось поэтому отсоединил все ножки SPI от драйвера и пытаюсь увидеть сигнал с помощью осциллографа. Так вот его я и не вижу. Люди добрые посмотрите пожалуйста на код, может ошибся где? Сигнал пытаюсь поймать на MOSI, на ножке SCK вообще что то ничего нет. Какая то лажа. Сначала пытался сразу в драйвер инфу посылать так никакой реакции поэтому пошагово ищу проблему. Спасибо всем кто откликнется за раннее. Если еще какая то информация нужна и я забыл пишите)
Вот от этого кода я надеялся после включения на осцилле увидеть скачок через 5 секунд, как я например вижу при отправлении команды с программатора. Использую AVR ISP mkII.

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

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 20000000UL

unsigned char byte = 0xAA;

int main(void)
{

void InitSPI(void)
{
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);	 // Set MOSI , SCK , and SS output
SPCR = (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0);	// Enable SPI, Master, set clock rate fck/128  
}

_delay_ms(5000);

void WriteByteSPI(unsigned char byte)
{
SPDR = byte;					//Load byte to Data register
while(!(SPSR & (1<<SPIF))); 	// Wait for transmission complete 
}

}
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Это весь код? Тогда не увидите! :)
У вас главная процедура main. В ней вы определяете две локальные процедуры, но не вызываете ни одну из них.
Между определениями у вас вызывается процедура задержки. И всё.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

что то не доехал)поправьте плиз в чем затык)раньше с SPI ни разу, попробовал с примера в инете вот не прокатило(
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Эх. Да похоже дело не в том, что "раньше с SPI ни разу"... :)
Основы языка Си подучить бы вам.

Рассмотрим код сверху вниз.

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

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 20000000UL

unsigned char byte = 0xAA;

int main(void)
{

// это определение процедуры InitSPI
// сейчас этот код не выполниться.
void InitSPI(void)
{
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);	 // Set MOSI , SCK , and SS output
SPCR = (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0);	// Enable SPI, Master, set clock rate fck/128  
}
// закончилось определение процедуры InitSPI

// вызов процедуры
// это реально выполниться задежка
_delay_ms(5000);

// это определение процедуры WriteByteSPI
// сейчас этот код не выполниться.
void WriteByteSPI(unsigned char byte)
{
SPDR = byte;					//Load byte to Data register
while(!(SPSR & (1<<SPIF))); 	// Wait for transmission complete 
}
// закончилось определение процедуры WriteByteSPI

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

Исправить вашу ситуацию можно двумя способами.
СпойлерПервый

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

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 20000000UL

unsigned char byte = 0xAA;

int main(void)
{

DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);	 // Set MOSI , SCK , and SS output
SPCR = (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0);	// Enable SPI, Master, set clock rate fck/128  

_delay_ms(5000);

SPDR = byte;					//Load byte to Data register
while(!(SPSR & (1<<SPIF))); 	// Wait for transmission complete 

}
Второй

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

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 20000000UL

unsigned char byte = 0xAA;

int main(void)
{

void InitSPI(void)
{
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);	 // Set MOSI , SCK , and SS output
SPCR = (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0);	// Enable SPI, Master, set clock rate fck/128  
}

void WriteByteSPI(unsigned char byte)
{
SPDR = byte;					//Load byte to Data register
while(!(SPSR & (1<<SPIF))); 	// Wait for transmission complete 
}

// вызываем процедуру инициализации SPI
InitSPI(); // тут выполниться код определённый ранее

_delay_ms(5000);  // задержка

// вызываем процедуру передачи символа/байта
WriteByteSPI('-');  // передать байт с кодом символа -
WriteByteSPI(32);  // передать байт с кодом символа пробел

}
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

ну не правда)я хоть и начинающий любитель-программист, но у меня уже работали пару программ на С)бывает)так что не надо тут)за пример кода спасибо большое)
может расскажете как должна выглядеть осциллограма в обоих случаях?)у меня типа прямоугольные импульсы с какими то скачками где то раз в 8 секунд....это на MOSI
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Пара программ, говорите... :)
"начинающий любитель-программист" - вот это уже точнее совпадает с уровнем вопросов.

На MOSI оно так и должно быть. Зависит от передаваемого байта.
На SCK должна быть "порция" меандра.

Если по вашему коду... А почему через 8 секунд, а не через 5? Вам не интересно? :)

PS: Не бойтесь показаться глупым задавая правильные (и не очень :) ) вопросы.

PPS: http://www.bugtraq.ru/forum/faq/general ... tions.html
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

спасибо за ответ)
напомню что все ноги SPI у меня в воздухе) вот сейчас запускаю этот код

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

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 20000000UL

unsigned char byte = 0xAA;

int main(void)
{

void InitSPI(void)
{
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);    // Set MOSI , SCK , and SS output
SPCR = (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0);   // Enable SPI, Master, set clock rate fck/128  
}

void WriteByteSPI(unsigned char byte)
{
SPDR = byte;               //Load byte to Data register
while(!(SPSR & (1<<SPIF)));    // Wait for transmission complete 
}

// вызываем процедуру инициализации SPI
InitSPI(); // тут выполниться код определённый ранее

_delay_ms(5000);  // задержка

// вызываем процедуру передачи символа/байта
WriteByteSPI('-');  // передать байт с кодом символа -
WriteByteSPI(32);  // передать байт с кодом символа пробел

}
при подключенном программаторе на MOSI ноль, на SCK ноль
при отключенном программаторе на MOSI прямоугольные импульсы положительные, ну от 0 до где то 3 вольт
а на SCK такие же только отзеркаленные относительно нуля
после пяти секунд при подключенном программаторе на SCK на доли секунды поднимается уровень до 3 вольт
при отключенном я ничего не заметил
я так понимаю это ненормальное поведение?в чем может быть проблема?или так и должно быть?
если все в порядке то как я могу в засунуть в 8 битный регистр 20 бит для драйвера?
спасибо)
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

robototechnik писал(а):я так понимаю это ненормальное поведение?в чем может быть проблема?или так и должно быть?
если все в порядке то как я могу в засунуть в 8 битный регистр 20 бит для драйвера?
спасибо)
Недостаточно информации, чтобы сделать вывод о нормальности поведения.
Какого драйвера?

Повторюсь.
Настоятельно рекомендую ознакомиться http://www.bugtraq.ru/forum/faq/general ... tions.html
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Открыл глаза
Сообщения: 75
Зарегистрирован: Сб апр 20, 2013 23:15:21

Сообщение robototechnik »

и я повторюсь)пока что все ноги SPI в воздухе)с драйвером не соединены)соответственно поведение в теории должно быть нормальным)ведь так?
драйвер двигателя трехфазного обычное соединение SPI с микроконтроллером
какая еще информация нужна?)
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Амплитуда в 3 вольта нормальна для напряжения питания в 3.3 вольта, а для питания в 5 вольт не очень. А может у вас осциллограф слабенький.
Какой именно драйвер? Их море... Ссылку на спецификацию не плохо было бы привести.
Подробности, подробности. Только вы их знаете. И чтобы другому человеку что-то дельное вам посоветовать вы должны посвятить его в детали вашего дела. Хотябы в ту его часть, которая касается вашего вопроса.
Телепаты все остались на Вавилоне-5. :)
А то ведь легко может перейти на уровень как в анекдоте.
СпойлерЛетят в самолете Петька и Василий Иванович, Василий Иванович спрашивает:
- Петька, приборы!
Петька отвечает:
- 200!
Василий Иванович:
- А почему 200!
Петька:
- А почему приборы!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

Вернуться в «AVR»