messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)

Projekt 2006
Verfügbare Informationen zu "messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Christoph
  • Forum: Projekt 2006
  • Forenbeschreibung: Beschreibung Ihres Forums
  • aus dem Unterforum: RST
  • Antworten: 1
  • Forum gestartet am: Donnerstag 04.05.2006
  • Sprache: deutsch
  • Link zum Originaltopic: messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)
  • Letzte Antwort: vor 17 Jahren, 11 Monaten, 18 Tagen, 4 Stunden, 49 Minuten
  • Alle Beiträge und Antworten zu "messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)"

    Re: messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)

    Christoph - 11.05.2006, 11:53

    messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)
    Display an Port 0; Poti an Port 1; Serielle Schnittstelle 3

    Code:

    ;===============================================================================
    ; get_max187-12bit 
    ;   Version für Macroassembler ASEM-51
    ;   Portbelegung:  Bit 0: Dout (Serielle Daten vom Wandler)
    ;                  Bit 1: not CS (Chip-Select zum Wandler)
    ;                  Bit 2: SCLK (Takt zum Wandler)
    ;                  BIT 3: LED grün
    ;                  BIT 4: LED gelb
    ;                  BIT 5: LED rot
    ;                  BIT 6: Jumper 1
    ;                  BIT 7: Jumper 2
    ;   Rückgabe:
    ;    12-Bit: Rückgabe der obersten 8 Bits im Accu, das untere Nibble in r7
    ;   Version 1.0  2005   (C) Uwe Wittenfeld
    ;===============================================================================
    m187_DOUT       equ     P1.0                    ;Dataout
    m187_notCS      equ     P1.1                    ;not Chip Select
    m187_SCLK       equ     P1.2                    ;Seriell Clock
    LatchBit        equ     P0.7                    ;Bit 7 für Lamptest/Aus
    DisplayPort     equ     P0                      ;Display an Port 0
    IRQ_COUNT    equ  010       ;Gibt an, wieviele Interrupts in einem Zyklus liegen
    TIMER_LOW    equ  0          ;Low-Wert des Zählers 
    TIMER_High   equ  0D0h       ;Low-Wert des Zählers 

    ; -------  Definition der Interruptadressen/Interrupteinsprünge
                 org 0h          ; 00h: Reseteinsprung
                 ljmp main       ; Sprung zum Hauptprogramm

                 ljmp IRQ_EXT0   ; 03h: Externer Interrupt 0

                 org 0Bh         ; 0BH: Timer0
                 ljmp IRQ_TIMER0

                 org 13h         ; 13H: Externer Interrupt 1
                 ljmp IRQ_EXT1   
                 
                 ORG 1Bh         ; 1Bh: Timer1
                 ljmp IRQ_TIMER1

                 org 23h         ; 23h: Serielle Schnittstelle
                 ljmp IRQ_V24   
    ;*******************************************************************************
    ; BIN_to_4_digit_BCD
    ; Umwandlung einer Binärzahl in eine 4-stellige BCD-Zahl (0..9999)
    ; Version 0.9 für ASEM-51
    ; (C) Uwe Wittenfeld 2006-05-10 
    ;*******************************************************************************

                    DSEG at 30h            ;Datensegment
                   
    ;<Variablen für Umwandlung>               
    BIN_LOW:        ds      1              ;Binärzahl, High-Byte
    BIN_HIGH:       ds      1              ;Binärzahl, Low-Byte

    MINU_LOW:       ds      1              ;Minuent für 16-Bit-Subtraktion
    MINU_HIGH:      ds      1

    BCD_LOW:        ds      1             ;Zehner und Einer
    BCD_HIGH:       ds      1             ;Tausender und Hunderter

    DIFF_LOW:       ds      1
    DIFF_HIGH:      ds      1              ;Differenz bei 16-Bit-Subtraktion

    count:          ds      1             ; Zähler
    ;</Variablen für Umwandlung>               


                    CSEG                   ;Programmspeicher
                   
                   
    HelloWorld:   db   'Projekt 2006 ',0             ;Begruessungsstring
    Semikolon:   db   ';',0
                   
                   
                    ljmp    main




    ;-------------------------------------------------------------------------------
    ; Display_Digit  (wird von PUT_HEX_TO_DISPLAY benutzt)
    ; Das im unteren Nibble von R0 übergebene BCD-Digit wird an der durch den Accu
    ; indizierten Stelle im Display angezeigt. Der Accu wird zerstört
    ;-------------------------------------------------------------------------------
    display_digit:  push    0                   ;Register 0 sichern
                    swap    a
                    anl    a,#070h              ;Nur Stellendigits!

                    push    ACC                 ;Accu Sichern
                    mov     a, #0Fh
                    anl     a, R0
                    mov     R0,a                ;Unterstes Nibble von R0 ausmaskieren       
                    pop     ACC                 ;Accu zurück

                    orl     a, R0               ;Jetzt kompletter Wert im Accu
                    mov     DisplayPort,A        ;An Port ausgeben
                    nop
                    nop
                    nop
                    setb   LatchBit           ;Latch-Signal an
                    nop
                    nop
                    nop
                    nop
                    clr   LatchBit           ;Latch-Signal wieder aus
                    nop
                    pop     0 
                    ret         

    put_hex_to_display:
                    push    0                   ;R0 auf Stack sichern
                    mov     a,BCD_HIGH
                    anl     a,#0F0h             ;Tausender ausmaskieren
                    swap    a                   ;Nibbles tauschen
                    mov     R0,a                ;Übergabe Wert
                    mov     a,#3                ;Stelle für Tausender
                    acall   display_digit       ;Tausender anzeigen
                   
                    mov     a,BCD_HIGH       
                    anl     a,#0Fh              ;Hunderter ausmaskieren
                    mov     r0,a                ;Übergabe Hunderter
                    mov     a,#2                ;Stelle für Hunderter
                    acall   display_digit       ;Hunderter anzeigen
                   
                    mov     a,BCD_LOW
                    anl     a,#0F0h             ;Zehner ausmaskieren
                    swap    a                   ;Nibbles tauschen
                    mov     R0,a                ;Übergabe Wert
                    mov     a,#1                ;Stelle für Zehner
                    acall   display_digit       ;Zehner anzeigen
                   
                    mov     a,BCD_LOW       
                    anl     a,#0Fh              ;Einer ausmaskieren
                    mov     r0,a                ;Übergabe Einer
                    mov     a,#0                 ;Stelle für Einer
                    acall   display_digit       ;Hunderter anzeigen

                    pop     0                   ;R0 von Stack zurück
                    ret               
    ;*******************************************************************************
    ; 16-Bit-Subtraktion  (Wird von BIN_to_4_digit_BCD benutzt) 
    ; DIFF := BIN - DIFF
    ; benutzte Register: A
    ; C gibt an, ob Ergebnis negativ
    ;*******************************************************************************
    sub16:          clr     C
                    mov     A,BIN_LOW             
                    subb    A,MINU_LOW
                    mov     DIFF_LOW,A
                    mov     A,BIN_HIGH
                    subb    A,MINU_HIGH
                    mov     DIFF_HIGH,A
                    ret

    ;*******************************************************************************
    sub_multi:      acall   sub16                  ;DIFF := BIN-MINU
                    jc      sb_fettich             ;Schon fertig, Überschlag   
                    mov     BIN_HIGH,DIFF_HIGH     ;Neue Binärzahl ist     
                    mov     BIN_LOW,DIFF_LOW       ; die Differenz
                    inc     count
                    sjmp    sub_multi              ;Weiterhin abziehen
    sb_fettich:     ret                                         

    ;*******************************************************************************
    BIN_to_4_digit_BCD:
                    mov     BCD_HIGH,#0            ;BCD-Zahl löschen
                    mov     BCD_LOW,#0             ;Zähler auf 0
                   
                    ;Tausender
                    mov     count,#0       
                    mov     MINU_LOW,#low(1000)
                    mov     MINU_HIGH,#high(1000)
                    acall   sub_multi              ;So oft abziehen, wie es geht
                    mov     a,count
                    swap    a
                    mov     BCD_HIGH,a             ;Tausender eintragen
                                     
                    ;Hunderter
                    mov     count,#0       
                    mov     MINU_LOW,#low(100)
                    mov     MINU_HIGH,#high(100)
                    acall   sub_multi              ;So oft abziehen, wie es geht
                    mov     a,count
                    orl     BCD_HIGH,a             ;Hunderter eintragen
                   
                    ;Zehner
                    mov     count,#0       
                    mov     MINU_LOW,#10
                    mov     MINU_HIGH,#0
                    acall   sub_multi              ;So oft abziehen, wie es geht
                   
                    mov     a,count
                    swap    a
                    mov     BCD_LOW,a              ;Zehner eintragen
                   
                    ;Einer
                    mov     a,BIN_LOW
                    orl     BCD_LOW,a              ;Nur noch Einer dazu
                   
                    ret
    ;******************************************************************************

    MAX187_MESS:    PUSH    1                       ;Sichern von R1 auf Stack
                    clr     m187_SCLK               ;SCLK auf LOW
          nop
          clr     m187_notCS              ;CS auf Low, Messung starten
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop
                    nop                             ;Lange genug gewartet
                    mov     r1,#8                   ;8 Bits lesen
                    clr     a                       ;Accu auf 0
    MAX187_M_Loop1: setb    m187_SCLK               ;Clock auf High
          nop
          clr     m187_SCLK               ;Clock wieder auf LOW
                    mov     c,m187_DOUT             ;Datenbit in das Carry-Flag
                    rlc     a                       ;in den Accu schieben
          djnz    r1,MAX187_M_Loop1       ;Erstes Byte Fertig?

                    push    ACC                     ;Messwert sichern
          clr     a         ;Accu löschen
                    mov     r1,#4                   ;4 Bits lesen
    MAX187_M_Loop2: setb    m187_SCLK               ;Clock auf High
          nop
          clr     m187_SCLK               ;Clock wieder auf LOW
                    mov     c,m187_DOUT             ;Datenbit in das Carry-Flag
                    rlc     a                       ;in den Accu schieben
          djnz    r1,MAX187_M_Loop2       ;Fertig?

          mov     r7,a                   ;Rückgabe der untersten 4 Bits
          setb    P1.1                    ;CS wieder auf High
          pop     ACC
                    pop     1                       ;R1 vom Stack zurück
          ret
           
           
    ; -------  Interruptroutinen -------
    ; Alle Interruptserviceroutinen müssen mit reti enden!
    IRQ_EXT0:    reti

    IRQ_TIMER0:  clr   TR0             ; Zähler anhalten
            mov   TL0,#TIMER_LOW  ; Zählerwert nachladen
            mov   TH0,#TIMER_HIGH
            setb  TR0             ; Zähler wieder starten

                 djnz  R5,IRQ_T0_END   ; Globaler IRQ-Count
                 acall tu_was          ; Irgendwer muss doch auch mal was tun
                 mov   R5,IRQ_COUNT    ; Globale Variable: Interruptzähler
    IRQ_T0_END:  reti 
                 
    IRQ_EXT1:    reti
    IRQ_TIMER1:  reti
    IRQ_V24 :    reti
    ;=============================================================================
    ; -------  Initialisierung von
    ;            a: Interrupts
    ;            b: Timer
    ;            c: Globalen Variablen

    init:        clr   TR0                 ;Timer 0 vorsorglich anhalten (Bit in TCON)
                 setb  ET0                 ;Interruptfreigabe für Timer 0 (Bit in IE)   
                 setb  EA                  ;Generelle Interruptfreigabe (Bit in IE)   

                 ; TMOD ist nicht Bit-Adressierbar:
            anl   TMOD,#11110000b     ;Unterstes Nibble von TMOD ausmaskieren
            orl   TMOD,#00000001b     ;Modus 01, interne Steuerung, Timer setzen
            
            ; Achtung: Der Zähler zählt vorwarts
            mov   TL0,#TIMER_LOW      ;Untersten 8 Bit des Zählerwertes
            mov   TH0,#TIMER_HIGH     ;Obersten  8 Bits des Zählerwertes
          
                 mov   R5,#IRQ_COUNT       ;Globale Variable: Interruptzähler

            setb  TR0                 ;Timer 0 starten (Bit in TCON)
                 clr   TR1             ;stop timer 1
                 mov   TH1,#0FAH       ;256-6: 9600 baud
                 mov   TL1,#0FAH
                 anl   TMOD,#0FH       ;Timer1: 8 bit auto-reload
                 orl   TMOD,#20H
                 setb  TR1             ;start timer
                 mov   SCON,#50H       ;InitRS232
                 setb  TI
                 orl   PCON,#80H
                 ret
    ;=======================================================================
    ; V24_PUT_CHAR   Ein Zeichen über die serielle Schnittstelle senden
    ;  Das Zeichen wird in A übergeben   
    ;=======================================================================
    V24_PUT_CHAR:   jnb     TI,V24_PUT_CHAR
          clr   TI
          mov    SBUF,A
          ret

    ;=======================================================================
    ; V24_NEWLINE   Cursor an den Anfang der nächsten Zeile setzen
    ;=======================================================================
    V24_NEWLINE:   push    ACC
               mov   a,#10      ;CR
          acall   V24_PUT_CHAR
          mov   a,#13      ;LF
          acall   V24_PUT_CHAR
          pop     ACC
          ret

    ;=======================================================================
    ; V24_PUTS   Zeichenkette über die serielle Schnittstelle senden
    ;  Startadresse der Zeichenkette muss in dptr stehen
    ;  Die Zeichenkette muss nullterminiert sein, d.h. durch #0 abgschlossen sein
    ;=======================================================================
    V24_PUTS:       push    ACC       ;Accu retten
          push   1      ;Register R1 retten
          mov   R1,#0
    V24_PUTS_NEXT:   mov   A,R1      
          movc   a,@a+dptr   ;Aus Tabelle lesen
          jz   V24_PUTS_ENDE   ;0 -> String beendet
          acall   V24_PUT_CHAR   ;Zeichen ausgeben
          inc   R1      ;Index erhöhen
          sjmp   V24_PUTS_NEXT   ;nächstes Zeichen
    V24_PUTS_ENDE:   pop   1   
          pop   ACC
          ret

    ;=======================================================================
    ; V24_PUT_BIN   Inhalt des Accu   als Binärzahl ausgeben   
    ;=======================================================================
    V24_PUT_BIN:   push    1
          push   2
          mov     r1,#8
          mov   r2,a      ;Zeichen in r2 merken
    V24_PB_LOOP:   mov   a,r2
          RLC   A
          mov   r2,a
          jc   V24_PB_1
          mov   a,#'0'      ;Bit ist Null
          sjmp   V24_PB_OUT      
    V24_PB_1:   mov   a,#'1'
    V24_PB_OUT:   acall   V24_PUT_CHAR
          djnz   r1,V24_PB_LOOP
          pop   2
          pop   1
          ret

    ;=======================================================================
    ; V24_PUT_HEXDIG   Inhalt des unteren Accu-Nibbles als Hex-Zahl ausgeben   
    ;=======================================================================
    HEX_TAB:   db    '0123456789ABCDEF'

    V24_PUT_HEXDIG:   push    ACC
          anl   a,#0FH
          mov    dptr,#HEX_TAB   
          movc   a,@a+dptr   
          acall   V24_PUT_CHAR   
          POP     ACC
          ret 

    ;=======================================================================
    ; V24_PUT_HEX   Inhalt des Accus als Hex-Zahl ausgeben
    ;=======================================================================
    V24_PUT_HEX:    mov     a,BCD_HIGH
                    swap    a
                    acall   V24_PUT_HEXDIG
                    swap    a
                    acall   V24_PUT_HEXDIG
                    mov     a,BCD_LOW
                    swap   a
          acall   V24_PUT_HEXDIG
          swap   a
          acall   V24_PUT_HEXDIG
          ret             
    ;=============================================================================
    ; Dieses Unterprogramm wird zyklisch vom Interrupt aufgerufen
    ; Die Zykluszeit ist die Timerzeit (TH0,TL0) mal dem Startwert von R7 
    ;=============================================================================
    tu_was:         acall   MAX187_MESS
                    swap    a
          mov     r1,a
          mov     a,#11110000b
                    anl     a,r1
          mov     r2,a
          mov    a,#00001111b
          anl     a,r1
          mov     r1,a
          mov     a,r2
          orl     a,r7
          mov     r7,a
          mov     a,r1
                    mov     BIN_LOW,r7
                    mov     BIN_HIGH,a
          acall   BIN_to_4_digit_BCD  ;Umwandlung in BCD, Ergebnis in BCD_*
          acall   put_hex_to_display
          acall   V24_PUT_HEX
          mov     a,#'|'
          acall   V24_PUT_CHAR

    ;      mov     a,#27                      ;Cursor-Home (VT 100!)
    ;      acall   V24_PUT_CHAR               ;ESC[H
    ;      mov     a,#'['
    ;      acall   V24_PUT_CHAR
    ;      mov     a,#'H'
    ;      acall   V24_PUT_CHAR
                    ret


    ;------------------Main-----------------------
    main:      acall init
    ewigloop:       ljmp ewigloop
          end



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Projekt 2006

    Öhhh alleine im raum - gepostet von Lykaner am Montag 08.05.2006



    Ähnliche Beiträge wie "messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)"

    Weltgrößtes HDTV-Display mit 751 Quadratmetern - ZeErOx (Samstag 29.07.2006)
    Kontaktleiste für das S65 Display - avrnix (Mittwoch 26.09.2007)
    Der Beste Songs von Vulgar Display Of Power - revolution (Montag 29.11.2004)
    Habe meinem AYGO ein Head-up-Display montiert >>>& - Beat (Mittwoch 17.05.2006)
    Walkera 7-Kanal (WK 0701) V1 Poti defekt? - m_roeller (Sonntag 11.06.2006)
    [TUT] Head-Up-Display - ToyotaAE86 (Samstag 02.06.2007)
    Poti im Empfänger - FlyingSaltman (Sonntag 18.06.2006)
    display Turnier im spielraum - Prolo-prinZ (Samstag 25.08.2007)
    Einzelne Farben berechnen - S65 Display - avrnix (Sonntag 11.11.2007)
    Neues Display - Alfge (Dienstag 26.06.2007)