Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с кодом прошивки для Mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Maxi_Man
Скажите почему не работает данный код?
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.
Схема прилагается.
Нажмите для просмотра прикрепленного файла
smalcom
потому что он с ошибками
Maxi_Man
Цитата(smalcom @ Jul 28 2015, 23:39) *
потому что он с ошибками

Я так и предполагал) Какие, конкретно, ошибки?
Александр1
Для этого существуют отладчики, чтобы пошагово или еще каким способом просмотреть куда сворачивает программа или где глючит.
А на сам код можно долго смотреть и не понимать почему не работает.
megajohn
Цитата(Maxi_Man @ Jul 28 2015, 23:54) *
Я так и предполагал) Какие, конкретно, ошибки?


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


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

а что не работает?
Maxi_Man
Цитата(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)));".
И дальше выполнение не идёт, можно только подать команду перезапуска контроллера.
smalcom
используется симулятор или удалённая отладка?
Сергей Борщ
Цитата(Maxi_Man @ Jul 29 2015, 16:05) *
Пробовал отладчик в Атмел Студио
Внутрисхемный отладчик или симулятор? Мега8 не поддерживает внутрисхемную отладку, значит симулятор. А умеет ли симулятор студии имитировать работу модуля SPI? Насколько помню - там далеко не вся периферия полностью имитируется.
demiurg1978
AVR-Studio 4.19.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

spi.h
CODE

//========================================================================
#ifndef SPI_H

#define SPI_H

#include "spi.h"
//========================================================================

//========================================================================
#include <ioavr.h>

#include "avrlibtypes.h"
#include "macros.h"

#include "proc_in_out.h"
//========================================================================

//========================================================================
#define SPI_PORT PORTB
#define SPI_PIN PINB
#define SPI_DDR DDRB
//------------------------------------------------------------------------
#define _SC_PORT PORTB
#define _SC_PIN PINB
#define _SC_DDR DDRB

#define _SC PB4
//------------------------------------------------------------------------
#define MOSI_PORT PORTB
#define MOSI_PIN PINB
#define MOSI_DDR DDRB

#define MOSI PB5
//------------------------------------------------------------------------
#define MISO_PORT PORTB
#define MISO_PIN PINB
#define MISO_DDR DDRB

#define MISO PB6
//------------------------------------------------------------------------
#define SCK_PORT PORTB
#define SCK_PIN PINB
#define SCK_DDR DDRB

#define SCK PB7
//------------------------------------------------------------------------
#define _OE_PORT PORTB
#define _OE_PIN PINB
#define _OE_DDR DDRB

#define _OE PB0
//------------------------------------------------------------------------
#define LATCH_OUT_PORT PORTB
#define LATCH_OUT_PIN PINB
#define LATCH_OUT_DDR DDRB

#define LATCH_OUT PB1
//------------------------------------------------------------------------
#define LATCH_IN_PORT PORTB
#define LATCH_IN_PIN PINB
#define LATCH_IN_DDR DDRB

#define LATCH_IN PB2
//========================================================================

//========================================================================
extern u08 spi_receive_buf [];

extern u08 spi_transf_buf [];
//========================================================================

//========================================================================
void spi_init (void);
//------------------------------------------------------------------------
void spi_transf (u08 spi_cnt);
//------------------------------------------------------------------------
void strob_latch_in (void);
//------------------------------------------------------------------------
void strob_latch_out (void);
//------------------------------------------------------------------------
void strob_delay (void);
//------------------------------------------------------------------------
void _oe_enable (void);
void _oe_disable (void);
//========================================================================

#endif


spi.c
CODE

//========================================================================
#include "spi.h"
//========================================================================

//========================================================================
u08 spi_receive_buf [IN_OUT_BYTES];

u08 spi_transf_buf [IN_OUT_BYTES];
//========================================================================

//========================================================================
void spi_init (void)
{
_OE_PORT |= 1<<_OE;
LATCH_IN_PORT |= 1<<LATCH_IN;
LATCH_OUT_PORT |= 1<<LATCH_OUT;

_OE_DDR |= 1<<_OE;
LATCH_IN_DDR |= 1<<LATCH_IN;
LATCH_OUT_DDR |= 1<<LATCH_OUT;

MOSI_PORT |= 1<<MOSI;
MISO_PORT |= 1<<MISO;

_SC_DDR |= 1<<_SC;
MOSI_DDR |= 1<<MOSI;
SCK_DDR |= 1<<SCK;

SPCR = 1<<SPE | 1<<MSTR | 1<<SPR1 | 1<<SPR0;
}
//------------------------------------------------------------------------
void spi_transf (u08 spi_cnt)
{
SPSR |= 1<<SPIF;

SPDR = spi_transf_buf [spi_cnt];

while (!(SPSR & (1<<SPIF)))
{
__watchdog_reset ();
}
}
//------------------------------------------------------------------------
void strob_latch_in (void)
{
clr_bit (LATCH_IN_PORT, LATCH_IN);
strob_delay ();
set_bit (LATCH_IN_PORT, LATCH_IN);
}

void strob_latch_out (void)
{
clr_bit (LATCH_OUT_PORT, LATCH_OUT);
strob_delay ();
set_bit (LATCH_OUT_PORT, LATCH_OUT);
}
//------------------------------------------------------------------------
void strob_delay (void)
{
u08 a = 16;

while (a--);
}
//------------------------------------------------------------------------
void _oe_enable (void)
{
_OE_PORT &= (~(1<<_OE));
}

void _oe_disable (void)
{
_OE_PORT |= (1<<_OE);
}
//========================================================================
Maxi_Man
Это всё хорошо, а чем мой код плох?
А на счёт умеет ли симулятор студии имитировать работу модуля SPI, то я тоже не знаю(((
Я заливал прошивку на контроллер, на выходы регистра подключал диоды, но ничего не происходит.
demiurg1978
Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь.
Maxi_Man
Цитата(demiurg1978 @ Jul 29 2015, 17:57) *
Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь.

Лучше б вы объяснили, что не так в моем коде.
demiurg1978
Удвоение частоты SPI убрать. И у вас скорее всего включен не тот режим SPI. Дел в том, что у SPI 4 режима. Погуглить. Полностью повторить мой код и проверить. Я вам дал код как раз для 74HC595. Сначала повторите мой код. Потом смотрите где отличия от вашего. Мне с вашим кодом разбираться некогда.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.