Прошу помогите с SPI из USI на tiny85
- Сообщения: 108
- Зарегистрирован: Ср янв 18, 2012 16:33:58
- Реклама
Ну вы сами то посмотрите что вы пытаетесь загнать в память. Конечно на постоянные 0x11 она ничего отвечать не обязана. Сделайте как я сказал, потом можно будет вопросы задавать.
Вот чтение статуса по моему
Код: Выделить всё
#include <avr/io.h>
#include "util/delay.h"
unsigned char _FF_spi(unsigned char mydata);
unsigned char _FF_spi(unsigned char mydata)
{
asm("OUT 0x0F,R24");
asm("LDI R24,0x11");
asm("LDI R17,0x13");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
asm("OUT 0x0D,R24");
asm("OUT 0x0D,R17");
return (USIDR);
}
void port_init(void)
{ DDRB |= _BV(PB3); // as output (DO)
DDRB |= _BV(PB1); // as output (DO)
DDRB |= _BV(PB2); // as output (USISCK)
DDRB &= ~_BV(PB0); // as input (DI)
PORTB |= _BV(PB0); // pullup on (DI)
PORTB |= _BV(PB3);
}
int main(void)
{unsigned char resive_byte;
port_init();
while(1){
_delay_ms(100);
PORTB &= 0xFF- _BV(PB3);
resive_byte = _FF_spi(0x5);
PORTB |= _BV(PB3);
}
return 0;
}
0x05 дойдет, а в другую сторону передача где? 
И откуда вы знаете что параметр функции передается именно через R24? Ну и писали бы тогда asm("OUT 0x0F,mydata"), если компилятор конечно позволяет такое...
И откуда вы знаете что параметр функции передается именно через R24? Ну и писали бы тогда asm("OUT 0x0F,mydata"), если компилятор конечно позволяет такое...
Последний раз редактировалось Engineer_Keen Ср янв 18, 2012 18:58:55, всего редактировалось 1 раз.
Ответ в симуляторе на 5 получил 0x80
попробую написать..
попробую написать..
- Реклама
так?
Код: Выделить всё
#include <avr/io.h>
#include "util/delay.h"
unsigned char _FF_spi(unsigned char mydata);
unsigned char _FF_spi(unsigned char mydata)
{
unsigned char temp;
USIDR = mydata;
mydata = 0x11;
temp = 0x13;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
return (USIDR);
}
void port_init(void)
{ DDRB |= _BV(PB3); // as output (CS)
DDRB |= _BV(PB1); // as output (DO)
DDRB |= _BV(PB2); // as output (USISCK)
DDRB &= ~_BV(PB0); // as input (DI)
PORTB |= _BV(PB0); // pullup on (DI)
PORTB |= _BV(PB3); // CS HI
}
int main(void)
{unsigned char resive_byte;
port_init();
while(1){
_delay_ms(100);
PORTB &= 0xFF- _BV(PB3);
resive_byte = _FF_spi(0x5);
PORTB |= _BV(PB3);
}
return 0;
}
Работает? Я все таки не пойму, где вторая пачка клоков генерируется, для чтения ответа...
из регистра USIDR выдвигается и записывается в регистр USIDR бит, один по фронту другой по спаду..
Чтение одного байта с адресом 0, в переменную resive_byte
Код: Выделить всё
#include <avr/io.h>
#include "util/delay.h"
unsigned char _FF_spi(unsigned char mydata);
unsigned char _FF_spi(unsigned char mydata)
{
unsigned char temp;
USIDR = mydata;
mydata = 0x11;
temp = 0x13;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
return (USIDR);
}
void port_init(void)
{ DDRB |= _BV(PB3); // as output (CS)
DDRB |= _BV(PB1); // as output (DO)
DDRB |= _BV(PB2); // as output (USISCK)
DDRB &= ~_BV(PB0); // as input (DI)
PORTB |= _BV(PB0); // pullup on (DI)
PORTB |= _BV(PB3); // CS HI
}
int main(void)
{unsigned char resive_byte;
port_init();
while(1){
_delay_ms(100);
PORTB &= 0xFF- _BV(PB3);
_FF_spi(0x3);
_FF_spi(0x0);
_FF_spi(0x0);
_FF_spi(0x0);
resive_byte = _FF_spi(0xFF);
PORTB |= _BV(PB3);
}
return 0;
}
- Сообщения: 108
- Зарегистрирован: Ср янв 18, 2012 16:33:58
Да, но почему мне в протеусе говорят что Unrecognized command code [FF]???
и вообще как сделать этот binary image file из которого читать данные???
и вообще как сделать этот binary image file из которого читать данные???
Код: Выделить всё
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;- Сообщения: 108
- Зарегистрирован: Ср янв 18, 2012 16:33:58
я вписываю в еепром данные но в протеусе МК его не читает...

