Verfügbare Informationen zu "messung(poti) und ausgabe(Display) ausgabe(HyperTerminal)"
Qualität des Beitrags: 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:53messung(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)