PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] AT98S8252 Interrupt 0 und Serielle Schnittstelle



chris1122
30.12.2004, 13:45
Hi, hab AT89S8252... mach grad vorarbeit für nen projekt...
hab folgendes programm geschrieben...

es soll die zeit zählen wie lang am port 3.2 eine log. 1 anliegt und dies dann im Hyper-terminal ausgeben.

er giebt nur das erste Zeichen aus -> CR

die rot markierte Zeile geht auf ne LED anzeige und erscheint sofort nach dem programmieren... dürfte ja nicht sein, da er noch gar nicht in der interrupt servic routine war...

bitte helft mir... danke!

;------------------------------------------------------------------------------
?STACK SEGMENT IDATA ; ?STACK im indirekt adressierbaren internen RAM
RSEG ?STACK ; ?STACK-Segment waehlen
DS 10h ; Reserviere z.B. 16 Bytes Stack
;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Reserviere Speicherplatz fuer Variablen im int. direkt adressierbaren RAM
;------------------------------------------------------------------------------
dir_daten SEGMENT DATA ; deklariere Datensegment
RSEG dir_daten ; waehle Datensegment

send_tab: DS 6 ;Tabelle für 6 Zeichen
bit_zaehl: DS 1

;------------------------------------------------------------------------------
;Reserviere Bit
;------------------------------------------------------------------------------
bit_daten SEGMENT BIT
RSEG bit_daten

irr: DBIT 1
;------------------------------------------------------------------------------
; Auf Adresse 0 im Code-Speicher muss ein LJMP zum Programmanfang stehen
;------------------------------------------------------------------------------
CSEG AT 0 ; absolutes Code-Segment bei Adresse 0
LJMP start ; Springe zur Marke start

CSEG AT 0003H ; IR Vektor für Externen Interrupt 0
ljmp isr_ET0

cseg at 0023h
ljmp isr_ser ;IR-Vektor fuer Serielle
;Schnittstelle
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; Hier folgt Programmcode (Code-Beginn ueber Linker festgelegt)
;------------------------------------------------------------------------------
program_code SEGMENT CODE
RSEG program_code ; waehle Code-Segment

USING 0 ; Zeige Benuetzung von Registerbank 0
; fuer den folgenden Programmcode an
start:
MOV SP,#?STACK-1 ; Stack-Definition

mov scon,#50h ;Init Schnittstelle
setb tclk
setb rclk ;Timer 2 erzeugt Baudrate fuer
clr c_t2_ ;die serielle Schnittstelle
mov rcap2l,#0d9h ;Reloadwert 65497 bei 9600 Baud
mov rcap2h,#0ffh
mov tl2,#0d9h
mov th2,#0ffh
setb tr2


setb EAL ;generelle Interruptfreigabe

anl tmod,#11110000b ;Timer 0 initialisiren
orl tmod,#00001001b

setb tr0 ;Timer 0 freigbabe
SETB IT0

; mov IP,#01111111b

;anl IP1,#11101110b

;anl IP0,#11101110b
; orl IP0,#00010000b
clr ti
clr ri

setb irr

mov bit_zaehl,#00h

loop:
jnb irr,send
setb ex0
nop
clr ex0

ljmp loop

send:

setb es

nop
clr es

ljmp loop


isr_ET0:

mov a,tl0
cpl a
mov p0,a

mov b_bcd_l,tl0
mov b_bcd_h,th0
lcall b16_bcd ;BCD Wandlung

mov tl0,#00h
mov th0,#00h

mov r0,#send_tab ; Zeiger auf Tabellenanfang



mov @r0,#13 ;CR an Stelle 0 schreiben
inc r0

mov a,bcd_0
add a,#48 ;BCD in ASCII
mov @r0,a ;Zahl in Tabelle an Stelle 1 schreiben
inc r0 ;Zeiger +1


mov a,bcd_1
add a,#48 ;BCD in ASCII
mov @r0,a ;Zahl in Tabelle an Stelle 2 schreiben
inc r0 ;Zeiger +1


mov a,bcd_2
add a,#48 ; BCD in ASCII
mov @r0,a ; Zahl in Tabelle an Stelle 3 schreiben
inc r0 ;Zeiger +1


mov a,bcd_3
add a,#48 ; BCD in ASCII
mov @r0,a ; Zahl in Tabelle an Stelle 4 schreiben
inc r0 ;Zeiger +1


mov a,bcd_4
add a,#48 ; BCD in ASCII
mov @r0,a ; Zahl in Tabelle an Stelle 0 schreiben

clr irr


mov r0,#send_tab
mov SBUF,@r0

reti

isr_ser:
jb ri,ser_empf
clr ti

inc r0
mov a,bit_zaehl
cjne a,#5,isr_ser_E


setb irr
reti

isr_ser_E:
mov p0,#0F1h
mov SBUF,@r0
inc r0
inc bit_zaehl
reti

ser_empf:
clr ri
reti



$include (bcd_52.inc)
end

dom_lech
28.01.2005, 00:28
Womit hast du deinen AT89s8252 bitte programmiert (Programme & Geräte)?

Habe auch einen und mir ein programmiergerät gebaut das mit Ponyprog über den LPT laufen sollte, aber beim schreiben sagt er immer Device not responding und das find ich ziemlich schlecht.
beim lesen und löschen schreibt er übrigens keine fehler.

bitte hilf mir wenn du kannst...