Я удаляю епромку создаю новую подключаю новый файл к епромке тогда начинает работать. Вот пример чтения 128 байт attiny85+eeprom.rar
Из даташитаhybroid писал(а): USICR = mydata;
USICR = temp;
[...]
USICR = mydata;
USICR = temp;[/code]
Это чего за удав такой длинный?
Надо просто в меню debug выбрать пункт reset persistent model data.phanis писал(а):Я удаляю епромку создаю новую подключаю новый файл к епромке тогда начинает работать.
Потому что память не понимает код операции FF, вы что-то не то выводите или не в том порядке.Dimon49773 писал(а):Да, но почему мне в протеусе говорят что Unrecognized command code [FF]???
Из wav? Тупо переименовать в .bin (можно еще заголовок удалить, если нужны только звуковые данные).Dimon49773 писал(а):и вообще как сделать этот binary image file из которого читать данные???
Воо меняет. Спасибо.Engineer_Keen писал(а):hybroid писал(а): Надо просто в меню debug выбрать пункт reset persistent model data.
На русском Отладка - Сброс постоянных данных модели.
2 TS.
О-о! А я на элктрониксе Вам уже ссылку дал
О-о! А я на элктрониксе Вам уже ссылку дал
- Сообщения: 108
- Зарегистрирован: Ср янв 18, 2012 16:33:58
Добрый всем день...
вроде с спи разобрался, за что огромно благодарен... а вот с воспроизведением то звука как быть???вроде бы делаю пвм а не поёт....
может посмотрите и направите на правильный путь???
вроде с спи разобрался, за что огромно благодарен... а вот с воспроизведением то звука как быть???вроде бы делаю пвм а не поёт....
может посмотрите и направите на правильный путь???
Код: Выделить всё
#include <avr/io.h>
#include "util/delay.h"
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
unsigned int MODE = 0;
unsigned char _FF_spi(unsigned char mydata);
unsigned char _FF_spi(unsigned char mydata)
{
unsigned char temp;
USIDR = mydata;
mydata = 0x11;
temp = 0x13;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
return (USIDR);
}
void port_init(void)
{ DDRB |= _BV(PB3); // as output (CS)
DDRB |= _BV(PB1); // as output (DO)
DDRB |= _BV(PB2); // as output (USISCK)
DDRB &= ~_BV(PB0); // as input (DI)
PORTB |= _BV(PB0); // pullup on (DI)
PORTB |= _BV(PB3); // CS HI
MCUSR = 0;
WDTCR = _BV(WDE) | 0b110;
}
void timer_init(void)
{
PLLCSR = 0b00000110; /* Select PLL clock for TC1.ck */
GTCCR = 0b01100000; /* Enable TC1.OCB as PWM out (L-ch) */
TCCR1 = MODE ? 0b01100001 : 0b00000001; /* Start TC1 with TC1.OCA is enabled as PWM out (R-ch) */
TCCR0A = 0b00000010; /* Enable TC0.ck = 2MHz as interval timer */
TCCR0B = 0b00000010;
TIMSK = _BV(OCIE0A);
}
int main(void)
{unsigned char resive_byte,count;
port_init();
while(1){
count=128;
_delay_ms(1);
PORTB &= 0xFF- _BV(PB3);
_FF_spi(0x3);
_FF_spi(0x0);
_FF_spi(0x0);
_FF_spi(0x0);
while(count--) OCR1B = _FF_spi(0xFF);
PORTB |= _BV(PB3);
}
return 0;
}
- Вложения
-
- attiny85+eeprom=wav.rar
- (63.39 КБ) 150 скачиваний
Я че-то не фтыкаю этот алгоритм...
1) ждем 1мс
2) читаем 128 байт, начиная с нулевого адреса? и сразу присваиваем их регистру сравнения?
3) переходим к пункту 1
Так что ли?
1) ждем 1мс
2) читаем 128 байт, начиная с нулевого адреса? и сразу присваиваем их регистру сравнения?
3) переходим к пункту 1
Так что ли?
- Сообщения: 108
- Зарегистрирован: Ср янв 18, 2012 16:33:58
суть алгоритма в том что он читает один байт с епрома и втыкает его в пвм...который и воспроизводит звук...Engineer_Keen писал(а):Я че-то не фтыкаю этот алгоритм...
1) ждем 1мс
2) читаем 128 байт, начиная с нулевого адреса? и сразу присваиваем их регистру сравнения?
3) переходим к пункту 1
Так что ли?
ну да, в принципе логика такая...


