а это как тебе удобно.. посмотрим какая инфа при отладке будет нужна....
p.s. опять у меня проблемы с оплатой здесь.. сейчас оплачу за год вперед наверное чтобы каждый месяц не иметь этот геморрой с баннерами Виталий (аka ВитГо)
offtop: да, я заметил эти надоедливые банеры... можно наверно с рекламой (интернет магазинов например) что нить придумать... сколько хоть стоит годовая оплата твоего ресурса? не успеваю за своими мыслями......
я пока только добавил вывод "0" и "1" на дисплей при приеме "0" и "1" соответственно.... еще немного поправил код основной программы // теперь если мы примем импульс или паузу длиннее чем 7260, то прием данных начнется сначала... ( устанавливается флаг фазы равный первому нарастающему фронту, скидывается счетчик принятых байтов, и запись данных производится с первого адреса "OZU")
почему ты не проинитил дисплей в своей инициализации ? сразу после инита портов, перед инитами таймеров, прерываний и т.д. - нужно проинициализировать дисплей ! причем делается это один раз !! а у тебя получается что будет инититься каждый раз ! - так не правильно
Code
reset: ; включение микроконтроллера
cli ; глобальный запрет на прерывания
ldi Temp,low(RamEnd) ; инициализации стека out SPL,Temp ;
ldi Temp,0b00000001 ; настроили порт "В" (0-ввод, 1-вывод) out DDRB,Temp ; 0000000х - "вывод" на светодиод ; ххххххх0 - "ввод"
ldi Temp,0b00000000 ; настраиваем порт "D" (0-ввод, 1-вывод) out DDRD,Temp ; 00000000 - весь порт настраиваем на ввод
RCALL LCD_INIT ; инициализация дисплея
дальше: переменные прерывания (управление фазой захвата) - нужно инитить до разрешения прерываний! а то может быть прерывание будет после sei но до настройки фазы.. и что получишь тогда ?
почему ты не проинитил дисплей в своей инициализации ? сразу после инита портов, перед инитами таймеров, прерываний и т.д. - нужно проинициализировать дисплей ! причем делается это один раз !! а у тебя получается что будет инититься каждый раз ! - так не правильно
это я сделал для того, что бы каждый раз на дисплей выводилась новая информация вместо старой, внутри прерывания... ну если не правильно , то переделаю....
Quote (ВитГо)
дальше: переменные прерывания (управление фазой захвата) - нужно инитить до разрешения прерываний! а то может быть прерывание будет после sei но до настройки фазы.. и что получишь тогда ?
понял.... исправлю... не успеваю за своими мыслями......
ну вот исправил. Теперь цифры будет выводится друг за другом, каждая новая будет напечатана рядом с текущей... или лучше использовать позиционирование на один и тот же адрес экрана?
ну что, смотрел код? что скажешь? 1) что делать с флагом фазы который мы установили? как его использовать? 2) какой код запихнуть в chtenie_ozu: ? чтение данных и включение/выключение светодиодов ??? 3) что нужно добавить/убрать/ изменить? не успеваю за своими мыслями......
1) Выводить по очереди, на один и тот же адрес экрана ??? ( как тогда организовать способ доставки информации в мой мозг = у меня глаза всего 24 кадра/сек воспринимают... ) или выводить данные друг за другом через пробел?
2) как точно измерять длительность импульса/паузы ? так же как и в коде - x<2970 x=3300 +/- 10% x=3630<x<5940 x=6600+/-10% x>7260 или с точностью до тика ??? не успеваю за своими мыслями......
но затупил в том, что не могу взять число из tcnt1 и вывести на экран.. так как в tcnt1 может оказаться число от 0 до 65535 ( от 0x0000 до 0xFFFF ) то-есть старшая и младшая часть может быть от 0x00 (0) до 0xFF (255) а у меня в драйвере подключения дисплея доступно всего лишь 16 значений от 0x00 (0) до 0x0F (15) ... короче, на прямую записывать значение счетчика в регистр отвечающий за символ - нельзя!
обращаю внимание что значение счетчика читаем с младшего байта !!! поскольку печатаем со старшего, то младший просто сохраняем на стеке до момента когда нужно будет напечатать соответственно печать 16ти битного числа это просто печать двух 8ми битных чисел (этим шестнадцатеричные числа очень удобны)
Code
... ; программа
in r16, tcnt1l push r16 in r16, tcnt1h rcall printhex ; печатаем старший байт pop r16 rcall printhex ; печатаем младший байт
.... ; дальше программа
печать 8ми битного числа фактически это печать двух 4х битных чисел, первыми печатаем старшие 4 бита, вторыми следующие 4 бита. разберись как работает сам (у нас новая команда swap)
Code
; подпрограмма печати байта в hex виде printhex: push r16 swap r16 rcall printhex1 ; печать старшей тетрады pop r16 printhex1: andi r16, 0x0f rcall lcd_char ; печатаем число ret