Meteor писал(а):Если не ошибаюсь, то минимум - 4 такта на бит.
Т.о. 8 бит будут переданы за 32 такта.
Можно уложиться в 2 такта на бит
Meteor писал(а):Если не ошибаюсь, то минимум - 4 такта на бит.
Т.о. 8 бит будут переданы за 32 такта.
Можно уложиться в 2 такта на бит
Meteor писал(а):Пропустил слово "программная" и ответил на аппаратный SPI.
Код: Выделить всё
SPI_send_byte:
CLR SPIdataRX
cbi PORTB,MOSI
SBRC SPIdataTX,7
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b10000000
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,6
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b01000000
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,5
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00100000
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,4
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00010000
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,3
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00001000
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,2
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00000100
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,1
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00000010
cbi PORTB,SCK
cbi PORTB,MOSI
SBRC SPIdataTX,0
sbi PORTB,MOSI
sbi PORTB,SCK
SBIC PINB,MISO
ori SPIdataRX,0b00000001
cbi PORTB,SCK
retAI_Disable писал(а):Короче, получилось 84 такта (считая инструкцию вызова).
Gudd-Head писал(а):Насколько критично, чтобы остальные порты в это время работали нормально?
AI_Disable писал(а):Точно! Спасибо, этим способом сэкономится ещё 32 такта, что меня уже устраивает.
Код: Выделить всё
.db 0b00011110,0b00111111,0b00011111,0b00111111
.db 0b00100001,0b00100001,0b00100001,0b00100001
.db 0b00100001,0b00000001,0b00100001,0b00000001
.db 0b00100001,0b00011111,0b00011111,0b00000001
.db 0b00111111,0b00100001,0b00100001,0b00000001
.db 0b00100001,0b00100001,0b00100001,0b00000001
.db 0b00100001,0b00011111,0b00011111,0b00000001
.db 0b00000000,0b00000000,0b00000000,0b00000000
DR_MORRO писал(а):Господа знающие, как можно общаться с вот такого рода массивом?
Не обязательно. Главное, чтобы во время работы программного SPI из прерываний состояние этих портов не менялось.Gudd-Head писал(а):Установить все порты, кроме одного на вход.
Когда речь идёт о максимальной скорости, сдвигать невыгодно. Цикл всё равно развёрнут и в каждом месте выгоднее по скорости применить нужную маску, чем всё время одну и ту же маску и сдвиг. Кроме того, полезно вспомнить о BLD/BSTGudd-Head писал(а):После каждого переданного бита его содержимое сдвигать влево (вправо), возможно через перенос. Так же сдвигать регистр с принятой информацией.
Код: Выделить всё
.nolist
#define __SFR_OFFSET 0
#include <avr/io.h>
.list
.text
.global spi_io
#define txbuf r16
#define rxbuf r17
#define temp r18
#define SCK 0
#define MOSI 1
#define MISO 2
spi_io:
clr rxbuf
in temp, PORTB
.set i, 7
.rept 8
ori temp, (1 << SCK)
bst txbuf, i
bld temp, MOSI
out PORTB, temp
andi temp, ~(1 << SCK)
out PORTB, temp
sbic PINB, MISO
ori rxbuf, (1 << i)
.set i, i-1
.endr
ret
.endКод: Выделить всё
in temp, PORTBavreal писал(а):Что значит "заняты" ?
Код: Выделить всё
; настройка таймеров
; T0
clr tmp
out TCCR0A,tmp
ldi tmp,2 ; Fo/8
out TCCR0B,tmp
ldi tmp,1<<TOIE0
out TIMSK0,tmp
; T1
clr tmp
out TCCR1A,tmp
out TCCR1C,tmp
ldi tmp,1
out TCCR1B,tmp
ldi tmp,1<<TOIE1
out TIMSK1,tmp
