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 

 LED Display TMS1637 Ansteuerung Kategorie: C-Control I V1.1 (von Ralf Rosche - 19.10.2021 11:58)
Ralf Rosche nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-Station V1.1, C-Control 2
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



 Antwort schreiben

Bisherige Antworten:

Re: LED Display TMS1637 Ansteuerung (von das |_ Team - 27.10.2021 2:21)
Re: LED Display TMS1637 Ansteuerung (von das |_ Team - 20.10.2021 21:50)
Re: LED Display TMS1637 Ansteuerung (von das |_ Team - 20.10.2021 20:32)