реклама на сайте
подробности

 
 
> Помогите с кодом прошивки для Mega8
Maxi_Man
сообщение Jul 28 2015, 17:15
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Скажите почему не работает данный код?
CODE
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

#define SPI_PORTX PORTB
#define SPI_DDRX DDRB

#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2

void SPI_Init(void)
{

SPI_DDRX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
SPI_PORTX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);


SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(1<<CPHA)|(0<<SPR1)|(0<<SPR0);
SPSR = (1<<SPI2X);
}



int main(void)
{

SPI_Init();
DDRD=0xFF;
DDRB=0xFF;
while(1)
{
unsigned char T=0;
while(T<=254)
{
T++;
unsigned char byte1;
unsigned char b = (T/10)<<4;
unsigned char c = T%10;
byte1 = b+c;
PORTD = byte1;

SPDR = byte1;
while(!(SPSR & (1<<SPIF)));
SPI_PORTX |= (1<<SPI_SS);
_delay_ms(1500);

}


}
}

Прошивка не работает в протеусе и на реальном прошитом контроллере.
IDE: Atmel Studio;
Программатор: Usbasp 2.0.
Схема прилагается.
Прикрепленное изображение


Сообщение отредактировал IgorKossak - Jul 29 2015, 13:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smalcom
сообщение Jul 28 2015, 20:39
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



потому что он с ошибками
Go to the top of the page
 
+Quote Post
Maxi_Man
сообщение Jul 28 2015, 20:54
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Цитата(smalcom @ Jul 28 2015, 23:39) *
потому что он с ошибками

Я так и предполагал) Какие, конкретно, ошибки?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 29 2015, 04:40
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Maxi_Man @ Jul 28 2015, 23:54) *
Я так и предполагал) Какие, конкретно, ошибки?


вот переход SS0->1 есть SPI_PORTX |= (1<<SPI_SS); а обратно нет


в SPI_Init(); настроили PORTB но однако решили перенастроить DDRD=0xFF; DDRB=0xFF; ( наверное вместо B хотели написать D )


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Maxi_Man
сообщение Jul 29 2015, 13:05
Сообщение #5





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Цитата(megajohn @ Jul 29 2015, 07:40) *
вот переход SS0->1 есть SPI_PORTX |= (1<<SPI_SS); а обратно нет


в SPI_Init(); настроили PORTB но однако решили перенастроить DDRD=0xFF; DDRB=0xFF; ( наверное вместо B хотели написать D )

Это все исправил спасибо.
CODE
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

#define SPI_PORTX PORTB
#define SPI_DDRX DDRB

#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2

void SPI_Init(void)
{

SPI_DDRX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
SPI_PORTX = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);


SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(1<<CPHA)|(0<<SPR1)|(0<<SPR0);
SPSR = (1<<SPI2X);
}



int main(void)
{

SPI_Init();
DDRD=0xFF;
while(1)
{
unsigned char T=0;
while(T<=254)
{
T++;
unsigned char byte1;
unsigned char b = (T/10)<<4;
unsigned char c = T%10;
byte1 = b+c;
PORTD = byte1;

SPI_PORTX &= ~(1<<SPI_SS);
SPDR = byte1;
while(!(SPSR & (1<<SPIF)));
SPI_PORTX |= (1<<SPI_SS);
_delay_ms(1500);

}


}
}

Пробовал отладчик в Атмел Студио программа останавливается на этой строчке:
" while(!(SPSR & (1<<SPIF)));".
И дальше выполнение не идёт, можно только подать команду перезапуска контроллера.

Сообщение отредактировал IgorKossak - Jul 29 2015, 13:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2015, 13:30
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Maxi_Man @ Jul 29 2015, 16:05) *
Пробовал отладчик в Атмел Студио
Внутрисхемный отладчик или симулятор? Мега8 не поддерживает внутрисхемную отладку, значит симулятор. А умеет ли симулятор студии имитировать работу модуля SPI? Насколько помню - там далеко не вся периферия полностью имитируется.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 17:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016