Длительности каждого бита 7,8мкс. И таким образом рабочая скорость передачи информации 128кБит/сек, а действительная 64кБит/сек. Т.е. 8кБайт/сек.
Насколько сложно это будет? Передача асинхронная.
62 такта микроконтроллера на бит. много или мало? прерывание каждые 62 такта не очень то и хорошо.просто КОТ писал(а):125мкс какие-то 16 бит ... при тактовой 8МГц.
Код: Выделить всё
;адреса переменных
.equ CurBitNum = SRAM_START
.equ PacketL = CurBitNum+1
.equ PacketH = CurBitNum+2
.equ PORT = PORTB
.equ BIT = 0
.def temp = r16
.def mask = r16
.def bitn = r16
.def byte = r17
BitMask:
.db 0b00000001, 0b00000010
.db 0b00000100, 0b00001000
.db 0b00010000, 0b00100000
.db 0b01000000, 0b10000000
isr_routine:
push temp
in temp, SREG
push temp
push byte
lds bitn, CurBitNum ; загружаем номер текущего бита в посылке
sbrs bitn, 4 ; проверяем интервал 0-7 или 8-15 бит
rjmp LowByte
lds byte, PacketH ; загружаем старший байт
rjmp GetMask
LowByte:
lds byte, PacketL ; загружаем младший байт
GetMask:
andi bitn, 0b00000111 ; получаем номер бита в байте
ldi ZL, low(BitMask*2); загружаем адрес массива масок
ldi ZH, high(BitMask*2)
add ZL, bitn ; получаем адрес маски текущего бита
clr bitn
adc ZH, bitn
lpm mask, Z ; загружаем маску
and byte, mask ; проверяем текущий бит
breq Set_0
sbi PORT, BIT
rjmp IncBitNum
Set_0:
cbi PORT, BIT
IncBitNum:
lds bitn, CurBitNum
inc bitn
cpi bitn, 16
brlo BitNumInRange
clr bitn
BitNumInRange:
sts CurBitNum, bitn
pop byte
pop temp
out SREG,temp
pop temp
ret
Код: Выделить всё
IncBitNum:
lds bitn, CurBitNum
inc bitn
andi bitn, 0b00001111
sts CurBitNum, bitnКод: Выделить всё
#define PORT PORTB
#define BIT 0
uint16_t Packet = 0xAAAA;
#pragma vector=TIMER0_COMP_vect
__interrupt void T0_COMP()
{
PORTB |= (1<<5); // for debug
static uint8_t BitNum;
if(Packet & (1<<BitNum))
PORT |= (1<<BIT);
else
PORT &= ~(1<<BIT);
BitNum++;
BitNum &= ~(0xF0);
PORTB &= ~(1<<5); // for debug
} Код: Выделить всё
.ORG $0D ;прерывание по Т0 CTC ATtiny2313
TRANS:
IN R16,PORTB
CBR R16,EXP2(0)
LSL R21
ROL R20
BRCC PC+2
SBR R16,EXP2(0)
OUT PORTB,R16
DEC R22
BRNE TRANS_OUT
SET
TRANS_OUT:
RETIКод: Выделить всё
TEST_16:
CLI
LDI R20,0b11000000 ; для примера START+ID+N
LDI R21,0b11111111 ; DATA
LDI R22,16
LDI R16,62-1
OUT OCR0A,R16 ;режим CTC T0
LDI R16,2
OUT TCCR0A,R16
LDI R16,$20
OUT MCUCR,R16 ; SLEEP_IDLE enable
LDI R16,1
OUT TIMSK,R16
OUT TIFR,R16
OUT TCCR0B,R16 ; старт Т0
SEI
TTT:
SLEEP
BRTC TTT
CBI PORTB,0
CLT
RJMP TEST_16А если так попробовать ?ibiza11 писал(а):если писать на Сях, то у меня вообще получилось время выполнения одного прерывания при частоте 8МГц скачет вплоть до ~ 16мкс
Код: Выделить всё
#define PORT PORTB
#define BIT 0
uint16_t Packet = 0xAAAA;
#pragma vector=TIMER0_COMP_vect
__interrupt void T0_COMP()
{
static uint8_t BitNum=16;
PORTB |= (1<<5); // for debug
if(Packet & 0x01) PORT |= (1<<BIT);
else PORT &= ~(1<<BIT);
Packet >>=1;
if(!--BitNum){
BitNum=16;
Packet=0xAAAA;
}
PORTB &= ~(1<<5); // for debug
}
так 4.56мксАlex писал(а):А если так попробовать ?
if (cnt==19){
cnt=0;
//254 шага увеличения ширины импульса
if (Step !=0xFE ) {
Step++;
OCR0A=Step;
}
kLeR1k писал(а):В симуляции увеличение скважности происходит очень медленно.
Engineer_Keen писал(а):99% что симуляция у вас идет не в реальном времени, о чем протеус вам сообщает в окне сообщений. Так что скорость изменения скважности нужно соотносить с таймером (строчка внизу экрана), а не по реальному времени.
RedBull писал(а):Не могу разобраться с интерфейсом датчика холла.