; ************************************************************** ; * Angeschlossener Taster startet Morseausgabe eines Texts * ; * (C)2005 by info@avr-asm-tutorial.net * ; ************************************************************** ; .INCLUDE "tn13def.inc" ; ; Schaltbild: ; ATMEL ATtiny13 ; ___ ____ ; ___ 1/ |_| |8 ;+5 Volt O--|___|----|Res Vcc|----O + 5 Volt ; | | ___ ; |PB3 PB2|--|___|--|<|--O + 5 Volt ; / 3| |6 _ LED ; 0 Volt O--O O--|PB4 PB1|---|_|--O + 5 Volt ; 4| | / \ ; 0 Volt O----|Gnd PB0| --- ; |__________| LSP ; ; Waehlbare Konstanten ; .EQU cSpeed = 90 ; Gebegeschwindigkeit in bpm, 5..500 bpm .EQU cTone = 1000 ; Tonhoehe in Hz, 300..8000 Hz ; ; Festgelegte Konstanten ; .EQU fClock = 1200000 .EQU cTc0Div = 8 ; ; Berechnete Konstanten ; .EQU cTc0CmpA = fClock/cTc0Div/cTone/2 .EQU cTc0CmpB = cTc0CmpA/2 .EQU cTc0N = cTone*16/cSpeed .EQU cTc0N2 = 2*cTc0N ; zweifach lange Zeit .EQU cTc0N3 = 3*cTc0N ; dreifach lange Zeit ; ; Ueberpruefen der eingestellten Werte ; .IF cTc0CmpA > 255 .ERROR "Ton zu niedrig!" .ENDIF .IF cTc0CmpA < 8 .ERROR "Ton zu hoch!" .ENDIF .IF cTc0N3 > 65535 .ERROR "Frequenz zu niedrig!" .ENDIF .IF cTc0N < 8 .ERROR "Frequenz zu hoch!" .ENDIF ; ; Register Definitionen ; .DEF rSreg = R15 ; Sicherungsregister fuer SREG in Ints .DEF rmp = R16 ; Multipurpose register .DEF rimp = R17 ; Interrupt multipurpose register .DEF rFlg = R18 ; Flaggen .EQU bAktiv = 0 ; Ausgabe ist aktiv .EQU bPKurz = 1 ; Zeichenausgabe .EQU bPLang = 2 ; Pause zwischen Zeichen .DEF rSig = R19 ; Auszugebendes Morsezeichen .DEF rLen = R20 ; Anzahl Kurz und Lang ; frei R21..R23 .DEF rCntL = R24 ; Zaehler fuer Anzahl Halbwellen NF, LSB .DEF rCntH = R25 ; dto., MSB ; ; Reset- and interrupt vectors ; .CSEG ; Assembliere in den Programm-Flash-Speicher .ORG $0000 ; beginne mit Adresse 0 ; ; Sprungvektoren fuer Reset und Interrupts ; rjmp main ; Reset vector reti ; Int0 interrupt vector rjmp IntPcInt ; PCINT0 vector reti ; TC0 overflow vector reti ; Eeprom ready vector reti ; Analog comparator int vector rjmp IntTcCmpA ; TC0 CompA vector reti ; TC0 CompB vector reti ; WDT vector reti ; ADC conversion complete vector ; ; PCINT0 Service Routine ; wird jedes Mal ausgefuehrt, wenn der Pegel am ; Pin 3 (=PB4) wechselt (Taste wurde betaetigt) ; IntPcInt: in rSreg,SREG ; sichere Flags sbic PINB,4 ; Ueberspringe naechsten Befehl wenn PB4 Null rjmp IntPcInt1 ; springe weil PB4 = Eins sbrc rFlg,bAktiv ; wenn schon aktiv: ignorieren rjmp IntPcInt1 ; ist schon aktiv ldi XH,HIGH(2*MorseText) ; Zeiger auf auszugebenden Text ldi XL,LOW(2*MorseText) ldi rCntH,0 ; Verzoegerung definieren ldi rCntL,1 cbi PORTB,2 ; LED anschalten sbr rFlg,(1< = Verkehrsende .DB 0b00110000,6 ; ? ;Zeichen 40 .. 4F .DB 0b11110000,4 ; @ = ch .DB 0b01000000,2 ; A .DB 0b10000000,4 ; B .DB 0b10100000,4 ; C .DB 0b10000000,3 ; D .DB 0b00000000,1 ; E .DB 0b00100000,4 ; F .DB 0b11000000,3 ; G .DB 0b00000000,4 ; H .DB 0b00000000,2 ; I .DB 0b01110000,4 ; J .DB 0b10100000,3 ; K .DB 0b01000000,4 ; L .DB 0b11000000,2 ; M .DB 0b10000000,2 ; N .DB 0b11100000,3 ; O ;Zeichen 50 .. 5F .DB 0b01100000,4 ; P .DB 0b11010000,4 ; Q .DB 0b01000000,3 ; R .DB 0b00000000,3 ; S .DB 0b10000000,1 ; T .DB 0b00100000,3 ; U .DB 0b00010000,4 ; V .DB 0b01100000,3 ; W .DB 0b10010000,4 ; X .DB 0b10110000,4 ; Y .DB 0b11000000,4 ; Z .DB 0b01010000,4 ; [ = Ä .DB 0b11100000,4 ; \ = Ö .DB 0b00110000,4 ; ] = Ü .DB 0b00000000,8 ; ^ = Irrung .DB 0b00110100,6 ; _ ; ; Text fuer Morseausgabe ; MorseText: ;.DB "",0 ; .DB "",0,0 ; .DB "paris paris paris paris paris paris paris paris paris paris ",0,0 .DB "",0 ; ; Ende Quellcode ;