; ; ***************************** ; * 2m Mini Fuchsjagd Sender * ; ***************************** ; ; Code für Foxoring-Sender-Steuerung, Version für ATtiny13 ; ; Created 29.10.2006 ; Version 0.0: Code-Import von FJTX V 0.7 ; Neue Funktionen implementiert: ; Dauerläufer, 800 Hz Mod, Kennung ME..M5 ; 1.11.06 0.1: TX On über PB4, Modulation (VariCap) über PB3 ; 3.11.06 0.2: Unterschiedliche NF-Frequenz pro Fuchs ; 1, 1,07 0,3: Auf AVRStudio4 umgestellt (für ATtiny13) ; Auf ATtiny13 umgestellt (Clock, Interrupts, Registernamen, Stack, PB3/4) ; PB0..2 (Pin5,6,7) wählen Kennung ; ; ; Kennungswahl PB 2 1 0 NFOX Kennung ; ------------ Pin 7 6 5 ; 1 1 1 3 M S ; ----------------- 1 1 0 7 Dauerstrich für Abgleich ; |0 = Brücke -> Gnd| 1 0 1 2 M I ; |1 = Offen | 1 0 0 6 Dauerstrich mit Modulation ; ----------------- 0 1 1 1 M E ; 0 1 0 5 M 5 ; 0 0 1 0 M ; 0 0 0 4 M H ; ; Die Basiskennung MS ergibt sich, wenn Pin2..7 offen sind ; ; Zum Abgleich Pin 5 mit Masse verbinden, Sender auf maximalen Output einstellen ; ; Für freie Kennungswahl einen 3 poligen DIL-Schalter oder 3 Steckbrücken an Pin 5-7 ; ; Die kennungsabhängige Modulationsfrequenz ist 9,4 kHz / (12 - NFOX) ; ; ;***** Specify Device .device ATtiny13 ; ;***** I/O Register Definitions .equ SREG = 0x3f .equ SPL = 0x3d .equ GIMSK = 0x3b .equ GIFR = 0x3a .equ TIMSK0 = 0x39 .equ TIFR0 = 0x38 .equ SPMCSR = 0x37 .equ OCR0A = 0x36 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ TCCR0B = 0x33 .equ TCNT0 = 0x32 .equ OSCCAL = 0x31 .equ TCCR0A = 0x2f .equ DWDR = 0x2e .equ OCR0B = 0x29 .equ GTCCR = 0x28 .equ CLKPR = 0x26 .equ WDTCR = 0x21 .equ EEAR = 0x1e .equ EEDR = 0x1d .equ EECR = 0x1c .equ PORTB = 0x18 .equ DDRB = 0x17 .equ PINB = 0x16 .equ PCMSK = 0x15 .equ DIDR0 = 0x14 .equ ACSR = 0x08 .equ ADMUX = 0x07 .equ ADCSRA = 0x06 .equ ADCH = 0x05 .equ ADCL = 0x04 .equ ADCSRB = 0x03 ; .equ RAMBEG = 0x0060 .equ RAMEND = 0x009f .equ E2END = 0x03f ; Last EEPROM Location .equ FLASHEND= 0x01ff ; Last FLASH Location ; .def XL = R26 .def XH = R27 .def YL = R28 .def YH = R29 .def ZL = R30 .def ZH = R31 ; ;**** Variables (in Registers, no RAM used) ; .DEF SRSAVE =R1 ; Status-Register Save während Interrupt .DEF DEL1 =R2 ; Used by Delay Routines .DEF DEL2 =R3 ; R16..R19 used as work registers .DEF NFOX =R21 ; Fuchs-Nummer 0..7 .DEF TXON =R22 ; 1 = TX On, 0 = Off .DEF IWRK =R23 ; Interrupt Work Register .DEF TIK2K =R24 ; Zaehlt alle 2 kHz hoch .DEF DELTIM =R25 ; Delay Time ; ; ;**** Code starts here ***************************************************** ; .CSEG .ORG 0 ; ;++++ Interrupt Vectors RJMP START ; 0 Reset RJMP START ; 1 External 0 RJMP START ; 2 Pin Change RJMP TIMER ; 3 Timer 0 Overflow RJMP START ; 4 EEProm Ready RJMP START ; 5 Analog Comparator RJMP START ; 6 Timer Compare A RJMP START ; 7 Timer Compare B RJMP START ; 8 Watchdog RJMP START ; 9 A/D Converter ; ;**** Initialisation ********************************************************* ; START: ;++++ Load Stack Pointer ldi R16,LOW(RAMEND) out SPL,R16 ; Set stack pointer to end of RAM ; ;++++ Initialize Port B Bit 4 as Output (Modulation) ; Bit 3 as Output (Low = TX On) ; All others as Input with Pull-Up ldi R16,$18 out DDRB,R16 ldi R16,$3F out PORTB,R16 ; ;++++ Intialize Timer/Counter 0 as 2000 Hz Timing Interrupt ; (1,2 Mhz/64/9) ldi R16,$03 ; Set Clock Divider to 64 out TCCR0B,R16 ldi R16,$02 out TIMSK0,R16 ; Enable Counter 0 Overflow Interrupt ; ldi R25,50 ; Wait a little rcall DELXMS ; ; ++++ Initialize some Variables ----------------------------------- ; clr TIK2K clr TXON ; ; ++++ Start Interrupt Handler ------------------------------------- ; sei ; Global Interrupt enable ; ;**** Main Loop **************************************************** ; ; ++++ Fuchsnummer von PortB einlesen MAIN: in NFOX,PINB ; PortB Bit 0..2 einlesen andi NFOX,$07 clc ror NFOX ; Bit 0>Carry, 1>0, 2>1 brcs MAIN1 ; -Carry > Bit 2 sbr NFOX,4 MAIN1: ; ; ++++ Send M+e..5 ldi R19,16 ; Stringlänge in Bits add R19,NFOX add R19,NFOX ; ldi DELTIM,80 ; 80 ms pro Punkt, etwa 60 BpM ldi R16,0b00000001 ; m rcall CW8BIT ldi R16,0b11011100 ; rcall CW8BIT ldi R16,0b01010101 ; e..5 rcall CW8BIT ldi R16,0b01010101 ; rcall CW8BIT ; rjmp MAIN ; Repeat ; ;**** Subroutines ******************************************************* ; ; ++ Send 8 Bit in R16 as CW Signal, MSb first ; DELTIM ist Punktdauer in ms CW8BIT: ldi R17,8 ; Loop-Counter ; CW8B1: dec R19 ; Solange Bit-Counter nicht negativ: brmi CW8B2 clr R18 ; TX On setzen bzw löschen sbrc R16,7 ldi R18,1 mov TXON,R18 rcall DELXMS CW8B2: rol R16 ; Nächstes Bit in MSB Position dec R17 brne CW8B1 ret ; ; ;**** Delay-Subroutine ************************************************ ; ; ++++ Delay x ms, x in R25 (x * 256 * 5 Cycle / 1,2 MHz) DELXMS: mov DEL1,DELTIM DXMS: CLR DEL2 D1MS: INC DEL2 ; 5 cycle inner loop NOP NOP BRNE D1MS ; " " " " DEC DEL1 BRNE DXMS RET ; ; *************************************** ; ******* +/- 2000 Hz Timer Interrupt Handler ******************************* ; *************************************** ; TIMER: in SRSAVE,SREG ; Save Statusreg ; ; ; ++ Set Clock-Divider again for next interrupt ; ldi IWRK,256-12 ; Set Counter for desired frequency add IWRK,NFOX ; 256 - (9,375 kHz / Fsoll) out TCNT0,IWRK ; F1: 850 Hz .. F5: 1350 Hz ; ; ++ TX-Output Service (PORTB 3,4) ; cpi NFOX,7 ; If NFOX = 7 breq TIM0TM ; .. then Tuneup-Mode, no Mod cpi NFOX,6 ; If NFOX = 6 breq TIM0 ; .. then Tuneup-Mode, with Mod ; tst TXON brne TIM0 ; If TX Flag Off sbi PORTB,3 ; .. then TX Off cbi PORTB,4 rjmp TIM1 ; TIM0: cbi PORTB,3 ; .. else TX On sbrs TIK2K,0 ; .... and +/- 1000 Hz Modulation cbi PORTB,4 sbrc TIK2K,0 sbi PORTB,4 rjmp TIM1 ; TIM0TM: cbi PORTB,3 ; Tuneup-Mode: TX On, Mod Off sbi PORTB,4 rjmp TIM1 ; ; ++ 2k Service ; TIM1: inc TIK2K ; Increment 2 kHz Timer ; ; ++ Conclusion of Interrupt Service ; TIM99: cli ; No interrupts during conclusion out SREG,SRSAVE reti ; Interrupt-Handling beendet ;