$nomod51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(reg535.pdf) ;die 80535-spezifischen Daten $list ;es wird ein Listing erstellt $title (AD50_256_2.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: AD50_256_2 ;Wandelt 512 Werte, mittelt jeweils 2 Werte vom A/D-Wandler und schreibt ;ab 2000h bis 20FFh den Mittelwert ; ; ; ;Erstellt am: Dienstag, 14. November 2006 13:25:11 ;Programmiert: Gerd Kaiser & Maxime Leclercq ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Montag, 20. November 2006 13:25:11 ; ; CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ;ORG Org 2BH ;Programmspeicher auf 2BH, Timer 2 Interrupt clr TF2 ;Bestätigt den Interrupt call ISR_TIMER_2 ;AD Wandlung aufrufen RETI ;RETurn form Interrupt-> geh da wieder raus Org 43h clr IADC ;Bestätigen des AD-Wandler Interrupts call ISR_AD ;Uebernehmen aufrufen reti ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: setb EAL ;Interrupt generell freigeben setb ET2 ;Timer 2 Überlauf freigeben mov CRCH,#3Ch ;Initialisierung von 50 ms mov CRCL,#0B0h ;65536µs - 50ms = 15536µs mov TH2,#3Ch ;Timer urspünglich auf den Anfangswert mov TL2,#0B0h ;(Lowbyte) ;AD-Wandlung setb EADC ;AD-Interrupt freigeben mov ADCON,#10000000b ;AD initialisieren mov R2,#0 ;Zählvariable initialisieren mov DPTR,#2000h ;Datapointer initialisieren ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.1,START_TIMER ;T1-> Dann gehts los jmp ABFRAGE START_TIMER: setb T2I0 ;Timer kann zählen, mit 1MHz laufen lassen clr T2PS ;Zusatz, muss nicht unbedingt sein setb T2R1 ;Timer 2 Anfangswert laden setb P1.1 ;Bit setzen, sonst springt er von Abfrage ;immer zu Start jmp ABFRAGE ISR_TIMER_2: mov DAPR,#0 ;AD-Wandlung auswählen ret ISR_AD: jnb MX0,AN0 ;Ist es Kanal 0? Falls ja, springe zu AN0 ;AN1 mov R1,ADDAT ;Es ist nicht Kanal 0 -> es muss Kanal 1 sein clr MX0 ;AD-Wandler auf Kanal 0 stellen mov A,R0 ;A=R0 add A,R1 ;R1+A rrc A ;A/2 movx @DPTR,A ;Akku speichern inc DPTR ;datapointer eins weiter zählen djnz R2,ARRR ;eigentlich will ich ret machen, dies geht aber nicht clr T2I0 ;Timer2 aus mov DPTR,#2000h ;Datapointer auf anfangsadresse ret ARRR: ret AN0: mov R0,ADDAT setb MX0 jmp ISR_TIMER_2 end