# 8 bit Anzeige ??



## spsks (30 August 2005)

Hallo,
was gibt es, oder kann ich mir bauen, um die 8 Bit einer S5 Baugruppe als Dezimalzahl auf 7-Segment-Anzeigen darzustellen?

Gruß Klaus


----------



## lorenz2512 (30 August 2005)

Hallo,
habe hier zu Hause eine 4 stellige BCD Anzeige mit Latch rumliegen, und 2 BCD Anzeigen einstellig anreihbar, mußt mal beschreiben was Du vorhast.


----------



## Zottel (30 August 2005)

Als Dezimalzahl (0-255) ist die Schwierigkeit, daß Überträge zwischen den Stellen erforderlich sind.  
Du könntest je 4 bit auf einer Anzeige als Hexadezimalziffer anzeigen. Decoder dafür gibt es, aber sie dürften teurer und seltener sein als 74LS47 (BCD-7Segment-Decoder). Ich habe auch keine Typenbezeichnung parat.
Wenn ich wirklich die 8 bit als Zahl von 0 bis 255 darstellen wollte, würde ich einen Mikrocontroller nehmen. Da kannst du noch einen Pin zum umschalten vorsehen, daß er hex anzeigt.
Er kann die Anzeigen auch gleich multiplexen, so daß die Verdrahtung weniger wird.


----------



## spsks (31 August 2005)

Hallo,
ich wollte ganz einfach binäre Werte dezimal darstellen.
Ist nämlich mühsam die biären Stellen von einem Digi-Output-Baustein zu addieren, um den Wert zu abzulesen.

Z.B. den Wert eines analogen Eingang abzulesen, ohne Umweg über analogen Ausgang.

Anwendungen gibt es viele, ich kann es nur nicht realisieren.
Mit Microkontroller hab ich noch nie was gemacht. Da wüßte ich überhaupt nicht wie so was gehen soll. Hab nur mal Impulszähler oder mit Frequenzzähler auf TTL Basis rumgebastetelt. Das ist aber alles und schon sehr lange her.

Gruß Klaus


----------



## Zottel (31 August 2005)

spsks schrieb:
			
		

> Hallo,
> ich wollte ganz einfach binäre Werte dezimal darstellen.
> .....
> . Hab nur mal Impulszähler oder mit Frequenzzähler auf TTL Basis rumgebastetelt. Das ist aber alles und schon sehr lange her.


Wenn es sein muß, geht das natürlich auch mit TTL. Das Problem ist halt, das du um dezimale Zahlen zu bekommen von der Basis 2 zur Basis 10 wandeln mußt. Das braucht die Divisions- und Modulo- Operationen. 
Die einfachste Art mit TTL-Logik:
Kaskadierte Vergleicher (2x2 7485) bestimmen, ob die Gesamtzahl größer als 100 oder größer als 200 ist. Falls ja zieht ein 8-Bit-Addierer (schon wieder kaskadieren) 100 oder 200 ab.
Kaskadierte Vergleicher (9x2 7485) bestimmen, ob der Rest größer als 10, 20, 30, 40..90 ist Falls ja zieht ein 8-Bit-Addierer die entsprechende Zahl ab.
Der Rest ist zwischen 0 und 9 und kann von einem 7-Segment Decoder 7447 verarbeitet werden.

Noch 2 Vorschläge:
1. Du gibst die 8 bit auf die Adressleitungen eines EPROMs. Die übrigen Adressleitungen läßt du auf 0. In die ersten 256 Datenbytes schreibst du nun die Segment-Kombinationen, die eine 7-Segmentanzeige darstellen soll. Bei 8 bit Daten und 3-stelliger Anzeige brauchst du 3 EPROMS. 
2. Du bentzt einen D/A-Wandler (Widerstandsnetzwerk reicht) und gibst die Spannung auf eine digitale Einbauanzeige und gleichst sie so ab, daß der Wert stimmt.


----------



## Zottel (31 August 2005)

Zottel schrieb:
			
		

> spsks schrieb:
> 
> 
> 
> ...


----------



## lorenz2512 (31 August 2005)

Hallo,
es gibt Anreihbare BCD 7Segment Anzeigen von Idec (2 habe ich hier zu Hause) geht mit latch und ohne, Problem: machst Du ohne latch brauchst Du 20 Ausgänge, machst Du es mit latch dann 10 Ausgänge und mußt ein Programm zur Ansteuerung schreiben.


----------



## Zottel (31 August 2005)

lorenz2512 schrieb:
			
		

> Hallo,
> es gibt Anreihbare BCD 7Segment Anzeigen von Idec (2 habe ich hier zu Hause) geht mit latch und ohne, Problem: machst Du ohne latch brauchst Du 20 Ausgänge, machst Du es mit latch dann 10 Ausgänge und mußt ein Programm zur Ansteuerung schreiben.


Er will ja nicht hexadezimal sondern dezimal anzeigen. bei 00001101 muß dann eine 1 auf der zweiten und eine 3 in der dritten Stelle stehen. Wie soll er das mit deinen Anzeigen machen?


----------



## lorenz2512 (31 August 2005)

Hallo,
die Zahl muß natürlich in BCD gewandelt werden.


----------



## spsks (31 August 2005)

Hallo,

was ist "Latch" ?

Würde es funktionieren, wenn ich der SPS sage, sie solle es nach BCD umwandeln? Da ist doch ein FB integriert.

Dann habe ich aber nur eine 2-stellige Anzeige.
Würde teilweise reichen, aber nicht immer.

Gruß Klaus


----------



## lorenz2512 (31 August 2005)

Hallo,
bei S7 ist ein Umwandler dabei Integer zu BCD, der kann aber nur ±999 darstellen, müßtes also noch etwas tricksen oder den Integer in DI wandeln und dann in BCd DI-BCD das wäre bis 7Stellen. Latch bedeutet speichern, das heißt hierbei die 4 BCD Leitungen von den Anzeigen liegen alle paralell, nun mußt Du ein Programm dafür schreiben das jede Dezimalstelle nacheinander aufruft, sobald z.B. die Zehnerstelle dran ist wird die 2. BCD Anzeige gespeichert, bei Hunderter die 3. usw. so könnte man auch mit einer Anzeige nacheinander den Wert darstellen, müßtes dann nur 5 Ausgänge beobachten, z.B. A0.0 sind die Einerstellen, A0.1 die Zehner usw.


----------



## Zottel (31 August 2005)

spsks schrieb:
			
		

> Hallo,
> 
> was ist "Latch" ?


Ein Zwischenspeicher. Bei Anzeigen mit Latch kannst du mehrere an den gleichen Ausgängen betreiben: Du gibst zuerst den Wert für die 1.Anzeige auf die Ausgänge. Über einen weiteren Ausgang gibst du dann der Anzeige einen Impuls, worauf sie die Daten ins Latch übernimmt. 
Danach gibst du den Wert für die 2.Anzeige auf die Ausgänge. Die erste ändert sich nicht, sondern zeigt weiterhin an, was im Latch gespeichert wurde. Über einen weiteren Ausgang gibst du dann der 2. Anzeige einen Impuls, worauf sie die Daten ins Latch übernimmt. 


			
				spsks schrieb:
			
		

> Würde es funktionieren, wenn ich der SPS sage, sie solle es nach BCD umwandeln? Da ist doch ein FB integriert.


 Ja, schon, aber du brauchst dann zusätzliche Ausgänge an der SPS, die nur für die Anzeigen da sind.

Dann habe ich aber nur eine 2-stellige Anzeige.
Würde teilweise reichen, aber nicht immer.

Gruß Klaus[/quote]


----------



## lorenz2512 (1 September 2005)

Hallo,
 habe noch mal alles durcchgelesen, wenn Du eine S5-90/95/100/115 hast wirst Du Probleme beim Wandeln bekommen, alternativ Lösungen: OP 3993III (wobei hier ein DB6 in der Steuerung erstellt werden Muß) oder ein PG 615 (dort wird dann aber nur Hex angezeigt, glaube ich), beides so um die30-50€ bei ebay und keine Bastelei, keine Ausgänge die blockiert werden, und weitere Beobachtungs und Steuermöglichkeiten.


