Привожу код программы. Контроллер намертво отказывается воспринемать кнопку на C0. На С0 - резистор 300 идет на +5в. Кнопка - на "землю". Опрос клавиши ведется в "KEYBOARD:"
.def Temp=R16
.def Temp1=R17;инфа на вывод
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def DDisp=R21
.dseg
Digit: .byte 10
.cseg
.org 0
rcall PORT_CONF
PORT_CONF:
ldi Temp, 0xff ;PB как выход
out DDRB,Temp
ldi Temp, 0xff ;PB как выход
out DDRD,Temp
ldi Temp, 0b0000000 ;PB как вход
out DDRC,Temp
ldi Temp, 0xff ;вкл подт. резисторы
out PORTC,Temp
////////////////////////////
ldi DDisp,125
////////////////////////////
START:
rcall KEYBOARD
rcall DISPLAY
rcall START
//******************************************************************************
KEYBOARD:
IN TEMP, PINC
nop
nop
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
//cpi Temp,0b1111110
breq N0
RET
N125:
ldi DDisp,125
RET
N0:
ldi DDisp,0
RET
/*
IN TEMP, PINC
SBRS TEMP,0
;sbrs TEMP,pc0 ;проп есл бит опущен
breq N0
N0:
ldi DDisp,0
RET
*/
RET
//*****************************************************************************
DISPLAY:
cpi DDisp,125 ;сравнение
breq T125 ;перейти, если =
cpi DDisp,0 ;сравнение
breq T0 ;перейти, если =
T0:
ldi Temp,0b00001000 ;вкл только 3 сегмента
out PortD,Temp
ldi Temp,0
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000 ;потушить все
out PortD,Temp
ret
T125:
ldi Temp,0b00001000 ;вкл 3 сегмента
out PortD,Temp
ldi Temp,5
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000100
out PortD,Temp
ldi Temp,2
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000010
out PortD,Temp
ldi Temp,1
rcall Decoder
out PortB,Temp
rcall Delay
ldi Temp,0b00000000
out PortD,Temp
ret
;rcall Decoder
;out PortB,Temp ;вывод на индикацию
;rcall Delay
ret
//******************************************************************************
Decoder:
cpi Temp,0
breq NUM0
cpi Temp,1
breq NUM1
cpi Temp,2
breq NUM2
cpi Temp,3
breq NUM3
cpi Temp,4
breq NUM4
cpi Temp,5
breq NUM5
cpi Temp,6
breq NUM6
cpi Temp,7
breq NUM7
cpi Temp,8
breq NUM8
cpi Temp,9
breq NUM9
NUM0:
ldi Temp,0b11000000 ;0
ret
NUM1:
ldi Temp,0b11111001 ;1
ret
NUM2:
ldi Temp,0b10100100 ;2
ret
NUM3:
ldi Temp,0b10110000 ;3
ret
NUM4:
ldi Temp,0b10011001 ;4
ret
NUM5:
ldi Temp,0b10010010 ;5
ret
NUM6:
ldi Temp,0b10100000 ;6
ret
NUM7:
ldi Temp,0b11111000 ;7
ret
NUM8:
ldi Temp,0b10000000 ;8
ret
NUM9:
ldi Temp,0b10010000 ;9
ret
ret
//********************************************************************************
Delay:
;цикл задержки
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret
Помогите разобраться. ATMEGA8A + AVRstudio.
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Помогите разобраться. ATMEGA8A + AVRstudio.
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
$16 - это PINB? наверное SBIS PINC,0
Re: Помогите разобраться. ATMEGA8A + AVRstudio.
$16 - это PINB? наверное SBIS PINC,0
.def Temp=R16
,,,,,
IN TEMP, PINC
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
Это TEMP=PORTC. Опробовано SBIS PINC,0. не помогло. Мистика.....
И самое иноересное - в SBIS на 2-й цикл заходит без какого-то либо вмешательства из вне, и уходит в ступор.
.def Temp=R16
,,,,,
IN TEMP, PINC
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен
Это TEMP=PORTC. Опробовано SBIS PINC,0. не помогло. Мистика.....
И самое иноересное - в SBIS на 2-й цикл заходит без какого-то либо вмешательства из вне, и уходит в ступор.
Re: Помогите разобраться. ATMEGA8A + AVRstudio.
Смысл регистры разглядывать когда в начале программы:
и далее по тексту:
А СТЕК кто инициализировать будет?
Код: Выделить всё
.cseg
.org 0
rcall PORT_CONFи далее по тексту:
Код: Выделить всё
START:
rcall KEYBOARD
rcall DISPLAY
rcall STARTА СТЕК кто инициализировать будет?
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: Помогите разобраться. ATMEGA8A + AVRstudio.
Все заработало, после:
Благодарю за пинок в нужную сторону!!!
.def Temp=R16
.def Temp1=R17;инфа на вывод
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.def DDisp=R21
.dseg
Digit: .byte 10
.cseg
//.org 0
LDI R16,Low(RAMEND) ; Инициализация стека
OUT SPL,R16 ; Обязательно!!!
LDI R16,High(RAMEND)
OUT SPH,R16
rcall PORT_CONF
PORT_CONF:
KEYBOARD:
IN TEMP, PORTC
nop
nop
SBIS PINC,0
Благодарю за пинок в нужную сторону!!!
- Реклама

