
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
> 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 |