Не, через почту не сильно быстро и удобно. Так что продолжим тут. Задача в итоге получить связь по такому алгоритму, где N -- бит чётности.
Длительности каждого бита 7,8мкс. И таким образом рабочая скорость передачи информации 128кБит/сек, а действительная 64кБит/сек. Т.е. 8кБайт/сек.
Угу. Типа самодельного канала. и вот хочу такой простенький, но в меру стабильный алгоритм. А с такими характеристиками можно передавать звук в телефонном качестве -- 8бит на 8кГц.
Не выдумывай чепуху. UART-ы в контроллерах могут работать в 9-битном режиме. 9-й бит можно использовать в качестве выбора что именно передается в 8-битах, идентификатор или данные.
Если надо вписаться во временные рамки, то достаточно повысить скорость передачи. Зато получишь аппаратную реализацию, на которую не надо будет тратить ресурсы. Программная реализация вашего протокола потребует очень сложной обработки, и скорей всего потребуется повысить тактовую частоту и "не дышать" чтобы все работало без сбоев.
ИМХО, передать за 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
эта функция при первом проходе выполняется 52 такта, вместе с вызовом.... итого, 52/62 = 84% времени убивается на ваш алгоритм передачи. Кстати, это готовый обработчик прерывания, можете использовать)
.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
Делаю управляемый ШИМ на Attiny13 по этой статье и столкнулся со следующими проблемами:
1. Когда в OCR0A находится 0 , то есть очень короткие импульсы в сигнале, вместо ровного нуля. Если повесить светодиод на ногу с ШИМом, он светится где-то в половину своей яркости. Как этого можно избежать?
2. После того, как протестировал прошивку в протеусе, решил собрать то же самое на железе. Прошивку в МК просто заливал, фьюз биты не трогал. Так вот, получаю вместо плавного загорания светодиода резкое включение, хотя в симуляции с той же самой прошивкой видно плавное увеличение скважности импульсов. Может какие-то фьюз биты всё же нужно установить? С какой частотой происходит прерывание interrupt [TIM0_OVF] void timer0_ovf_isr(void)? Пробовал менять значение константы в статье вместо 19 на 80
if (cnt==19){
cnt=0;
//254 шага увеличения ширины импульса
if (Step !=0xFE ) {
Step++;
OCR0A=Step;
}
В симуляции увеличение скважности происходит очень медленно. Может стоит ещё больше увеличить т.к. процесс увеличения скважности происходит очень быстро в реальности?
Извиняюсь за, возможно, глупые вопросы, но знаний в этой области не так много, а на примере проще понять как это работает... Осциллографа, способного отобразить сигнал ШИМа, нет, к сожалению...
kLeR1k писал(а):В симуляции увеличение скважности происходит очень медленно.
99% что симуляция у вас идет не в реальном времени, о чем протеус вам сообщает в окне сообщений. Так что скорость изменения скважности нужно соотносить с таймером (строчка внизу экрана), а не по реальному времени.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Engineer_Keen писал(а):
99% что симуляция у вас идет не в реальном времени, о чем протеус вам сообщает в окне сообщений. Так что скорость изменения скважности нужно соотносить с таймером (строчка внизу экрана), а не по реальному времени.
Честно говоря знал, что симуляция не в реальном времени идёт, а на что ориентироваться не знал. Спасибо за подсказку! Действительно, увеличение скважности до максимума занимает по счетчику внизу экрана 0,5 секунды. Наверное маловато для того, что бы заметить плавное увеличение яркости свечения светодиода... Update:
Подобрал значение переменной так, что по ориентиру протеуса заполнение скважности занимает 1,5 секунды. В железе - всё как было, так и осталось
Привет всем радиолюбителям может у кого есть прошивка или исходник суточного таймера для avr, или может кто видел где на просторах инета, прошу послать в том направлении ) В общем, нужна прошивка, которая бы включала свет в аквариуме на 8 часов, и раз в сутки влючала на 5 секунд кормушку автоматическую. Кто может чем помочь, прошу откликнутся А может кто согласится написать безвозмездно? )) Прошу не сочесть за наглость
Собираю тест-плату с серцем на микроконтроллере ATmega64A. Пошарил в нете, что его нужно программировать, используя ноги юарта для miso i mosi. Вопрос - почему именно юарт, а не спецеализированные для этих целей ножки miso i mosi? Будут последние работать или нет?
P.S. Я не проверял, как с ножками miso i mosi, но порты юарта работают на ура и микра прошивается полностью за пару секунд не смотря на свои 64к.
P.P.S Эти ноги не могу использовать, ибо нужен юарт.
P.P.P.S Сам проверить не могу сейчас по некоторым причинам.
Зарание спасибо!
Все получится!! Главное не сдаваться, ведь не ошибается тот, кто не ничего не делает!!!