;*************************************************************************** ;* ; Auswertung Drehimpulsgeber ;* ; Nur Halbschritte werden berücksichtigt ;* ;* Controller-Typ: ATtiny2313 ;* Taktfrequenz: 16 MHz ;* ;* ;* Autor: Steffen Hörhold ;* Date: 16.07.2005 ;* Version: 1.0 ;* Chip ID: ;* ;*************************************************************************** .include "tn2313def.inc" ;***** Register-Variablen ;.def Name = r0 ; Erläuterung ;.def Name = r1 ; Erläuterung ;.def Name = r2 ; Erläuterung ;.def Name = r3 ; Erläuterung ;.def Name = r4 ; Erläuterung ;.def Name = r5 ; Erläuterung ;.def Name = r6 ; Erläuterung ;.def Name = r7 ; Erläuterung ;.def Name = r8 ; Erläuterung ;.def Name = r9 ; Erläuterung ;.def Name = r10 ; Erläuterung ;.def Name = r11 ; Erläuterung ;.def Name = r12 ; Erläuterung ;.def Name = r13 ; Erläuterung ;.def Name = r14 ; Erläuterung ;.def Name = r15 ; Erläuterung ;- Register für ldi, sbr, cbr Befehle - .def accu1 = r16 ; Arbeitsregister 1 .def accu2 = r17 ; Arbeitsregister 2 .def accu3 = r18 ; Arbeitsregister 3 .def accu4 = r19 ; Arbeitsregister 4 ;.def Name = r20 ; Arbeitsregister 5 ;.def Name = r21 ; Erläuterung .def count = r22 ; Erläuterung ;.def Tast = r23 ; Erläuterung .def Flag = r24 ; Erläuterung ;.def Name = r25 ; Erläuterung ;- ACHTUNG! Pointer Register - ;.def Name = r26 ; (XL) Erläuterung ;.def Name = r27 ; (XH) Erläuterung ;.def Name = r28 ; (YL) Erläuterung ;.def Name = r29 ; (YH) Erläuterung ;.def Name = r30 ; (ZL) Erläuterung ;.def Name = r31 ; (ZH) Erläuterung .equ Time_T1 = 1023 ; Abtastung: 1ms .equ Test_CNT_MAX = 20 ; Test der max-Begrenzung des Zählers .equ neu_ms = 0 .equ GEBER_PIN = PIND .dseg STAT_DGB: .BYTE 1 ; Status Drehgeber CNT_DGB: .BYTE 2 ; 16Bit Count Halbschritt Drehgeber (Low|High Byte) CNT_DGB_V: .BYTE 2 ; 16Bit Count Vollschritt Drehgeber (Low|High Byte) CNT_DGB_MAX: .BYTE 2 ; maximaler Zählumfang von CNT_DGB (Low|High Byte) .cseg ;Beginn eines Code-Segmentes .org $000 ;Startadresse=0 rjmp MCU_RESTART ; Reset Handler reti ;rjmp EXT_INT0 ; IRQ0 Handler reti ;rjmp EXT_INT1 ; IRQ1 Handler reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler rjmp TIM1_COMPA ; Timer1 CompareA Handler reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler reti ;rjmp USART_RXC ; USART RX Complete Handler reti ;rjmp USART_UDRE ; UDR Empty Handler reti ;rjmp USART_TXC ; USART TX Complete Handler reti ;rjmp ANA_COMP ; Analog Comparator Handler reti ;rjmp PCINT ; Pin Change Interrupt Handler reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler reti ;rjmp TIM0_COMPA ; Timer0 CompareA Handler reti ;rjmp TIM0_COMPB ; Timer0 CompareB Handler reti ;rjmp USI_START ; USI Start Condition Handler reti ;rjmp USI_OVERFLOW ; USI Overflow Handler reti ;rjmp EE_RDY ; EEPROM Ready Handler reti ;rjmp WDT_OVERFLOW ; Watchdog Timer Overflow Handler ;**************************************************************************** .org $013 ; Programm Code follows from here MCU_RESTART: ;STACK initialisieren ldi accu1, low(RAMEND) ; Stackpointer initialisieren out SPL, accu1 ; muss in jedes Programm ; als erstes mit eingebunden werden ;***** Ports definieren ***** ; ________PORTA________ ; Konfiguration:EEEEEEEE 0=E= Eingang / 1=A=Ausgang / X=NC=Not Connect ; Bits von PortA:XXXXX210 ldi accu1, 0b00000000 ; Lade accu1 mit Binärzahl 0b......... out DDRA, accu1 ; Alle Bit´s von PortA sind EINGÄNGE ldi accu1, 0b00000000 ; Alle Eingänge ohne PullUp out PORTA, accu1 ; ________PORTB________ ; Konfiguration:AAAAAAAA 0=E= Eingang / 1=A=Ausgang ; Bits von PortB:76543210 ldi accu1, 0b11111111 ; Lade accu1 mit Binärzahl 0b......... out DDRB, accu1 ; Alle Bit´s von PortB sind EINGÄNGE ldi accu1, 0b00000000 ; Alle Eingänge ohne PullUp out PORTB, accu1 ; ; ________PORTD________ ; Konfiguration:AAAAAAAA 0=E= Eingang / 1=A=Ausgang / X=NC=Not Connect ; Bits von PortD:X6543210 ldi accu1, 0b00000000 ; Lade accu1 mit Binärzahl 0b......... out DDRD, accu1 ; Alle Bit´s von PortD sind EINGÄNGE ldi accu1, 0b00000000 ; Alle Eingänge ohne PullUp out PORTD, accu1 ; sei ;ldi count, 1 rcall Init_Timer1 rcall Init_RAM lds accu1, CNT_DGB clr accu1 sts CNT_DGB, accu1 ; CNT_DGB lowByte löschen sts CNT_DGB +1, accu1 ; CNT_DGB highByte löschen ldi accu1, low(Test_CNT_MAX) sts CNT_DGB_MAX, accu1 ; Zählerbegrenzung: lowBYTE laden ldi accu1, high(Test_CNT_MAX) sts CNT_DGB_MAX +1, accu1 ; Zählerbegrenzung: highBYTE laden Programm_XXX: lds accu1, CNT_DGB_V out PORTB, accu1 sbrc Flag, neu_ms rcall drehgeber rjmp Programm_XXX drehgeber: ;Drehgeber-Entprellung und -Abfrage cbr Flag,1<