Цитата
И что это за Push SREG? SREG в AVR находится в I/O space.
push/pop работает только с регистрами R0..R31.
Да "погорячился" конечно
in и
out Попробывал в код приведённый ниже ,вставить код
V_G дабы избавиться от
Код
ldi temp,1<<RXCIE1|0<<UDRIE1|1<<RXEN1|1<<TXEN1
sts UCSR1B,temp
И соответсвенно разрешил вложенное прерывание в данном случае , это стал приёмник.
Т.е , так как первый байт передачи пролетает мимо буфера передатчика сразу в сдвиговый регистр т.е передача начинается "мгновенно" и только 2- ой "застревает" в буфере , то по идее разрешив прерывание приёмника мы должны при передаче 2 байта уйти на обработку приемника , где прервыания запрещены флаг (I)=0 и затем вернутся в передатчик - не проконало .
CODE
;**************************************************
;* ;;/Передача битов команд;;* *
;**************************************************
USART1_UDRE:
push temp ; Заталкиваем в стек temp
in SaveSREG,SREG ; SREG
push count ; счётчик
push rab ; rab
;+ Запрещаем прерывание UDRE, что бы избавиться от двойной буферизации
ldi temp,1<<RXCIE1|0<<UDRIE1|1<<RXEN1|1<<TXEN1
sts UCSR1B,temp
;+ передатчика , иначе возникает ошибка при приёме данных.
ld temp,Y ;/ Получаем байт для отсылки
sbrc Flags,fl_ByteEND;- Проверяем, был отослан весь байт?
rjmp MoveTX ;/ Нет - продолжаем пересылку бит
cpi temp,ResetDS18 ;| Сравниваем - полученный новый байт c SF0
breq SendReset ;| Равно - на формирование RESET
MoveTX:
lsr temp ;| Сдвигаем temp
st Y,temp ;/ Возвращаем байт
brcc Resetrab ;| Проверяем флаг С
ldi rab,Full ;+ Установлен - выводим (1)
rjmp SendToDS
Resetrab:
mov rab,zero ;+ Сброшен - выводим (0)
SendToDS:
sts UDR1,rab ;| Загружаем данные
EndTX:
sbr Flags,fl_ByteEND
pop rab ; Выталкиваем из стека rab
pop count ; счётчик
out SREG,SaveSREG ; SREG
pop temp ; temp
reti
;**************************************************
;* ;;/Приём битов команд;;* *
;**************************************************
USART1_RXC:
push temp ; Заталкиваем в стек temp
in SaveSREG,SREG ; SREG
push count ; счётчик
push rab ; rab
;+ Разрешаем прерывание UDRE
ldi temp,1<<RXCIE1|1<<UDRIE1|1<<RXEN1|1<<TXEN1
sts UCSR1B,temp
ld rab,Y
lds temp,UDR1 ;+ Считываем данные
cpi temp,Full ;| Получена единица
breq WriteOneRX ;| Переходим на запись (1) в старш. бит
rjmp SaveDataDS16 ;| Нет - запись (0)
WriteOneRx:
sbr rab,1<<MsbOne ;-Устанавливаем (1) в старшем бите
SaveDataDS16:
st Y,rab ;+Записываем значение
mov count,SaveBitcount;/Загружаем количество бит
inc count ;| Прибавляем счётчик
cpi count,0x08 ;- Восемь бит обработано
breq CheckBufDS18 ;| Да - переходим на проверку счётчика байт
mov SaveBitcount,count;| Нет - сохраняем счётчик бит
rjmp EndRX ;+ И выходим из прерывания
CheckBufDS18:
cpi rab,ToConvTermo ;| Ищем команду ToConvTermo
brne ForwardCheck ;| Не она идём дальше
CheckPinRX: ;/ По идее конверт. должна закончиться до этой проверки,
sbis PIND,PIND2 ;/ но если на входе (0) конвертация не закончена
rjmp CheckPinRX ;/ Тогда - ждём
ForwardCheck:
cbr Flags,1<<fl_ByteEND;
clr SaveBitcount ;/ Очищаем счётчик бит
adiw Y,0x01 ;/ Добавляем адрес буфера
inc SaveBufCount ;/ Добавляем счётчик буффера
mov count,SaveBufCount;| Загружаем счётчик буфера
cpi count,Full ;| Сравниваем - это последний принимаемый байт
brne EndRX ;+ Нет - выходим из прерывания
clr SaveBufcount ;- Очищаем счётчик бит
ldi temp,0<<RXCIE1|0<<UDRIE1|0<<RXEN1|0<<TXEN1
sts UCSR1B,temp ;/ Запрещаем работу USART1
ldwi Y,DATADS18 ;+ загрузка в YH:YL адреса буфера DS18B20
sbr Flags,1<<fl_ReadyDS18 ;+ Устанавливаем флаг Данные готовы
EndRX:
pop rab ; Выталкиваем из стека rab
pop count ; счётчик
out SREG,SaveSREG ; SREG
pop temp ; temp
reti