;ОТПРАВКА БАЙТА ПО SPI
sendSPI:
;PB2 = 0
cbi PORTB, 2
;шлем байт = temp2
out SPDR, temp2
;rcall Delay
;проверка передачи
in temp1, SPSR
sbrs temp1, 7 ; если равен 1 то пропуск след команду
rjmp sendSPI
;PB2 = 1
sbi PORTB, 2
ret
Правильно ли я сделал проверку бита SPIF(7 бит в регистре SPSR)?
если добавляю задержку rcall Delay то все нормально. шлю данные в 595 регистр.
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
in r16, SPSR
sbrs r16, SPIF
rjmp Wait_Transmit
ret
.include "tn13def.inc"
.def temp=r16
.org 0
rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться
.org INT0addr
rjmp RESET
.org PCI0addr
rjmp RESET
.org OVF0addr
rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
.org ERDYaddr
rjmp RESET
.org ACIaddr
rjmp RESET
.org OC0Aaddr
rjmp RESET
.org OC0Baddr
rjmp RESET
.org WDTaddr
rjmp RESET
.org ADCCaddr
rjmp RESET
TIM0_OVF:
;code
reti
RESET:
ldi temp, low(RAMEND)
out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
ldi temp, 0
out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
out TCCR0B, temp
ldi temp, (1<<TOIE0)
out TIMSK, temp ;локальное разрешение прерывания
out TIFR, temp ;сброс флага
sei ;глобальное разрешение прерываний
CYCLE:
rjmp CYCLE
.include "tn13def.inc"
.def temp=r16
.org 0
rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться
;!!!!!!!!!!!!!!!правда, для этого нужно открыть tn13def.inc, выписать символику векторов
.org INT0addr
rjmp RESET
.org PCI0addr
rjmp RESET
.org OVF0addr
; в этом коде лишние команды
; rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
;.org ERDYaddr
; rjmp RESET
;.org ACIaddr
; rjmp RESET
;.org OC0Aaddr
; rjmp RESET
;.org OC0Baddr
; rjmp RESET
;.org WDTaddr
; rjmp RESET
;.org ADCCaddr
; rjmp RESET
TIM0_OVF:
;code
reti
RESET:
;для tiny13 эти команды ненужные ldi temp, low(RAMEND)
; out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
ldi temp, 0
out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
out TCCR0B, temp
ldi temp, (1<<TOIE0)
out TIMSK0, temp ;локальное разрешение прерывания
out TIFR0, temp ;сброс флага
;для tiny13 эти команды неправильные out TIMSK, temp ;локальное разрешение прерывания
; out TIFR, temp ;сброс флага
sei ;глобальное разрешение прерываний
CYCLE:
rjmp CYCLE
.EXIT
В итоге, в этом простом учебном примере половина команд лишние, да ещё и с ошибками."Скромнее надо быть, скромнее..."
Jetetex писал(а): Или в каком порядке описаны прерывания не имеет значения?
Таблица векторов прерываний для каждого камня фиксирована и приведена в DS.
COKPOWEHEU писал(а):Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.
Может и не стоит, но это работает. По крайней мере в протеусе... а в железе никак.
Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
Диод на 3й ноге (подключен "+" к МК) должен погаснуть через 1 мин, а гаснет через 74 сек, Хотя в симуляторе все как в сказке.
COKPOWEHEU, по поводу адресов из файла, которым вы посоветовали пользоваться, я вложил этот файл. Мож просветите, где они там, а то я не нашел?
454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
Режим CTC позволит настроить делитель точнее. А что у вас с тактированием? Не используете ли случайно внутренний RC-генератор, да еще без калибровки?
Напрямую - никак, можно использовать кварцевый генератор, подключенный к CLKI.
В принципе, можно попробовать использовать и внутренний RC-генератор, вроде в даташите говорится о точности 1% при комнатных температурах, если использовать калибровку. Где-то читал, правда, что при стирании кристалла, заводская калибровка стирается и приходится подбирать коэффициент вручную.
Jetetex писал(а):Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
TIMER0_OVF:
IN R15,SREG ;сохранить SREG в неиспользуемый R15
;
OUT SREG,R15
Exit: reti
;
;
Dealay:
mov Temp2,pvm
D: dec Temp2
; cpi Temp2,0
brne D
cbi PortB,3 ;выключаем индикатор работы таймера
ret