Длительности каждого бита 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;
}
99% что симуляция у вас идет не в реальном времени, о чем протеус вам сообщает в окне сообщений. Так что скорость изменения скважности нужно соотносить с таймером (строчка внизу экрана), а не по реальному времени.kLeR1k писал(а):В симуляции увеличение скважности происходит очень медленно.
Честно говоря знал, что симуляция не в реальном времени идёт, а на что ориентироваться не знал. Спасибо за подсказку! Действительно, увеличение скважности до максимума занимает по счетчику внизу экрана 0,5 секунды. Наверное маловато для того, что бы заметить плавное увеличение яркости свечения светодиода...Engineer_Keen писал(а): 99% что симуляция у вас идет не в реальном времени, о чем протеус вам сообщает в окне сообщений. Так что скорость изменения скважности нужно соотносить с таймером (строчка внизу экрана), а не по реальному времени.
А какой у него интерфейс?RedBull писал(а):Не могу разобраться с интерфейсом датчика холла.