Страница 1 из 1

Помогите разобраться. ATMEGA8A + AVRstudio.

Добавлено: Сб ноя 05, 2011 17:36:15
ThE_BuZz
Привожу код программы. Контроллер намертво отказывается воспринемать кнопку на 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

Re: Помогите разобраться. ATMEGA8A + AVRstudio.

Добавлено: Сб ноя 05, 2011 18:56:19
oleg110592

SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен

$16 - это PINB? наверное SBIS PINC,0

Re: Помогите разобраться. ATMEGA8A + AVRstudio.

Добавлено: Сб ноя 05, 2011 22:32:04
ThE_BuZz
$16 - это PINB? наверное SBIS PINC,0

.def Temp=R16
,,,,,
IN TEMP, PINC
SBIS $16,0//SBIS - пропустить если бит в регистре I/O установлен

Это TEMP=PORTC. Опробовано SBIS PINC,0. не помогло. Мистика.....
И самое иноересное - в SBIS на 2-й цикл заходит без какого-то либо вмешательства из вне, и уходит в ступор.

Re: Помогите разобраться. ATMEGA8A + AVRstudio.

Добавлено: Вс ноя 06, 2011 11:10:29
md5sum
Смысл регистры разглядывать когда в начале программы:

Код: Выделить всё

.cseg
.org 0
rcall PORT_CONF

и далее по тексту:

Код: Выделить всё

START:
 rcall KEYBOARD
 rcall DISPLAY
rcall START

А СТЕК кто инициализировать будет?

Re: Помогите разобраться. ATMEGA8A + AVRstudio.

Добавлено: Вс ноя 06, 2011 12:32:58
ThE_BuZz
Все заработало, после:
.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


Благодарю за пинок в нужную сторону!!!