$NOMOD51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg51 erstellt $include(REG51.inc) ;die 8051-spezifischen Daten $list ;es wird ein Listing erstellt $title (MITTEL2_MITTEL16.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ;HARDWARE: Es muss als Device 80C51FA gewaehlt werden, damit 256 RAM vorhanden sind ;T1 --> ADC0 wird simuliert und für 2 Kanaele ab Adresse D:0x30 jeweils 16 Werte ; mit 10 Bit gespeichert. Die ADC-Werte beginnen mit 0. Bei jeder Wandlung wird der ;ADC-Wert um maximal ADD5B (Addition <5 Bit-Wert) erhoeht. ; ;T2 --> Aus Kanal 0 und Kanal 1 wird der Mittelwert gebildet und ab I:0x70 abgelegt. ; ;T3 --> Summe aller 16 Mittelwerte in R5,R4 und Mittelwert in R6,R7 ; ;Erstellt am: Montag, 29. Juni 2009 09:55:21 ;Programmiert: Juergen Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Montag, 29. Juni 2009 09:55:21 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ ADD5B EQU 28 jmp INIT ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ;ORG ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ; Programmstart bei 100H INIT: ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.1,ADC_SIM_INIT ;T1? jnb P1.2,MITTEL2_16_INIT ;T2? jnb P1.3,MITTEL_GESAMT ;T3? Zur Überpruefung jmp ABFRAGE ADC_SIM_INIT: mov R6,#0 ;Init R6 mov R7,#0 ;Init R7 mov R2,#32 ;16 Werte von Kanal 0 und 1 = 2*2*16Bytes mov R0,#30h ;Adresse MESS16: call MESSWERTE_D ;Werte in Datenspeicher schreiben erster Wert = 0 call ADC_SIM ;Werte von ADC stehen in R6 und R7 djnz R2,MESS16 ;16 gemittelte Werte a 2 Byte? jmp ABFRAGE ADC_SIM: clr C mov A,R6 ;LB R6 in Akku add A,#ADD5B ;Addition xch A,R6 ;Vertausche Inhalt vnn A und R6 xch A,R7 ;A <-> R7 addc A,#0 ;Carry addieren mov R7,A ;Jetzt stehen in R7,R6 die Werte von A/D-Wandlung ret MESSWERTE_D: mov A,R6 ;Aktueller Messwert in Akku mov @R0,A ;In Datenspeicher D: schreiben inc R0 mov A,R7 mov @R0,A inc R0 ret ;-------------------------------------------------------------------- ; Mittelwertbildung von jeweils 2 Kanälen ;-------------------------------------------------------------------- MITTEL2_16_INIT: mov R0,#30h ;Anfangs-Adresse D: Werte mov R2,#16 mov R1,#70h ;Anfangs-Adresse der 16 gemittelten Werte MITTEL2_16: call MITTEL_K0_K1 ;Summe aus Kanal 0 und 1 und Div /2 djnz R2,MITTEL2_16 jmp ABFRAGE MITTEL_K0_K1: clr C mov A,@R0 ;LB K0 in Akku inc R0 inc R0 add A,@R0 ;Addiere A+ LB K1 mov @R1,A ;LB in I inc R1 dec R0 ;Adresse HB K0 mov A,@R0 ;HB K0 in Akku inc R0 inc R0 ;Adresse HB K1 addc A,@R0 ;Addiere HB K1 + HB K2 + C inc R0 ;------ DIV durch 2--------- rrc A ;HB /2 mov @R1,A ;HB in I: dec R1 mov A,@R1 ;LB in Akku rrc A mov @R1,A ;LB in I: inc R1 inc R1 ret ;----------------------------------------------------------------------- ; MITTEL_GESAMT DIENT ZUR UEBERPRUEFUNG ;----------------------------------------------------------------------- MITTEL_GESAMT: mov R2,#16 ;16 Werte mov R0,#70h ;Anfangsadresse mov R4,#0 mov R5,#0 clr C ADD16W_LB: mov A,@R0 ;LB in Akku mov R4,A ;Ergbnis in R4 retten ADD16W_N: inc R0 inc R0 mov A,R4 ;Letze Addition holen add A,@R0 ;LB addieren mov R4,A ;LB Addition retten mov A,#0 ;Akku 0 setzen addc A,R5 ;Uebertraege aus LB clr C mov R5,A ;HB Uebertraege djnz R2,ADD16W_N ;ADDITION LB 16 * Weiter mov R0,#71h ;Adresse HB der aus 2 Kanaelen gemittelten Werte mov R2,#16 ;16 mal ADD16W_HB: add A,@R0 ;R5+HB der gemittelten Werte inc R0 inc R0 djnz R2,ADD16W_HB ;16? mov R5,A ;Ergebnis HB in R5 call DIV_D16_INI jmp ABFRAGE DIV_D16_Ini: clr C ;Vorsicht mov A,R5 ;HB Summe inAkku swap A anl A,#00001111b ;Low Nibble HB gerettet mov R7,A ;HB Summe mov A,R5 anl A,#00001111B swap A ;LN wird HN LB mov R6,A ;HN LB retten mov A,R4 ;LB holen swap A anl A,#00001111B ;LN ist in Akku add A,R6 mov R6,A ret end