|
Помогите с кодом прошивки для Mega8 |
|
|
|
Jul 28 2015, 17:15
|
Группа: Участник
Сообщений: 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] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Jul 28 2015, 20:54
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Цитата(smalcom @ Jul 28 2015, 23:39)  потому что он с ошибками Я так и предполагал) Какие, конкретно, ошибки?
|
|
|
|
|
Jul 29 2015, 13:05
|
Группа: Участник
Сообщений: 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] - для короткого!!!
|
|
|
|
|
Jul 29 2015, 13:51
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
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); } //========================================================================
|
|
|
|
|
Jul 29 2015, 14:36
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Это всё хорошо, а чем мой код плох? А на счёт умеет ли симулятор студии имитировать работу модуля SPI, то я тоже не знаю((( Я заливал прошивку на контроллер, на выходы регистра подключал диоды, но ничего не происходит.
Сообщение отредактировал IgorKossak - Jul 29 2015, 17:17
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jul 29 2015, 15:01
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Цитата(demiurg1978 @ Jul 29 2015, 17:57)  Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь. Лучше б вы объяснили, что не так в моем коде.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|