Nezlomné Interrupty 2052
David Rudol
rudol@post.cz
Sobota Prosinec 2 15:31:40 CET 2006
Dobrý den všem,
vzhledem k tomu, že MCU přestalo fungovat, tak nevím, kam se mám obrátit a proto píši zde. Před cca 2 měsíci jsem chtěl radu ohledně stopek na tisíciny na MCU , od té doby jsem pokročil - od PIC jsem přešel na 2052 - krásný a jednoduchý (obrazně) čip, ale mám problém s interrupty - po úvodním nastaveni očekávám, že se mi první pětice zobrazovačů s registry nastaví do "0" a na ostatních 2 pěticích budou svítit jen tečky (15 zobrazovačů v serii s 4094), děje se mi však podivnost - svítí jen tečky tam, kde mají a svítí mi jen osmička na prvním místě poslední pětice - nevím, kde mám chybu, po spuštění stopek mi jedou první 2 pětice - očekával jsem jen první a nevím, kde se mi registry plní.
Další problém mám s ovládáním interruptů INT0 a INT1 - měly by přesouvat data z časovače a posléze pomocí NANDU zastavit čítání - nemám páru jak toho dosáhnout - jsem začátečník - prosím nekamenovat.
Prosím o pomoc.
Porki
Listing programu:
;;;;;;;;;;;;;;;;;;;; program casomira ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;; urceno pro procesory AT89C2052, AT89C4052 ;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;; pripojeni displaye pomoci 4094 shift registru ;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;Krystal na 16 MHz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;; David Rudol 2006 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;deklaracni cast ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$INCLUDE(LP2052.INC)
; Definice bitu
DIN equ P1.0 ;data input
STB equ P1.2 ;strobe
CLK equ P1.3 ;clock
disp equ P1.4 ;zapinani displeju - OE
TLST equ P3.0 ;tlacitko start
Tl_stopL equ P3.2 ;tlacitko stop levy terc - INT0
Tl_stopP equ P3.3 ; tlacitko stop pravy terc - INT1
int0 equ ie.0
int1 equ ie.2
; Definice promennych
LTis equ 30H ; Leve tisiciny
LDes equ 31H ; Leve setiny
LSet equ 32H ; Leve desetiny
LSec equ 33H ; Leve sekundy
LDesSec equ 34H ; Leve desitkz sekund
PTis equ 35H ; Prave tisiciny
PDes equ 36H ; Prave setiny
PSet equ 37H ; Prave desetiny
PSec equ 38H ; Prave sekundy
PDesSec equ 39H ; Prave desitkz sekund
Tis equ 35H ; Tisiciny
Seti equ 36H ; Setiny
Des equ 37H ; Desetiny
Sec equ 38H ; Sekundy
DesSec equ 39H ; Desitky sekund
ORG 0
jmp zacni ; preskoceni preruseni
org 03H
jmp stopl ; obsluha preruseni - levy terc - INT0
org 0BH
jmp timeup ; obsluha preruseni casovac 0 - nejvyssi
org 13H
jmp stopp ; obsluha preruseni - pravy terc - INT1
zacni: mov IE,#00000000B ; zakaze vsechna preruseni
mov RH0,#0c1H ; nastaveni registru casovace 0
mov RL0,#80H ; pro rezim s HW prednastavenim
mov IPH,#00000010B ; casovac 0 - nejvyssi preruseni
mov TMOD,#00000001B ; nastavi casovac hardwareovy reload
mov r2,#00D ; tisiciny
mov r3,#00D ; setiny
mov r4,#00D ; desetiny
mov r5,#00D ; sekundy
mov r6,#00D ; desitky sekund
mov Tis,#00D
mov Seti,#00D
mov Des,#00D
mov Sec,#00D
mov DesSec,#00D
mov LTis,#16D
mov LSet,#16D
mov LDes,#16D
mov LSec,#16D
mov LDesSec,#16D
mov PTis,#16D
mov PSet,#16D
mov PDes,#16D
mov PSec,#16D
mov PDesSec,#16D setb f0
MOV P1M0,#00000000B ;P1.0 až P1.6 vystupy
MOV P1M1,#11111111B ;P1.0 až P1.6 vystupy
MOV P3M0,#11110010B ;P3.0 až P3.7 vstupy
MOV P3M1,#00000000B ;P3.0 až P3.7 vstupy
;zakladni poslani na displaye - 0 na 1. petici, na ostatni nic;;;;;;;;;;;;;;;;; clr disp
call Levy
call Pravy
call Horni
setb disp
;;;;;;;;;; Cekeni na stisk tlacitka start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
zacatek: jb TLST,zacatek ; skace dokola, dokud neni stisknute
;;;;;;;;;; Spusti pocitani ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov IE,#10000111B ; nastavi preruseni
mov TCON,#00010000B ; spusti casovac
;;;;;;;;;; Odtud jen zobrazuje ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; zobraz: clr disp
call Levy
call Pravy
call Horni
setb disp
mov r0,#255D
cyk: djnz r0,cyk
jmp zobraz ; zpozdeni a jiz pouhe zobrazovani
;;;;;;;;;;;; funkce upravujici cas preruseni ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timeup:
push acc
push b
push psw
inc R2 ; inkrementace tisícin
cjne R2,#10D,goout ; jsou-li tisíciny mensi nez 10 , pak nedela nic a vyskoci
mov R2,#00D ; jsou-li rovny 10, pak pokracuje
inc R3 ; inkrementace desitek setin
cjne R3,#10D,goout ; jsou-li desitky setin mensi nez 10 , pak nedela nic a vyskoci
mov R3,#00D ; jsou-li rovny 10, pak pokracuje
inc R4 ; inkrementace setin
cjne R4,#10D,goout ; jsou-li setiny mensi nez 10, nedela nic a vyskoci
mov R4,#00D ; jdou-li rovny 10, pak pokracuje
inc R5 ; zvysi sekundy o 1
cjne R5,#10D,goout ; jsou-li sekundy mensi nez 10, nedela nic a vyskoci
mov R5,#00D ; jdou-li rovny 10, pak pokracuje
inc R6 ; zvysi desitky sekund o 1
cjne R6,#10D,goout ; jsou-li desitky sekund mensi nez 6, nedela nic a vyskoci
mov R6,#00D ; jdou-li rovny 6, pak pokracuje
goout:
mov a,R2
mov tis,a
mov a,R3
mov seti,a
mov a,R4
mov des,a
mov a,R5
mov sec,a
mov a,R6
mov dessec,a
pop psw
pop b
pop acc reti
;;;;;;;;;;;; stop leveho terce ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
stopp:
mov a,Tis ;prepise aktualni hodnoty do registru "prave" casti
mov PTis,a
mov a,seti
mov PSet,a
mov a,des
mov PDes,a
mov a,sec
mov PSec,a
mov a,dessec
mov PDesSec,a
reti
;;;;;;;;;;;; stop praveho terce ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
stopl:
mov a,Tis ;prepise aktualni hodnoty do registru "leve" casti
mov LTis,a
mov a,seti
mov LSet,a
mov a,des
mov LDes,a
mov a,sec
mov LSec,a
mov a,dessec
mov LDesSec,a
reti
;;;;;;;;;;;; poslani do posuvnych registru ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;; prvni petice;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Horni: mov a,DesSec
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,Sec
movc a,@a+dptr
mov dptr,#tab
xrl a,#10000000b ; Prida desetinou tecku
mov R0,a
call posli
mov a,Des
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,Seti
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,Tis
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
ret
Levy: mov a,LDesSec
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,LSec
movc a,@a+dptr
mov dptr,#tab
xrl a,#10000000b ; Prida desetinou tecku
mov R0,a
call posli
mov a,LDes
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,LSet
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,LTis
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
ret
Pravy: mov a,PDesSec
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,PSec
movc a,@a+dptr
mov dptr,#tab
xrl a,#10000000b ; Prida desetinou tecku
mov R0,a
call posli
mov a,PDes
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,PSet
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
mov a,PTis
movc a,@a+dptr
mov dptr,#tab
mov R0,a
call posli
ret
posli: clr CLK ;dat do 0
clr STB ;dat do 0
call poslia ;skok na poslia
setb STB ;dat do 1
clr STB ;dat do 0
ret
poslia: mov a,r0
mov c,acc.6
call clkpulz
mov c,acc.5
call clkpulz
mov c,acc.0
call clkpulz
mov c,acc.1
call clkpulz
mov c,acc.4
call clkpulz
mov c,acc.3
call clkpulz
mov c,acc.2
call clkpulz
mov c,acc.7
call clkpulz
ret clkpulz:mov DIN,c
setb CLK
clr CLK
ret tab: db 11000000B ;0
db 11111001B ;1
db 10100100B ;2
db 10110000B ;3
db 10011001B ;4
db 10010010B ;5
db 10000010B ;6
db 11111000B ;7
db 10000000B ;8
db 10010000B ;9
db 10001000B ;A
db 10000011B ;b
db 10100111B ;c
db 10100001B ;d
db 10000110B ;E
db 10001110B ;F
db 11111111B ; nic
tabkon:
END
Další informace o konferenci Hw-list