; ; ********************************************** ; * ATtiny24 PCM Encoder fuer vier Kanaele * ; * Version 1 Juni 2011 * ; * (C)2011 by http://www.avr-asm-tutorial.net * ; ********************************************** ; ; Headerdatei fuer den Zielprozessor .NOLIST .INCLUDE "tn24def.inc" ; Header fuer ATtiny24 .LIST ; ; Debugging Modus ; .EQU debug = 0 ; 1: nur Debugging Modus .EQU signal = 1 ; 1: signalausgang an PB0 ; ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N E N ; ============================================ ; ; Laeuft mit den voreingestellten 1 MHz RC-Takt ; ________ ; 1 / ATtn24 |14 ; + 5 V O--|VCC GND|--O GND ; LED O--|PB0 ADC0|--O P1 ; O--|PB1 ADC1|--O P2 ; RESET O--|PB3 ADC2|--O P3 ; O--|PB2 ADC3|--O P4 ; O--|PA7 USCK|--O USCK ; MOSI/OC1A O--|PA6 PA5|--O OC1B/MISO ; 7|_________|8 ; ; ; ============================================ ; P O R T S U N D P I N S ; ============================================ ; ; P1 bis P4: ADC-Eingaenge Potis/Trimmer ; OC1A: normales Ausgangssignal ; OC1B: invertiertes Ausgangssignal ; LED: LED-Ausgang, blinkt im Takt der ADC-Abfrage ; ; ============================================ ; C O N S T A N T S T O C H A N G E ; ============================================ ; .EQU cPulse = 500 ; Pulseweite Startpuls in us .EQU cMinLen = 800 ; Mindestdauer Kanalsignal in us .EQU cMaxLen = 2200 ; Maximumdauer Kanalsignal in us .EQU cTotal = 20000 ; Gesamtdauer alle Kanaele plus Sync-Signal in us .EQU cAdc = 16 ; Anzahl der aufsummierten Messungen pro Kanal vom ADC ; muss groesser 0 und kleiner oder gleich 64 sein! ; ; ======================================================= ; F E S T E + B E R E C H N E T E K O N S T A N T E N ; ======================================================= ; .EQU fClock = 1000000 ; Prozessortakt, default .EQU cDelta = cMaxLen - cMinLen ; Max-Min Laenge Kanalsignal .EQU cMulti = ((65536*cDelta+511)/1023+cAdc/2)/cAdc ; Multiplikator fuer ADC-Werte ; ; ============================================ ; R E G I S T E R - D E F I N I T I O N E N ; ============================================ ; ; R0 benutzt fuer LPM Instruktionen ausserhalb Ints ; R1..R10 benutzt zur Multiplikation ; frei: R11..R14 .DEF rSreg = R15 ; Interrupt Status Register .DEF rmp = R16 ; Vielzweckregister ausserhalb Ints .DEF rimp = R17 ; Vielzweckregister innerhalb Ints .DEF rFlag = R18 ; Flaggenregister .equ bTxRdy = 0 ; Kopieren-Flagge fuer Transfer .equ bRxRdy = 1 ; Adc-Ergebniszeile auswerten .DEF rCopy = R19 ; Kopie eines Bytes .DEF rAdcN = R20 ; Anzahl Runden ADC-Messungen .DEF rAdcA = R21 ; ADC Addierregister ; Frei: R21..R23 ; Benutzt: R26..R27 (X) als Zeiger auf SRAM innerhalb Int ; Benutzt: R28..R29 (Y) als Zeiger fuer ADC-Werte innerhalb Int ; Benutzt: R30..R31 (Z) als Zeiger ausserhalb Ints ; ; ============================================ ; S R A M D E F I N I T I O N E N ; ============================================ ; .DSEG .ORG Sram_Start ; _______________________________________ ; |SPL|SPH|C4L|C4H|C3L|C3H|C2L|C2H|C1L|C1H| 10 Bytes ; --------------------------------------- TcB: .BYTE 10 ; Platzreservierung fuer fuenf 16-Bit-Timerwerte ; ; _______________________________________ ; |C1L|C1H|C2L|C2H|C3L|C3H|C4L|C4H|SPL|SPH| 10 Bytes ; --------------------------------------- TcBC: .BYTE 10 ; Platzreservierung fuer berechnete Timerwerte ; ; _______________________________ ; |C1L|C1H|C2L|C2H|C3L|C3H|C4L|C4H 8 Bytes ; ------------------------------- AdcRes: .BYTE 8 ; Platzreservierung fuer vier 16-bit-ADC-Werte ; ; ============================================= ; R E S E T U N D I N T - V E K T O R E N ; ============================================= ; .CSEG .ORG $0000 rjmp Main ; Reset Vektor reti ; Int0 Vektor reti ; PcInt0 Vektor reti ; PcInt1 Vektor reti ; WDT Vektor rjmp CaptInt ; TC1_CAPT Vektor reti ; TC1_COMPA Vektor reti ; TC1_COMPB Vektor reti ; TC1_OVF Vektor reti ; TC0_COMPA Vektor reti ; TC0_COMPB Vektor reti ; TC0_OVF Vektor reti ; ANA_COMP Vektor rjmp AdcInt ; ADC Vektor reti ; EE_RDY Vektor reti ; USI_STR Vektor reti ; USI_OVF Vektor ; ; ============================================ ; I N T E R R U P T S E R V I C E ; ============================================ ; ; TC1 ICR Interrupt Service Routine CaptInt: in rSreg,SREG ; sichere SREG ld rimp,-X ; lese naechsten ICR-Wert, MSB out ICR1H,rimp ; schreibe in ICR1H ld rimp,-X ; lese ICR-Wert, LSB out ICR1L,rimp ; schreibe in ICR1L cpi XL,LOW(TcB+2) ; am Tabellenanfang? brcc CaptInt1 ; nein ldi XH,HIGH(TcB+10) ; ja, beginne am Tabellenende ldi XL,LOW(TcB+10) sbr rFlag,1<