----------



## Ralle (1 September 2005)

8 Bit reichen für eine zweistellig BCD-7-Segment-Anzeige (z.Bsp. bei Konrad zu beziehen) (Step7 --> wandeln mit Standard-FC, Step5 --> kleines Vorbereitungsprogramm + FB241 (BCD-Wandlung).


----------



## Oberchefe (1 September 2005)

also mit PIC Controller könnte das so aussehen (erstellt im Parsic, nur im Simulator getestet!):


```
; Source created with Parsic Version 3.x

; at              : 01.09.2005 13:33:56


; Project File    : Z:\8Bit.PIC

; Project Version : 1.0.8

; Created         : 24.07.2001 15:00:00

; Last change     : 01.09.2005 13:29:00

	PROCESSOR 16F877

	INCLUDE P16F877.INC

	RADIX DEC


	__IDLOCS H'0100'

	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _BODEN_ON & _XT_OSC & _LVP_OFF & _CPD_OFF & _DEBUG_OFF

; Diverses

ZERO	EQU Z	; ZERO-Flag
CARRY	 EQU C	; CARRY-Flag


; Variable

S1	= 32	; located in Bank 0
TR1	= 33	; located in Bank 0
TR1_HI	= 34	; located in Bank 0
S7	= 35	; located in Bank 0
S0	= 36	; located in Bank 0
S6	= 37	; located in Bank 0
OS1_FD	= 38	; located in Bank 0
OS2_FD	= 39	; located in Bank 0
OS3_FD	= 40	; located in Bank 0
ZV1	= 41	; located in Bank 0
ZV1_FD	= 42	; located in Bank 0
Z100	= 43	; located in Bank 0
S2	= 44	; located in Bank 0
S4	= 45	; located in Bank 0
Z10	= 46	; located in Bank 0
S5	= 47	; located in Bank 0
Z1	= 48	; located in Bank 0
S3	= 49	; located in Bank 0
RAM	= 50	; located in Bank 0
SYS_TMP1	= 115	; located in Bank 0, 1, 2, 3
SYS_WSAV	= 116	; located in Bank 0, 1, 2, 3
SYS_SSAV	= 117	; located in Bank 0, 1, 2, 3
SYS_PSAV	= 118	; located in Bank 0, 1, 2, 3
SYS_TMP2	= 119	; located in Bank 0, 1, 2, 3
SYS_TMP3	= 120	; located in Bank 0, 1, 2, 3
SYS_TMP4	= 121	; located in Bank 0, 1, 2, 3

	ERRORLEVEL -302	; disable warning (Bankswitching)
	ERRORLEVEL -306	; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

	ORG 0

	CLRF STATUS	; switch to RAM-Bank 0
	MOVLW HIGH SYS_INIT	; set page
	MOVWF PCLATH
	GOTO SYS_INIT

;****************************************
;Interrupt-Adress
;****************************************

	MOVWF SYS_WSAV	; save register
	SWAPF STATUS,W
	CLRF STATUS	; bank 0
	MOVWF SYS_SSAV
	MOVFW PCLATH
	MOVWF SYS_PSAV
	CLRF PCLATH

	BCF INTCON,T0IF	; Interrupt quitieren

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	INCFSZ TR1,F
	GOTO SYS_INT_LABEL_0
	INCF TR1_HI,F

SYS_INT_LABEL_0

EXITINT
	MOVFW SYS_PSAV
	MOVWF PCLATH

	SWAPF SYS_SSAV,W	; Register zurück
	MOVWF STATUS
	SWAPF SYS_WSAV,F
	SWAPF SYS_WSAV,W

	RETFIE	; RETurn From Interrupt and Enable GIE


;****************************************
; Multiplication 8 - Bit
;****************************************

SYSMUL8
	CLRF SYS_TMP3
	MOVLW 8
	MOVWF SYS_TMP4

SYSMUL8_1
	MOVFW SYS_TMP1
	RRF SYS_TMP2,F

	BTFSC STATUS,CARRY
	ADDWF SYS_TMP3,F

	RLF SYS_TMP1,F
	DECFSZ SYS_TMP4,F

	GOTO SYSMUL8_1

	RETURN

;****************************************
; Division 8 - Bit
;****************************************

SYSDIV8
	MOVF SYS_TMP2,F
	BTFSC STATUS,ZERO
	GOTO SYSDIV8_ERROR
	CLRF SYS_TMP3	; Ergebnis löschen
	MOVLW 1
	MOVWF SYS_TMP4

SYSDIV8_0
	BTFSC SYS_TMP2,7	; OP2 linksbündig
	GOTO SYSDIV8_1
	INCF SYS_TMP4,F
	BCF STATUS,CARRY
	RLF SYS_TMP2,F
	GOTO SYSDIV8_0

SYSDIV8_1
	MOVFW SYS_TMP2	; vergleichen
	SUBWF SYS_TMP1,F	; F-W -> W

	BTFSC STATUS,CARRY
	GOTO SYSDIV8_2
	ADDWF SYS_TMP1,F	; F+W -> F
	BCF STATUS,CARRY

SYSDIV8_2
	RLF SYS_TMP3,F
	RRF SYS_TMP2,F
	DECFSZ SYS_TMP4,F
	GOTO SYSDIV8_1

	RETURN

SYSDIV8_ERROR
	MOVLW 255
	MOVWF SYS_TMP3
	RETURN

;****************************************
; Subroutines
;****************************************


;****************************************
;Initialisierung
;****************************************


SYS_INIT

	MOVLW B'00100000'
	MOVWF INTCON

; Ausgangs-Pegel setzen, bevor die Richtung gesetzt wird

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVLW B'00000000'
	MOVWF PORTA

	MOVLW B'01111111'
	MOVWF PORTB

	MOVLW B'00000000'
	MOVWF PORTC

	MOVLW B'00000000'
	MOVWF PORTD

	MOVLW B'00000000'
	MOVWF PORTE

	MOVLW 143
	BSF STATUS,RP0	; Bank 1
	MOVWF OPTION_REG

	MOVLW 6	; all Digital
	MOVWF ADCON1

; Richtung setzen

	MOVLW B'11111111'
	MOVWF TRISA

	MOVLW B'10000000'
	MOVWF TRISB

	MOVLW B'11111000'
	MOVWF TRISC

	MOVLW B'11111111'
	MOVWF TRISD

	MOVLW B'00000111'
	MOVWF TRISE

; init vars


; Clear RAM

	BCF STATUS,IRP
	MOVLW 32
	MOVWF FSR
CR1
	CLRF INDF
	INCF FSR,F
	
	BTFSS FSR,7
	GOTO CR1
	BSF FSR,5
CR2
	CLRF INDF
	INCF FSR,F
	MOVLW H'F0'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR2
	BSF STATUS,IRP
	MOVLW 16
	MOVWF FSR
CR3
	CLRF INDF
	INCF FSR,F
	MOVLW H'70'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR3
	MOVLW 144
	MOVWF FSR
CR4
	CLRF INDF
	INCF FSR,F
	MOVLW H'F0'
	SUBWF FSR,W
	BTFSS STATUS,ZERO
	GOTO CR4


	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	CLRF TMR0
	BCF INTCON,T0IF
	BSF INTCON,GIE	; Interrupt freigeben

;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

	CLRWDT

;***************************************************
; Unterprogramm BIN_TO_7SEG aufrufen
;***************************************************

	MOVLW HIGH BIN_TO_7SEG	; set page
	MOVWF PCLATH
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVFW S0

	CALL BIN_TO_7SEG

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVWF S1

	BSF INTCON,GIE
	BCF PCLATH,3	; Page 0
	BCF PCLATH,4	; Page 0
;***************************************************
; Timer -> TR1
;***************************************************

	MOVLW 0	; Test auf >=
	SUBWF TR1_HI,W	;F-W -> W
	BTFSS STATUS,ZERO
	GOTO LABEL_TR1_CHECK
	MOVLW 8
	SUBWF TR1,W	;F-W -> W
LABEL_TR1_CHECK
	BTFSS STATUS,CARRY
	GOTO LABEL_TR1_ENDE

LABEL_TR1_RESET
	MOVLW 0	; Test auf >=
	SUBWF TR1_HI,F	;F-W -> F
	MOVLW 8
	SUBWF TR1,F	;F-W -> F
	BTFSS STATUS,CARRY
	DECF TR1_HI,F

LABEL_TR1_SET	; toggel output
	BTFSC S7,0
	GOTO LABEL_TR1_CLR
	BSF S7,0
	GOTO LABEL_TR1_ENDE
LABEL_TR1_CLR
	BCF S7,0
LABEL_TR1_ENDE

;***************************************************
; Multiplexer -> MX1
;***************************************************

	CLRF SYS_TMP1
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVFW ZV1
	BTFSS STATUS,ZERO
	GOTO LABEL_MX1_CHECKCONTROL1

	MOVFW Z1
	MOVWF S0
	GOTO LABEL_MX1_END

LABEL_MX1_CHECKCONTROL1
	INCF SYS_TMP1,F
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVFW ZV1
	SUBWF SYS_TMP1,W
	BTFSS STATUS,ZERO
	GOTO LABEL_MX1_CHECKCONTROL2

	MOVFW Z10
	MOVWF S0
	GOTO LABEL_MX1_END

LABEL_MX1_CHECKCONTROL2
	INCF SYS_TMP1,F
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	MOVFW ZV1
	SUBWF SYS_TMP1,W
	BTFSS STATUS,ZERO
	GOTO LABEL_MX1_CHECKCONTROL3

	MOVFW Z100
	MOVWF S0
	GOTO LABEL_MX1_END

LABEL_MX1_CHECKCONTROL3

LABEL_MX1_END

;***************************************************
; UND - Gatter -> UG12
;***************************************************

LABEL_UG12_1
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S6,0
	GOTO LABEL_UG12_FALSE
LABEL_UG12_2
	BTFSC S6,1
	GOTO LABEL_UG12_FALSE
LABEL_UG12_3
	BTFSS S6,4
	GOTO LABEL_UG12_FALSE

LABEL_UG12_TRUE
	BSF PORTC,0
	GOTO LABEL_UG12_ENDE
LABEL_UG12_FALSE
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF PORTC,0
LABEL_UG12_ENDE
;***************************************************
; UND - Gatter -> UG13
;***************************************************

LABEL_UG13_1
	BTFSS S6,0
	GOTO LABEL_UG13_FALSE
LABEL_UG13_2
	BTFSC S6,1
	GOTO LABEL_UG13_FALSE
LABEL_UG13_3
	BTFSS S6,4
	GOTO LABEL_UG13_FALSE

LABEL_UG13_TRUE
	BSF PORTC,1
	GOTO LABEL_UG13_ENDE
LABEL_UG13_FALSE
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF PORTC,1
LABEL_UG13_ENDE
;***************************************************
; UND - Gatter -> UG14
;***************************************************

LABEL_UG14_1
	BTFSC S6,0
	GOTO LABEL_UG14_FALSE
LABEL_UG14_2
	BTFSS S6,1
	GOTO LABEL_UG14_FALSE
LABEL_UG14_3
	BTFSS S6,4
	GOTO LABEL_UG14_FALSE

LABEL_UG14_TRUE
	BSF PORTC,2
	GOTO LABEL_UG14_ENDE
LABEL_UG14_FALSE
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF PORTC,2
LABEL_UG14_ENDE
;***************************************************
; One Shot -> OS1
;***************************************************


	BTFSS S7,0
	GOTO LABEL_OS1_1
	BTFSC OS1_FD,0
	GOTO LABEL_OS1_1
	BSF OS1_FD,0
	BSF S6,5
	GOTO LABEL_OS1_2
LABEL_OS1_1
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF S6,5
	BTFSC S7,0
	GOTO LABEL_OS1_2
	BCF OS1_FD,0
LABEL_OS1_2
;***************************************************
; One Shot -> OS2
;***************************************************


	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S6,5
	GOTO LABEL_OS2_1
	BTFSC OS2_FD,0
	GOTO LABEL_OS2_1
	BSF OS2_FD,0
	BSF S6,6
	GOTO LABEL_OS2_2
LABEL_OS2_1
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF S6,6
	BTFSS S6,5
	GOTO LABEL_OS2_2
	BCF OS2_FD,0
LABEL_OS2_2
;***************************************************
; One Shot -> OS3
;***************************************************


	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S6,6
	GOTO LABEL_OS3_1
	BTFSC OS3_FD,0
	GOTO LABEL_OS3_1
	BSF OS3_FD,0
	BSF S6,7
	GOTO LABEL_OS3_2
LABEL_OS3_1
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF S6,7
	BTFSS S6,6
	GOTO LABEL_OS3_2
	BCF OS3_FD,0
LABEL_OS3_2
;***************************************************
; RS-FLIP-FLOP -> RS1
;***************************************************

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S6,5
	GOTO LABEL_RS1_RESET
	BTFSS S6,7
	GOTO LABEL_RS1_ENDE
	BSF S6,4	; Ausgang setzen
	GOTO LABEL_RS1_ENDE
LABEL_RS1_RESET
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BCF S6,4	; Ausgang zurücksetzen
LABEL_RS1_ENDE

;***************************************************
; Zähler -> ZV1
;***************************************************

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSS S6,2	; Reset ?
	GOTO LABEL_ZV1_COUNT
	CLRF ZV1
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_COUNT

; Test auf negative Flanke

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSC S6,5
	GOTO LABEL_ZV1_SETFD
	BTFSS ZV1_FD,0
	GOTO LABEL_ZV1_SETFD

	BCF ZV1_FD,0


	BTFSC S6,3	; Vorwärts oder Rückwärts ?
	GOTO LABEL_ZV1_BACKWARD

	INCF ZV1,F
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_BACKWARD
	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	DECF ZV1,F

LABEL_ZV1_SETOUT

; Output Q0

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSS ZV1,0
	GOTO LABEL_ZV1_SETOUT0
	BSF S6,0
	GOTO LABEL_ZV1_SETOUT0_END
LABEL_ZV1_SETOUT0
	BCF S6,0
LABEL_ZV1_SETOUT0_END

; Output Q1

	BTFSS ZV1,1
	GOTO LABEL_ZV1_SETOUT1
	BSF S6,1
	GOTO LABEL_ZV1_SETOUT1_END
LABEL_ZV1_SETOUT1
	BCF S6,1
LABEL_ZV1_SETOUT1_END

; Output Q2

	BTFSS ZV1,2
	GOTO LABEL_ZV1_SETOUT2
	BSF S6,2
	GOTO LABEL_ZV1_SETOUT2_END
LABEL_ZV1_SETOUT2
	BCF S6,2
LABEL_ZV1_SETOUT2_END


LABEL_ZV1_SETFD

; Test auf positive Flanke

	BCF STATUS,RP0	; Bank 0
	BCF STATUS,RP1	; Bank 0
	BTFSS S6,5
	GOTO LABEL_ZV1_EXIT
	BSF ZV1_FD,0

LABEL_ZV1_EXIT

;***************************************************
; Verteiler -> BV1
;***************************************************

	BTFSC S1,0
	GOTO LABEL_BV1_0
	BSF PORTB,0
	GOTO LABEL_BV1_0_END
LABEL_BV1_0
	BCF PORTB,0
LABEL_BV1_0_END

;**********************************************

	BTFSC S1,1
	GOTO LABEL_BV1_1
	BSF PORTB,1
	GOTO LABEL_BV1_1_END
LABEL_BV1_1
	BCF PORTB,1
LABEL_BV1_1_END

;**********************************************

	BTFSC S1,2
	GOTO LABEL_BV1_2
	BSF PORTB,2
	GOTO LABEL_BV1_2_END
LABEL_BV1_2
	BCF PORTB,2
LABEL_BV1_2_END

;**********************************************

	BTFSC S1,3
	GOTO LABEL_BV1_3
	BSF PORTB,3
	GOTO LABEL_BV1_3_END
LABEL_BV1_3
	BCF PORTB,3
LABEL_BV1_3_END

;**********************************************

	BTFSC S1,4
	GOTO LABEL_BV1_4
	BSF PORTB,4
	GOTO LABEL_BV1_4_END
LABEL_BV1_4
	BCF PORTB,4
LABEL_BV1_4_END

;**********************************************

	BTFSC S1,5
	GOTO LABEL_BV1_5
	BSF PORTB,5
	GOTO LABEL_BV1_5_END
LABEL_BV1_5
	BCF PORTB,5
LABEL_BV1_5_END

;**********************************************

	BTFSC S1,6
	GOTO LABEL_BV1_6
	BSF PORTB,6
	GOTO LABEL_BV1_6_END
LABEL_BV1_6
	BCF PORTB,6
LABEL_BV1_6_END

;**********************************************


;***************************************************
; GND
;***************************************************

	BCF S6,3	; immer Low

;***************************************************
;AF1
;***************************************************

	MOVFW S3
	MOVWF SYS_TMP1
	MOVLW 100
	MOVWF SYS_TMP2
	MOVLW HIGH SYSDIV8
	MOVWF PCLATH
	CALL SYSDIV8
	MOVLW HIGH LABEL_AF1
	MOVWF PCLATH
LABEL_AF1
	MOVFW SYS_TMP3
	MOVWF Z100

LABEL_AF1_EXIT
;***************************************************
;AF2
;***************************************************

	MOVFW Z100
	MOVWF SYS_TMP1
	MOVLW 100
	MOVWF SYS_TMP2
	MOVLW HIGH SYSMUL8
	MOVWF PCLATH
	CALL SYSMUL8
	MOVLW HIGH LABEL_AF2
	MOVWF PCLATH
LABEL_AF2
	MOVFW SYS_TMP3
	MOVWF S2

LABEL_AF2_EXIT
;***************************************************
;AF3
;***************************************************

	MOVFW S2
	SUBWF S3,W	; F - W -> W
	MOVWF S4

LABEL_AF3_EXIT
;***************************************************
;AF4
;***************************************************

	MOVFW S4
	MOVWF SYS_TMP1
	MOVLW 10
	MOVWF SYS_TMP2
	MOVLW HIGH SYSDIV8
	MOVWF PCLATH
	CALL SYSDIV8
	MOVLW HIGH LABEL_AF4
	MOVWF PCLATH
LABEL_AF4
	MOVFW SYS_TMP3
	MOVWF Z10

LABEL_AF4_EXIT
;***************************************************
;AF5
;***************************************************

	MOVFW Z10
	MOVWF SYS_TMP1
	MOVLW 10
	MOVWF SYS_TMP2
	MOVLW HIGH SYSMUL8
	MOVWF PCLATH
	CALL SYSMUL8
	MOVLW HIGH LABEL_AF5
	MOVWF PCLATH
LABEL_AF5
	MOVFW SYS_TMP3
	MOVWF S5

LABEL_AF5_EXIT
;***************************************************
;AF6
;***************************************************

	MOVFW S5
	SUBWF S4,W	; F - W -> W
	MOVWF Z1

LABEL_AF6_EXIT
;***************************************************
; Verteiler -> BV2
;***************************************************

	MOVLW 0 
	BTFSC PORTA,0	; IN0
	IORLW 1
	BTFSC PORTA,1	; IN1
	IORLW 2
	BTFSC PORTA,2	; IN2
	IORLW 4
	BTFSC PORTA,3	; IN3
	IORLW 8
	BTFSC PORTA,4	; IN4
	IORLW 16
	BTFSC PORTA,5	; IN5
	IORLW 32
	BTFSC PORTE,0	; IN6
	IORLW 64
	BTFSC PORTE,1	; IN7
	IORLW 128
	MOVWF S3	; OUT

;****************************************

	GOTO MAIN

	ORG 8175
;***************************************************
; Table -> BIN_TO_7SEG
;***************************************************

BIN_TO_7SEG

	MOVWF SYS_TMP1
	MOVLW HIGH BIN_TO_7SEG_WERTE
	MOVWF PCLATH
	MOVFW SYS_TMP1
	BCF INTCON,GIE
	ADDWF PCL,F

BIN_TO_7SEG_WERTE

	RETLW 63	; // INDEX 0
	RETLW 6	; // INDEX 1
	RETLW 91	; // INDEX 2
	RETLW 79	; // INDEX 3
	RETLW 102	; // INDEX 4
	RETLW 109	; // INDEX 5
	RETLW 125	; // INDEX 6
	RETLW 7	; // INDEX 7
	RETLW 127	; // INDEX 8
	RETLW 111	; // INDEX 9
	RETLW 63	; // INDEX 10


	END
```

Erforderlicher PIC: PIC 16F877-20P, 40 polig, Preis bei Reichelt: 6,10 Euro. 3 Stellige 7-Segment Anzeige (Multiplex)


----------



## Zottel (1 September 2005)

PIC-Code habe ich nicht drauf. Ich bezweifel aber, daß 8-bit Multiplikationen und Divisionen nötig sind. Natürlich kann der PIC das und im Sinne von wiederverwendbarem Code ist es auch ganz in Ordnung. Aber für einen Anfänger ist ein Tippfehler in der Division wahrscheinlich ein Grund zum Aufgeben. Daher hier eine einfache Art, eine Zahl zw 0 und 255 in 3 BCD-Stellen zu wandeln ohne Schleifen und Divisionsbefehle.
S7-AWL wegen der allgemeinen Verständlichkeit hier. Verfahren geht natürlich auch auf nem PIC. 
Die Variablen =H_2, =H_2...Z_1 sind Bits, vor dem Strichsteht, zu welcher Stelle sie gehören, dahinter die Wertigkeit. Alle sollen mit 0 vorgbelegt sein.



L =byte 
L 200
<I   // größer als 200 ?
SPB N200 //nein, alles klar
-I   //ja, 200 abziehen
T =byte
SET   
= =3_2  //und Bit für 2 der Hunderter-Stelle setzen
N200: NOP 0

L =byte
L 100
<I
SPB N100
-I
T =byte
SET 
= =H_1
N100: NOP 0
//
// Jetzt steht in byte nur noch eine Zahl zwischen 0 und 99
//
L =byte
L 80
<I
SPB N280
-I
T =byte
SET 
= =Z_8
N280: NOP 0

L =byte
L 40
<I
SPB N240
-I
T =byte
SET 
= =Z_4
N240: NOP 0

L =byte
L 20
<I
SPB N220
-I
T =byte
SET 
= =Z_2
N220: NOP 0

L =byte
L 10
<I
SPB N210
-I
T =byte
SET 
= =Z_1
N210: NOP 0
//
// Jetzt steht in byte nur noch eine Zahl zwischen 0 und 9. Das ist die letzte Stelle
//


----------



## Oberchefe (1 September 2005)

Ich kann kein Assembler, ich benutze deshalb Parsic um mal schnell eben was zu machen. Da brauche ich auch nicht all zu viel Wissen über die jeweilgen µC haben. Der Nachteil ist halt daß man manches etwas "anders" machen muß um zum Ziel zu kommen. Wen's interessiert, hier gibt's auch eine Demoversion:
http://www.parsic.de/

(Aber Vorsicht, nur für's Basteln zu teuer)


----------



## Ralle (2 September 2005)

@Oberchefe

Aber der C-Compiler für den PIC gefällt mit da wesentlich besser, macht auch super Code.


----------

