Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit Řbrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: LED Display TMS1637 Ansteuerung Kategorie: C-Control I V1.1 (von das |_ Team, Homepage - 20.10.2021 20:32)
 Als Antwort auf LED Display TMS1637 Ansteuerung von Ralf Rosche - 19.10.2021 11:58
> Hallo,
> ich habe das Display urspr├╝nglich f├╝r meinen Robby RP5 angeschafft und programmiert um Sensorwerte einafch darstellen zu k├Ânnen. Der Robby ist ja nichts anderes als eine C-Control 1 mit einem Subsystem f├╝r die Sensoren.
>
> Daher l├Ąuft der Code auch auf jeder C-Control. Ich ahbe hier eine BeispielCode f├╝r eine Uhr hinzugef├╝gt. Die Ansteuerung des TMS1637 (gibt es mit 2 4 oder auch 6 Digits) erfolgt in Assembler. In reinem Basic hatte ich etwas Probleme, sodass ich dann auf Assembler umgestiegen bin.
>
> Den Code habe ich dokumentiert, sodass keien Fragen offen bleiben sollten. Ansonsten einfach eine Email senden. Die Ansteuerung ist ganz ├Ąhnlich eines i2C Busses allerdings ohne Adressierung und ACK bzw. NACK.
>
> Ein ausf├╝hrliches Datenblatt ist im Internet zu finden. Der TMS kann noch mehr: eine Tastenmatrix abfragen. Das habe ich allerdings nicht implementiert. Wenn es jemanden interessiert baue ich das ein.
>
> Hier mein Versuchsaufbau:
>
>
>
> CCbasic Code:
>
> '***********************************************************
> '
> '
> ' C-Control/basic    TMS1637.BAS
> '
> ' Ausgabe / Steuerung 7-Segment Anzeige mit TMS1637
> ' ben├Âtigt Assemblerfile TMS1637.asm
> ' 2 Einsprungsadressen:
> ' sys &H101  : Display l├Âshcne , Bus initialisieren
> ' sys &H012b : Zeichen schreiben
> ' Der TMS1637 h├Ąngt an Port B Pin 1,2 (Assembler 0,1)
> ' 3 Byte Register werden vom Assembler genutzt
> ' char: Das Zeichen, eine Position aus der LookupTabelle 0-9, A-F
> ' Es sind auch andere Zeichen m├Âglich, dazu in das Datenblatt des TMS1637 schauen
> ' position: Postition auf dem Display 1-4
> ' Brightness: steuert die Helligkeit 0-8, default 3
> ' point: 0 oder 1 steuert ob der Doppelpunkt oder der Punkt je nach Ausf├╝htrung
> ' gezeigt wird, default 0
> ' Hier im Beispiel ist ein Uhr realisiert, die ├╝ber DCF-77 snchronisiert wird
> '
> '
> '***********************************************************
>
> define char byte        ' Kommandos, Steuerbytes und Zeichen aus Lookup Tabelle
> define position byte    ' Positiona auf dem Display
> define brightness byte  ' Helligkeit
> define point byte       ' Punkt anzeigen
> define daten byte       ' Hilfsregister
> define countMinute byte ' Hilfsregister f├╝r das Update der Anzeige
>
> hour   = 0              ' default init
> minute = 0              ' default init
>
> sys &H101               ' Initialisieren und alle Zeichen l├Âschen
> point       = 1         ' Punkt an
> brightness  = 0         ' Helligkeit setzen 0...7, default 3
> countMinute = minute    ' Testregister initialisieren
>
> #Loop                              ' Schleife
>      position = 1                  ' erste Position
>      daten    = hour / 10          ' Pointer f├╝r Tabelle vorbereiten
>      looktab  zeichen, daten, char ' Zeichen laden aus Mapping Tabelle HEX 0..F L├Âschen mit 0
>      sys &H012b                    ' Zeichen schreiben
>      position = 2                  ' zweite Position
>      daten  = hour mod 10          ' Pointer f├╝r Tabelle vorbereiten
>      looktab  zeichen, daten, char
>      sys &H012b                    ' Einsprung f├╝r Assembler Routine writChar
>      daten = minute / 10
>      position = 3                  ' Position bestimmen
>      looktab  zeichen, daten, char
>      sys &H012b
>      daten = minute mod 10
>      looktab  zeichen, daten, char
>      position = 4
>      sys &H012b
>      #loop2
>      if countMinute = minute  then  goto loop2 ' Update Display, nur wenn sich die Minute ├Ąndert
>      countMinute = minute
>      goto Loop                                 ' zur├╝ck zur Loop
> end
>
> syscode  "tms1637.s19"                         ' nur einmal laden, dann auskommentieren
>
> table zeichen &H3f &H06 &H5b &H4f              ' Lookup Tabelle f├╝r die zeichenkodierung 0-9, A-F entspricht 0-15
>                             &H66 &H6d &H7d &H07
>                             &H7f &H6f &H77 &H7c
>                             &H39 &H5e &H79 &H71
> tabend
>
>
> Assembler Code:
> ;***********************************************************
> ;
> ; M6805 Assembler    TMS1637.ASM
> ; Processor 4Mhz
> ; Control TMS1637 display driver
> ; Uses 3 byte of user variables starting at $A1
> ; Returns nothing
> ; $A1 returns char
> ; $A2 returns postion
> ; $A3 returns brightness
> ; $A4 point toggle point
> ;
> ;***********************************************************
>
> ; definitions
> portb       equ 1                  ; port b register
> pbdir       equ 5                  ; port b direction register
> CLK         equ 0                  ; PIN CLK Port B,0 (Basic 1)
> DIO         equ 1                  ; PIN DIO Port B,1 (Basic 2)
> ; user variables
> char        equ $A1                ; uservariable char
> position    equ $A2                ; uservariable position
> brightness  equ $A3                ; uservariable brightness
> point       equ $A4                ; uservariable point
>
>             org $101
>
> initTMS1637:
>             bset CLK,pbdir         ; PIN CLK direction Output
>             bclr CLK, portb        ; port high
>             bset DIO,pbdir         ; PIN DIO direction Output
>             bclr DIO, portb        ; DIO low
>             jsr clrScr             ; clear display
>             rts                    ; return to basic
> clrScr:
>             clra                   ; clear accu
>             sta char               ; clear char
>             sta point              ; clear point
>             sta position           ; clear position
>             inc position           ; position 1 in basic is 0 in assembler
>             jsr writeChar          ; write 0 to position 1
>             inc position           ; next position
>             jsr writeChar          ; write 0 to position 2
>             inc position           ; next position
>             jsr writeChar          ; write 0 to position 3
>             sta brightness         ; stor3 3 to brightness = default
>             inc position           ; next position
>             jsr writeChar          ; write 0 to position 4
>             rts                    ; return to basic
> writeChar:
>             clra                   ; clear accu
>             cmp point              ; is point 0?
>             beq outputChar         ; yes branch to output
>             lda char               ; no, load char to accu
>             add #$80               ; add 0x80 to char
>             sta char               ; store to char
> outputChar:
>            sei                     ; disable interrupt
>            jsr display             ; call display => output char
>            cli                     ; enable interrupt
>            rts                     ; return to basic
> display:
>            lda  #$44               ; load accu with constant 0x44 see TMS1637 doc
>            jsr start_seq           ; call start seq
>            jsr writeByte           ; output 8 bits
>            lda position            ; get postion
>            deca                    ; dec postion, in basic 1 is 0 in assembler
>            ora #$c0                ; or postion with constant 0xc0 see TMS1637 doc
>            jsr stop_seq            ; call stop seq
>            jsr start_seq           ; call start seq
>            jsr writeByte           ; output 8 bits
>            lda char                ; get char
>            jsr writeByte           ; output 8 bits
>            lda #$88                ; load accu with conatant 0x88 see TMS1637 doc
>            add brightness          ; add accu with brightness
>            jsr stop_seq            ; call stop seq
>            jsr start_seq           ; call start seq
>            jsr writeByte           ; output 8 bits
>            jsr stop_seq            ; call stop seq
>            rts                     ; return to basic
> writeByte:
>            ldx #8                  ; load x with constant 8, count of bits per databyte = 8
> nextBitOut:
>            bclr CLK, portb         ; pull CLK down to low, init data transfer
>            rora                    ; byte is in accu, rotate right through carry
>            bcs highBit             ; bit was 1? we have a 1 branch to highbit
>            bclr DIO, portb         ; pull DIO down Bit is 0
>            jmp goOn                ; next bit
> highBit:
>            bset DIO, portb         ; pull DIO up Bit is 1
> goOn:
>            bset CLK, portb         ; pull CLK high
>            decx                    ; dec bit counter
>            bne nextBitOut          ; all bits done? no then branch to nextBitout
>            bclr CLK, portb         ; all bits send end seq, pull CLK down
>            bset DIO, portb         ; pull DIO high
>            bset CLK, portb         ; pull CLK high
>            bclr DIO,pbdir          ; PIN DIO input  (add some nops here, check DIO for HIGH set from TMS1637)
>            bset DIO,pbdir          ; PIN DIO output
>            rts                     ; return
> start_seq:
>            bset CLK, portb         ; pull CLK high
>            bset DIO, portb         ; pull DIO high
>            bclr DIO, portb         ; pull DIO low
>            bclr CLK, portb         ; pull CLK low
>            rts                     ; return
> stop_seq:
>          bclr CLK, portb           ; pull CLK low
>          bclr DIO, portb           ; pull DIO low
>          bset CLK, portb           ; pull CLK high
>          bset DIO, portb           ; pull DIO high
>          rts                       ; return
>
>
>


Meine Homepage: http://visit.ghn-sensorik.de/L-Team/

 Antwort schreiben

Bisherige Antworten: