?? enc_t15.asm
字號:
; ***************************************************************
; * Copyright by mad.dax@t-online.de *
; * DCC-Encoder Fahrstufe 0 Testversion *
; * Version: 10.04 *
; * noch ungetestet ( keine Zeit ) *
; ***************************************************************
;
; Hardware Anforderungen:
;
; Standard Belegung
;
; Tiny 15 PDIP/SOIC
;
;(RESET/ADC0) PB5 = 1 8 = VCC
;(ADC3) PB4 = 2 7 = PB2 (ADC1/SCK/T0/INT0)
;(ADC2) PB3 = 3 6 = PB1 (AIN1/MISO/OC1A)
; GND = 4 5 = PB0 (AIN0/AREF/MOSI)
;
; DCC Encoder
;
;RESET PB5 = 1 8 = VCC
; PB4 = 2 7 = PB2
; PB3 = 3 6 = PB1
; GND = 4 5 = PB0 DCC Ausgang
;111111111111111 0 00000001 0 01001111 0 01001110 1
;111111111111111 0 00000001 0 10001111 0 10001110 1
; Software Funktionen:
;
.NOLIST
.INCLUDE "tn15def.inc"
;
; Konstanten FlagReg
;
.equ BitWert = 3 ;BitWert f黵 zu sendendes Bit
.equ BitSendt = 2 ;Bit gesendet
.equ BitRepeat =1 ;Wiederhole ( f黵 BitWert = 0 )
.equ BitHalf =0 ;Bith鋖fte ( erste H鋖fte = 1 )
.equ OutTime = 255 - 46 ; High/Low-Signal Periodendauer = 29 us ohne Precaler
.equ EEOSCCAL = 5 ; Speicherplatz OSCCAL im EEPROM
;
; Benutzte Register
;
.def TEMPS = R16 ;SREG Sicherungsregister
.def TEMPI = R17 ;TEMP Register f黵 Initialisierung und Interupt-Schmierregister
.def TEMP1 = R18 ;TEMP Register f黵 Hauptprogramm und Initialisierung
.def TEMP2 = R19 ;TEMP Register f黵 Hauptprogramm
.def TEMP3 = R20 ;TEMP Register f黵 Hauptprogramm
;def FREI = R21
;def FREI = R22
.def FlagReg = R23 ;Flag Register
.def BitCNT = R26 ;Bitz鋒ler f黵 Datenhandling
;def FREI = R28
;def FREI = R29
;def Reserviert = R30
;def Reserviert = R31
;
;
; Code beginnt hier
;
.CSEG
.ORG $0000
;
; Reset- und Interrupt-Vektoren
rjmp RESET ; Reset handler
reti ;EXT_INT0 ; IRQ0 handler
reti ;PIN_CHANGE ; Pin change handler
reti ;TIM1_CMP ; Timer1 compare match
reti ;TIM1_OVF ; Timer1 overflow handler
rjmp TIM0_OVF ; Timer0 overflow handler
reti ;EE_RDY ; EEPROM Ready handler
reti ;ANA_COMP ; Analog Comparator handler
reti ;ADC ; ADC Conversion Handler
;
;
; **************** Ende der Interrupt Service Routinen *********************
;
;
readEEPROM:
sbic EECR, EEWE ; wird noch geschrieben ?
rjmp PC-1 ; Schleife
out EEAR, TEMP1 ; Erfasse EEProm-Leseadresse
sbi EECR, EERE ; Setze EEProm-Lesebefehl
in TEMP2, EEDR ; Lese EEprom-Daten
ret ; R點ksprung
TIM0_OVF:
in TEMPS,SREG ; SREG sichern
sbrc Flagreg, BitHalf ; wenn erste H鋖fte fertig
rjmp BitLo ; springe zur zweiten H鋖fte
sbi PORTB, PB0 ; setze DCC-Ausgang
sbrc Flagreg, BitRepeat ; wenn Hi Wiederholt
rjmp HiOK ; dann OK
sbrs Flagreg, BitWert ; wenn neues Bit=0
rjmp HiEnd
HiOK: sbr Flagreg, (1<<BitHalf) ; setze erste H鋖fte fertig
cbr Flagreg, (1<<BitRepeat) ; r點ksetze Wiederholen
out SREG,TEMPS ; SREG r點ksichern
reti ; R點ksprung und Interupts wieder einschalten
HiEnd: sbr Flagreg, (1<<BitRepeat) ;setze Wiederholen
out SREG,TEMPS ; SREG r點ksichern
reti ; R點ksprung und Interupts wieder einschalten
BitLo: cbi PORTB, PB0 ; l鰏che DCC-Ausgang
sbrc Flagreg, BitRepeat ; wenn Lo Wiederholt
rjmp LoOK ; dann OK
sbrs Flagreg, BitWert ; wenn neues Bit=0
rjmp HiEnd
LoOK: cbr Flagreg, (1<<BitHalf) ; l鰏che erste H鋖fte fertig
cbr Flagreg, (1<<BitRepeat) ; r點ksetze Wiederholen
sbr Flagreg, (1<<BitSendt) ; setze Bit gesendet
out SREG,TEMPS ; SREG r點ksichern
reti ; R點ksprung und Interupts wieder einschalten
LoEnd: sbr Flagreg, (1<<BitRepeat) ;setze Wiederholen
out SREG,TEMPS ; SREG r點ksichern
reti ; R點ksprung und Interupts wieder einschalten
RESET: ; Programm Kaltstart
ldi TEMPI,0b01000011 ;Interupt auf Rise-Flanke, Pull-Up Disabble
out MCUCR,TEMPI
ldi TEMPI,0b00000010 ;Timer 0 Overflow enable
out TIMSK,TEMPI
ldi TEMPI,0b00000001 ;PB0 als Ausgang, PB1/2/3/4/5 als Eingang
out DDRB,TEMPI
ldi TEMP1, EEOSCCAL ;hole Oszillator Calibrierung
rcall readEEProm
out OSCCAL, Temp2
ldi TEMPI, OutTime ; lade das Timer/Counter0
out TCNT0,TEMPI ; mit der Zeit fuer HalfPeriod
ldi TEMPI,0b00000001 ; 0 0 0 Stop, the Timer/Counter0 is stopped.
out TCCR0,TEMPI ; 0 0 1 CK
; 0 1 0 CK/8
; 0 1 1 CK/64
; 1 0 0 CK/256
; 1 0 1 CK/1024
; 1 1 0 External Pin T0, falling edge
; 1 1 1 External Pin T0, rising edge
; bereinige alle ben鰐igten Register
clr TEMPS
clr TEMPI
clr TEMP1
clr TEMP2
clr TEMP3
sei ; aktiviere alle gesetzten Interupts
Main: ;hier beginnt das Hauptprogramm
; sende Pr鋋mbel nach NMRA-DCC
clr BitCnt ; l鰏che Z鋒ler
sbr Flagreg, (1<<BitWert) ; Sende "1"
PREAMBLE: sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
inc BitCnt ;
cpi BitCnt, 15 ; wenn Bitz鋒ler kleiner 15
brlo PREAMBLE ; Schleife
; sende Trenn-Bit 0 nach NMRA-DCC
cbr Flagreg, (1<<BitWert) ; Sende "0"
sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
; sende Broadcast nach NMRA-DCC
clr BitCnt ; l鰏che Z鋒ler
ldi TEMP1, 0b00000000 ; lade Temp mit Wert f黵 Broadcast
Broadcast:lsl TEMP1 ; schiebe Temp nach links ins Carry
cbr Flagreg, (1<<BitWert) ; Sende "0"
brcc SendBroad ; springe wenn Carry clear
sbr Flagreg, (1<<BitWert) ; Sende "1"
SendBroad:sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
inc BitCnt ;
cpi BitCnt, 8 ; wenn Bitz鋒ler kleiner 8
brlo Broadcast ; Schleife
; sende Trenn-Bit 0 nach NMRA-DCC
cbr Flagreg, (1<<BitWert) ; Sende "0"
sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
; sende Speed 0 nach NMRA-DCC
clr BitCnt ; l鰏che Z鋒ler
ldi TEMP1, 0b01000000 ; lade Temp mit Wert f黵 Speed 0
Speed: lsl TEMP1 ; schiebe Temp nach links ins Carry
cbr Flagreg, (1<<BitWert) ; Sende "0"
brcc SendSPD ; springe wenn Carry clear
sbr Flagreg, (1<<BitWert) ; Sende "1"
SendSPD: sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
inc BitCnt ;
cpi BitCnt, 8 ; wenn Bitz鋒ler kleiner 8
brlo Speed ; Schleife
; sende Trenn-Bit 0 nach NMRA-DCC
cbr Flagreg, (1<<BitWert) ; Sende "0"
sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
ldi TEMP2, 0b00000000 ; Broadcast
ldi TEMP1, 0b01000000 ; lade Temp mit Wert f黵 Speed 0
eor TEMP1, TEMP2 ; XOR
; sende XOR nach NMRA-DCC
clr BitCnt ; l鰏che Z鋒ler
XOR: lsl TEMP1 ; schiebe Temp nach links ins Carry
cbr Flagreg, (1<<BitWert) ; Sende "0"
brcc SendXOR ; springe wenn Carry clear
sbr Flagreg, BitWert ; Sende "1"
SendXOR: sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
inc BitCnt ;
cpi BitCnt, 8 ; wenn Bitz鋒ler kleiner 8
brlo XOR ; Schleife
; sende Ende-Bit 1 nach NMRA-DCC
sbr Flagreg, (1<<BitWert) ; Sende "1"
sbrs FlagReg, BitSendt; wenn kein neues Bit dann
rjmp PC-1 ; Schleife
cbr FlagReg,(1<<BitSendt); l鰏che indikator f黵 neues Bit
rjmp MAIN ; Endlosschleife
;** hier beginnt das EEProm **
.ESEG
.ORG $0000
.db 0x00, 0x00 ; X und X
.db 0x00, 0x00 ; X und X
.db 0x00, 0x71 ; X und OSCCAL
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -