maximan 0 28 июля, 2015 Опубликовано 28 июля, 2015 (изменено) · Жалоба Скажите почему не работает данный код? #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. Схема прилагается. Изменено 29 июля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 28 июля, 2015 Опубликовано 28 июля, 2015 · Жалоба потому что он с ошибками Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maximan 0 28 июля, 2015 Опубликовано 28 июля, 2015 · Жалоба потому что он с ошибками Я так и предполагал) Какие, конкретно, ошибки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрК 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Для этого существуют отладчики, чтобы пошагово или еще каким способом просмотреть куда сворачивает программа или где глючит. А на сам код можно долго смотреть и не понимать почему не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Я так и предполагал) Какие, конкретно, ошибки? вот переход SS0->1 есть SPI_PORTX |= (1<<SPI_SS); а обратно нет в SPI_Init(); настроили PORTB но однако решили перенастроить DDRD=0xFF; DDRB=0xFF; ( наверное вместо B хотели написать D ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Какие, конкретно, ошибки? а что не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maximan 0 29 июля, 2015 Опубликовано 29 июля, 2015 (изменено) · Жалоба вот переход 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)));". И дальше выполнение не идёт, можно только подать команду перезапуска контроллера. Изменено 29 июля, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба используется симулятор или удалённая отладка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Пробовал отладчик в Атмел СтудиоВнутрисхемный отладчик или симулятор? Мега8 не поддерживает внутрисхемную отладку, значит симулятор. А умеет ли симулятор студии имитировать работу модуля SPI? Насколько помню - там далеко не вся периферия полностью имитируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба AVR-Studio 4.19. 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); } //======================================================================== Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maximan 0 29 июля, 2015 Опубликовано 29 июля, 2015 (изменено) · Жалоба Это всё хорошо, а чем мой код плох? А на счёт умеет ли симулятор студии имитировать работу модуля SPI, то я тоже не знаю((( Я заливал прошивку на контроллер, на выходы регистра подключал диоды, но ничего не происходит. Изменено 29 июля, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maximan 0 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Я вам на пальцах в картинках показал, как можно дергать флаг SPIF. Код я выложил из рабочего проекта. Разбирайтесь. Лучше б вы объяснили, что не так в моем коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 29 июля, 2015 Опубликовано 29 июля, 2015 · Жалоба Удвоение частоты SPI убрать. И у вас скорее всего включен не тот режим SPI. Дел в том, что у SPI 4 режима. Погуглить. Полностью повторить мой код и проверить. Я вам дал код как раз для 74HC595. Сначала повторите мой код. Потом смотрите где отличия от вашего. Мне с вашим кодом разбираться некогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться