Точка опоры (28.08.2014 11:17 - 20:58, просмотров: 958) ответил De_User на Как можно на ATmega88 или ATTINY получить статическое состояние выходов? Типа нажал кнопку "Reset" и состояние выходов изменяется по кольцу (00->01->10->11->00) и после смены МК стаётся в статике, без генерации тактовой частоты?
Недавно делал такое. Если не к спеху - вечером из дома закину код. Upd: /* Такой вот бред - микропотребляющий триггер (многопозиционный) на ATtiny15L.
Всё равно их есть излишек. */
.equ debug = 0
.equ number = 2 // Число состояний (выходов, минимум - 2, максимум - 5)
.equ level = 0 // "0" - переключение по спаду на PB5, "1" - по фронту
.def temp1 = r16
.def temp2 = r17
.def counter = r18 // Состояние
.nolist
.include "tn15def.inc"
.list
.cseg
.org 0x0
rjmp start
rjmp start
reti
nop
nop
nop
nop
nop
nop
start: /* По каждому импульсу на PB5 - очередной вывод порта переключаются в "0" */
ldi temp1,(1<<ACD)
out ACSR,temp1 // Откл. аналоговый компаратор
ldi temp1,~(1<<DDB5)
out DDRB,temp1 // PB5 - счётный вход
ser temp1
out PORTB,temp1 // Порт - выходы в "1"
// Формируется защитный интервал (около 2 мс) даже если если это "холостой" фронт.
clr temp1
out OSCCAL,temp1 // Мин. частота
andi counter,((1<<number)-1)
mov temp2,counter // Состояние счётчика нарушено?
sbrc temp2,0
inc temp1
ror temp2
sbrc temp2,0
inc temp1
ror temp2
sbrc temp2,0
inc temp1
ror temp2
sbrc temp2,0
inc temp1
ror temp2
sbrc temp2,0
inc temp1
ror temp2
cpi temp1,1
breq good_state
ldi counter,2 // Было более 1 единицы или все нули
rjmp no_ovf // Установить начальное состояние
good_state:
clr temp2
debounce_1:
inc temp2
brne debounce_1 // Задержка ~ 1 мс
clr temp1
ldi temp2,1
debounce_2:
.if level==0
sbis PINB,PINB5
.else
sbic PINB,PINB5
.endif
inc temp1
inc temp2
brne debounce_2
// cpi temp1,0x15
cpi temp1,0x55
brlo no_ovf // Наличие требуемого перепада не подтверждено
lsl counter // Счёт
ldi temp2,(1<<number)
and temp2,counter
breq no_ovf
ldi counter,1 // Закольцевать счётчик
no_ovf:
mov temp1,counter
com temp1
out PORTB,temp1 // Переключить порт
wait:
.if debug==0
nop
ldi temp1,(1<<PCIF)
out GIFR,temp1 // Сброс Pin change interrupt
ldi temp1,(1<<PCIE)
out GIMSK,temp1 // Pin change interrupt
ldi temp1,(1<<SE) | (1<< SM1)
out MCUCR,temp1 // Power down
sei
sleep
nop
cli
.endif
rjmp start
.exit // EOF
1. Изо всех сил стараюсь не кормить троллей.
2. Продаю импортные ЭК - https://shop.fulcrum.ru/buy