;************************************************************************************ ;* DVM (Digitales Voltmeter) * ;* ------------------------- * ;* * ;* Hardware: Portview-Modul mit AT-Mega8 http://www.avr-projekte.de/portview.htm * ;* Version vom 18.07.2011 * ;* * ;* Autor: J.Woetzel / juergen@avr-projekte.de * ;************************************************************************************ #include "m8def.inc" ;--------------------------------------------------------------------------------------------------- ;Konstanten für die Berechnung der Anzeige bei 1023 am ADC Ausgang ;für die 4 möglichen Jumperstellungen ;--------------------------------------------------------------------------------------------------- ;Endausschlag ;------------ ;Durch ändern der Formel z.B. "faktor1 =123*$10000/1024", zeigt das Display bei 5V ;am ADC Eingang 12.3 V an. ;(DP der Anzeige vor der letzten Stelle, Jumper offen) ;Ein passender Spannungsteiler muss vorgeschaltet werden .equ faktor1 = 322*$10000/1024 ;Jumper offen .equ faktor2 = 200*$10000/1024 ;200= Anzeige bei +5V am Analogeingang. Spannungsteiler 4:1 .equ faktor3 = 300*$10000/1024 ;300, Spannungsteiler 6:1 .equ faktor4 = 400*$10000/1024 ;400, Spannungsteiler 8:1 ;Danach wird wieder durch $10000 geteilt (die unteren 16Bit der Multiplikation verworfen) ;--------------------------------------------------------------------------------------------------- ;Nullabgleich ;------------ .equ offset = 3 ;Wird zum ausgelesenen ADC-Wert addiert. Der Offset wird so gewählt, das ;wenn der ADC-Eingang mit GND verbunden wird, die Anzeige gerade noch 00,0 anzeigt. ;Dadurch kann sich der Endausschlag um 0,1V nach oben verschieben, sodas man diesen nachbessern muss. ;--------------------------------------------------------------------------------------------------- ;Referenzspannung ;---------------- ;Bei z.B. vref=5V müssen am Spannungsteiler 5V Abfallen damit der Endausschlag angezeigt wird. ;Einen der beiden Werte Auskommentieren. ;.equ vref = 1<= 10 ... rol temp4 rol temp1 ;Rest cpi temp1,10 brcs div102 ;Wenn der Rest <10 ist, 0-Bit (LSL oben) im Ergebniss stehen lassen inc temp3 ;Ansonsten im Ergebniss Bit0=1 ... subi temp1,10 ;.. und 10 vom Rest abziehen div102: dec temp2 ;das ganze 8 mal brne div101 ;----------------------------------------- ;Ende Division ;Aus dem Rest, den 7-Segmentcode ermitteln ;----------------------------------------- seg7: ldi zl,low(segtab*2) ;Z auf 7-Segmenttab. ldi zh,high(segtab*2) add zl,temp1 ;+ Rest adc zh,null ;Carry dazu ret ;********************************************************************************************** ;Ende Code ;********************************************************************************************** ;Segment | Portpin ;----------------------------------------------------------------------------------------------- ; a 6 |-a-| Die 7 Segmenttabelle (a..g) ist dem Layout angepasst ; b 5 f b Durch den gemeinsamen Anodenanschluss, ist eine Null am Port nötig ; c 4 |-g-| damit ein Segment leuchtet ; d 3 e c ; e 2 |-d-| ; f 1 ; g 0 ;------------------------------------------------------------------- ;Die Zeichen 0..F als 7Segmentcode segtab: .db $81, $CF,\ $92, $86,\ $CC, $A4,\ $A0, $8F,\ $80, $84,\ $88, $E0,\ $B1, $C2,\ $B0, $B8 blank: .db $FF,0 ;Leerzeichen