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

Помогите с кодом прошивки для Mega8

Скажите почему не работает данный код?

#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.

Схема прилагается.

post-87751-1438103649_thumb.png

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


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

Для этого существуют отладчики, чтобы пошагово или еще каким способом просмотреть куда сворачивает программа или где глючит.

А на сам код можно долго смотреть и не понимать почему не работает.

Поделиться сообщением


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

Я так и предполагал) Какие, конкретно, ошибки?

 

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

 

 

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

Поделиться сообщением


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

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

 

 

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

Это все исправил спасибо.

#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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


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

Пробовал отладчик в Атмел Студио
Внутрисхемный отладчик или симулятор? Мега8 не поддерживает внутрисхемную отладку, значит симулятор. А умеет ли симулятор студии имитировать работу модуля SPI? Насколько помню - там далеко не вся периферия полностью имитируется.

 

Поделиться сообщением


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

AVR-Studio 4.19.

post-79709-1438177736_thumb.jpg

post-79709-1438177776_thumb.jpg

 

spi.h

//========================================================================
#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

//========================================================================
#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);
}
//========================================================================

Поделиться сообщением


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

Это всё хорошо, а чем мой код плох?

А на счёт умеет ли симулятор студии имитировать работу модуля SPI, то я тоже не знаю(((

Я заливал прошивку на контроллер, на выходы регистра подключал диоды, но ничего не происходит.

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


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

Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь.

Поделиться сообщением


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

Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь.

Лучше б вы объяснили, что не так в моем коде.

Поделиться сообщением


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

Удвоение частоты SPI убрать. И у вас скорее всего включен не тот режим SPI. Дел в том, что у SPI 4 режима. Погуглить. Полностью повторить мой код и проверить. Я вам дал код как раз для 74HC595. Сначала повторите мой код. Потом смотрите где отличия от вашего. Мне с вашим кодом разбираться некогда.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...