'Morse V0.2 26.12.2008 by dl8wig 'PortB.0 ist Ausgang zum Tasten einen Redrelais, die restlich Pins sind Eingänge und mit '10 kohm- Widerständen auf Masse gelegt. Sie werden mit +5V highaktiv geschaltet 'Achtung, da nach dem Brennen der EEPROM leer ist, wird 1. Kontrollnummer als "0" ausgegeben ! 'KN setzen oder zurücksetzen '------------------------------------------------------------------------------------------- $regfile = "attiny2313.dat" 'AT90S2313 auch möglich $crystal = 1000000 $eeprom Config Portd = Input Ddrb = &B11111110 'Pin PB0 Ausgang, rest Eingang Dim Sch As Byte Dim Scha As Byte 'Sch = PinD 0-6 , Scha = PinB 1-7 'Dim I As Integer Dim Zahl As Integer Dim Kontrnr As Integer 'Kontrollnummer Dim Zeit As Byte 'für kurz Dim Zeit_lang As Integer 'für lang Dim Zeit_sehr_lang As Integer 'für Pause zwischen Worten Dim Adr As Integer 'für EEPRomadresse Dim Einer As Integer Dim Zehner As Integer Adr = 1 'Adresse für EEPROM auf 1 setzen; hier soll die letzte Kontrollnummer gespeichert werden Zeit = 60 'Ausganszustand für Zeichen- und Pausenlänge wird hier festgelegt Zeit_lang = 180 Zeit_sehr_lang = 360 Kontrnr = 1 '***************** Main *************************************************************************** Do 'Tatenabfrage für Elbug If Pinb.1 = 1 Then 'If Pinb.2 = 1 Then 'Squeeze ' Gosub _k ' Gosub _l 'Else Gosub _k 'End If Elseif Pinb.2 = 1 Then 'If Pinb.1 = 1 Then 'Squeeze ' Gosub _l ' Gosub _k 'Else Gosub _l 'End If End If Sch = Pind 'für Pind.0-6 Select Case Sch Case 1 : Gosub Ur Gosub Rst 'Taster 1 (unten links) Gosub Dok Gosub Bk Case 2 : Gosub Ur Gosub Rst 'Taster 2 Gosub Nr Gosub Bk Case 16 : Gosub Rst Gosub Wiederhol_rst_nr Gosub Bk 'Taster 3 Case 32 : Gosub 73 'Taster 4 Case 8 : Gosub _inc 'Taster 6 'Case 4 : Gosub Bk 'Taster 7, dieser wird für Anhängen von /p verwendet Case 64 : Gosub Qrz_knr 'Taster 8 mitte mittlere Reihe End Select Scha = Pinb 'für Pinb.1-7 Select Case Scha 'Case 2 : Gosub _k 'Taster 9 Elbug (Mittlere Reihe 2.v.l.) 'Case 4 : Gosub _l 'Taster 10 Elbug (mitte links) Case 8 : Gosub Cq 'Taster 11 (oben links) Gosub Cq Gosub Cq Gosub De Gosub Rufz Gosub Rufz Gosub Pse Gosub Pause Gosub K Case 16 : Gosub Cq 'Taster 12 Gosub Test Gosub Rufz Gosub Pause Gosub K Case 32 : Gosub De 'Taster 13 Case 64 : Gosub Rufz 'Taster 14 Case 128 : Gosub _dec 'Taster 15 End Select Loop End '***************** Subroutinen für Texte ************************************************************* Cq: Gosub Pau Gosub C Gosub Q Return Test: Gosub Pause Gosub T Gosub E Gosub S Gosub T Return De: Gosub Pause Gosub D 'Doppelbelegung der Set PORTA.0 KN-Taste mit QRZ Gosub E Return Rufz: Gosub Pause Gosub D Gosub L Zahl = 8 Gosub _zahl Gosub W Gosub I Gosub G If Pind.2 = 1 Then '/p ans Call anhängen Gosub Pau Gosub _l Gosub _k Gosub _k Gosub _l Gosub _k Gosub Pause Gosub P End If Return Pse: Gosub Pause Gosub P Gosub S Gosub E Return Ur: Gosub Pau Gosub U Gosub R Return Rst: Gosub Pause Gosub R Gosub S Gosub T Gosub Pause Zahl = 5 Gosub _zahl Zahl = 9 Gosub _zahl Gosub _zahl Return Nr: Gosub Pause Gosub Kontr_nr Return Bk: Gosub Pause Gosub B Gosub K Return Wiederhol_rst_nr: Gosub Pause Gosub Wiederhol_k_nr Return Dok: Gosub Pause Gosub S Zahl = 3 Gosub _zahl Zahl = 6 Gosub _zahl Return 73: Gosub Pau Zahl = 7 Gosub _zahl Zahl = 3 Gosub _zahl Gosub Pause Gosub _k Gosub _k Gosub _k Gosub K Gosub Pause Gosub E Gosub E Return '************************ Buchstaben und Zahlen ********************************************** 'A: da hier nicht benötigt, wurde es zum Sparen des Speichers weg gelassen ' Gosub _k ' Gosub _l ' gosub pau 'Return B: Gosub _l Gosub _k Gosub _k Gosub _k Gosub Pau Return C: Gosub _l Gosub _k Gosub _l Gosub _k Gosub Pau Return D: Gosub _l Gosub _k Gosub _k Gosub Pau Return E: Gosub _k Gosub Pau Return 'F: ' Gosub _k ' Gosub _k ' Gosub _l ' Gosub _k ' gosub pau 'Return G: Gosub _l Gosub _l Gosub _k Gosub Pau Return 'H: ' Gosub _k ' Gosub _k ' Gosub _k ' Gosub _k ' gosub pau 'Return I: Gosub _k Gosub _k Gosub Pau Return 'J: ' Gosub _k ' Gosub _l ' Gosub _l ' Gosub _l ' gosub pau 'Return K: Gosub _l Gosub _k Gosub _l Gosub Pau Return L: Gosub _k Gosub _l Gosub _k Gosub _k Gosub Pau Return 'M: ' Gosub _l ' Gosub _l ' gosub pau 'Return 'N: ' Gosub _l ' Gosub _k ' Gosub Pau 'Return 'O: ' Gosub _l ' Gosub _l ' Gosub _l ' gosub pau 'Return P: Gosub _k Gosub _l Gosub _l Gosub _k Gosub Pau Return Q: Gosub _l Gosub _l Gosub _k Gosub _l Gosub Pau Return R: Gosub _k Gosub _l Gosub _k Gosub Pau Return S: Gosub _k Gosub _k Gosub _k Gosub Pau Return T: Gosub _l Gosub Pau Return U: Gosub _k Gosub _k Gosub _l Gosub Pau Return 'V: ' Gosub _k 'wegen zu wenig Speicherplatz weg rationalisiert ' Gosub _k ' Gosub _k ' Gosub _l ' gosub pau 'Return W: Gosub _k Gosub _l Gosub _l Gosub Pau Return 'X: ' Gosub _l ' Gosub _k ' Gosub _k ' Gosub _l ' Gosub Pau 'Return 'Y: ' Gosub _l ' Gosub _k ' Gosub _l ' Gosub _l ' gosub pau 'Return Z: Gosub _l Gosub _l Gosub _k Gosub _k Gosub Pau Return _zahl: Select Case Zahl Case 0 Gosub _l Gosub _l Gosub _l Gosub _l Gosub _l Gosub Pau Case 1 Gosub _k Gosub _l Gosub _l Gosub _l Gosub _l Gosub Pau Case 2 Gosub _k Gosub _k Gosub _l Gosub _l Gosub _l Gosub Pau Case 3 Gosub _k Gosub _k Gosub _k Gosub _l Gosub _l Gosub Pau Case 4 Gosub _k Gosub _k Gosub _k Gosub _k Gosub _l Gosub Pau Case 5 Gosub _k Gosub _k Gosub _k Gosub _k Gosub _k Gosub Pau Case 6 Gosub _l Gosub _k Gosub _k Gosub _k Gosub _k Gosub Pau Case 7 Gosub _l Gosub _l Gosub _k Gosub _k Gosub _k Gosub Pau Case 8 Gosub _l Gosub _l Gosub _l Gosub _k Gosub _k Gosub Pau Case 9 Gosub _l Gosub _l Gosub _l Gosub _l Gosub _k Gosub Pau End Select Return '************ Subroutine zum setzen der Kontrollnummern ***************************************** Qrz_knr: Gosub Pau Gosub Q Gosub R Gosub Z Gosub Pause Gosub _k Gosub _k Gosub _l Gosub _l Gosub _k Gosub _k Wait 2 If Pind.6 = 1 Then ' wenn Taster Mitte mittlere Reihe Nr.8 länger als 300ms gedrückt wird Gosub R Wait 2 Do ' Auswahl der Tasten am Port B If Pinb.2 = 1 Then 'links mittlere Reihe Kontrnr = 1 'Kontrollnummer zurück setzen Gosub Wiederhol_k_nr 'damit EEPROM nicht etliche male beschrieben wird Elseif Pinb.1 = 1 Then 'rechts daneben Kontrnr = Kontrnr + 1 Gosub Wiederhol_k_nr 'Waitms 200 Elseif Pinb.3 = 1 Then 'oben links Kontrnr = Kontrnr + 10 Gosub Wiederhol_k_nr 'Waitms 200 Elseif Pinb.4 = 1 Then 'neben dem oben links Kontrnr = Kontrnr + 100 Gosub Wiederhol_k_nr 'Waitms 200 'Bestätigung für erfolgreiches Speichern End If Loop Until Pind.6 = 1 'solange die Tasten abfragen bis Ta 8 wieder gedrückt wurde -> Eingabe Kontr.Nr-Menü beendet Gosub R Gosub Pause Gosub Wiederhol_k_nr Kontrnr = Kontrnr - 1 'weil er in der nähsten KN-Routine eins höch zählt - somit die eingegebene Kn ein weiter wäre Writeeeprom Kontrnr , Adr 'K-Nr. abspeichern 'Quitton End If Return ' Subroutine zum Erhöhen und Speichern der Kontrollnummer ********************************************************** Kontr_nr: 'Kontrollnummer, die im EEPROM hinterlegt wird (Stromausfall) Readeeprom Kontrnr , Adr 'letzte Kontrollnummer auslesen Kontrnr = Kontrnr + 1 Writeeeprom Kontrnr , Adr 'neue kontrollnummer speichern Wiederhol_k_nr: If Kontrnr < 10 Then Gosub T Gosub T Zahl = Kontrnr Gosub _zahl 'einstzellige zahl senden Else If Kontrnr < 100 Then 'wenn Kontrollnummer > 10 und < 100 Gosub T Zahl = Kontrnr / 10 ' Ganzzahldivision 68 : 10 = 6 Gosub _zahl Zahl = Kontrnr Mod 10 Gosub _zahl 'Rest also einstelliger Teil des Ergebnisses Else 'Komntrollnummer >=100 Zahl = Kontrnr / 100 Gosub _zahl '100-er senden Zehner = Kontrnr Mod 100 '323 : 100 = 3 Rest 23 Zahl = Zehner / 10 '23 : 10 = 2 Gosub _zahl Zahl = Zehner Mod 10 '23 : 10 = Rest 3 -> Rest senden '10-ner senden Gosub _zahl 'einer senden End If End If Return '******************* Subroutine zum Erhöhen und Verringern des Gebetempos ******************************************* _inc: 'Gebetempo erhöhen Waitms 200 'Tasten entprellen Zeit = Zeit + 3 Zeit_lang = Zeit * 3 Zeit_sehr_lang = Zeit * 6 Waitms 200 Return _dec: 'Gebetempo verringern Waitms 200 Zeit = Zeit - 3 Zeit_lang = Zeit * 3 Zeit_sehr_lang = Zeit * 6 Return '****************** Zeichen und Pausenverhältnis *************************************************************** _k: 'Punkt Portb = $01 Waitms Zeit Portb = $00 Waitms Zeit Return _l: 'Strich Portb = $01 Waitms Zeit_lang Portb = $00 Waitms Zeit Return Pau: 'kurze Pause zwischen den Zeichen Waitms Zeit_lang Return Pause: 'lange Pause zwischen Wörtern Waitms Zeit_sehr_lang Return