-         

Ergebnis 1 bis 2 von 2

Thema: AT98S8252 Interrupt 0 und Serielle Schnittstelle

  1. #1
    chris1122
    Gast

    AT98S8252 Interrupt 0 und Serielle Schnittstelle

    Anzeige

    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

  2. #2

    Frage?

    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...

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •