'----------------------------------------------------------------------------- '----------------------------------------------------------------------------- ' Project: Morsethermometer '----------------------------------------------------------------------------- '----------------------------------------------------------------------------- ' Copyright: Sander electronic, 10245 Berlin ' Entwickler: Sander electronic, 10245 Berlin ' www.sander-electronic.de ' info@sander-electronic.de ' ' Document: ' File: morse.BAS ' Release: 1.1.02 ' History: ' 22.1.2006 Version 1.0.0 ' 26.2.2006 ohne Interrupt ' 17.3.2006 DS18B20 ' 09.4.2006 Zeichen für 0 korrigiert ' Fuse auf 1 Mhz intern setzen ' ------ Controller ------------- $crystal = 1000000 $regfile = "m8def.dat" ' ------ Configuration----------- ' Portrichtung 0 = Eingang, 1 = Ausgang Ddrb = &B11111111 Ddrc = &B11111111 Ddrd = &B00000000 ' ------ Aliases ---------------- Led_pin Alias Portc.0 Ptt_pin Alias Portc.5 ' ------ Constants -------------- Const Basetime = 10 ' Grundtakt für Morsezeichen ' Basetime * Faktor = Punktzeit Const Reload = 4000 ' bestimmt Schlafzeit ' ------ Variables -------------- Dim Morse As Byte ' Morsezeichen Dim Sendetext As String * 40 ' Sendetext Dim Akt_zeichen As String * 1 ' aktuelles Zeichen Dim Zeichen As Byte Dim Len_text As Byte ' Länge Sendetext Dim Tx_time As Word Dim Faktor As Byte ' verlängert Morsezeitbasis Dim Morse_rdy As Bit Dim I As Byte ' DS18B20 Dim Scr(9) As Byte ' Scratchpad Dim Ttemperatur As Integer Dim Tempsign As String * 1 ' Vorzeichen Dim Strtemp As String * 4 ' Temperatur als String ' ------------------------------------------------------------------------------ ' ------ Program --------------- ' ------------------------------- Progstart: ' ------ Initialisierung -------- Led_pin = 1 Ptt_pin = 1 Portd = &HFF ' Pullup einschalten Faktor = 7 ' Faktor bestimmt Zeit If Pind.0 = 0 Then Faktor = 50 If Pind.1 = 0 Then Faktor = 40 If Pind.2 = 0 Then Faktor = 35 If Pind.3 = 0 Then Faktor = 30 If Pind.4 = 0 Then Faktor = 25 If Pind.5 = 0 Then Faktor = 20 If Pind.6 = 0 Then Faktor = 15 If Pind.7 = 0 Then Faktor = 10 Config 1wire = Portc.4 ' Temperatursensor Config Timer1 = Timer , Prescale = 1024 ' bestimmt Schlafzeit On Ovf1 Tim1_isr Load Timer1 , Reload ' bestimmt Schlafzeit ' mit Reload und Prescaler Disable Timer1 ' ergeben sich ca. 4 Sekunden Enable Interrupts ' Programmschleife Do Gosub Readtemperatur ' Temperatur vom Sensor holen Sendetext = Strtemp ' jetzt als Sendestring Sendetext = Sendetext + " Grad C" Gosub Sende_morse ' Pausenzusatnd zum Strom sparen Load Timer1 , Reload Enable Timer1 Idle ' jetzt Schlafmodus Disable Timer1 Loop End ' ------------------------------------------------------------------------------ Sende_morse: Len_text = Len(sendetext) 'Zeichenzahl ermitteln For I = 1 To Len_text Akt_zeichen = Mid(sendetext , I , 1) ' ein Zeichen holen Akt_zeichen = Ucase(akt_zeichen) ' in Großbuchstaben wandeln Zeichen = Asc(akt_zeichen) ' und jetzt ASCII-Wert If Zeichen = &H20 Then ' wenn Leerzeichen, dann Gosub Sende_pause7 ' Pause senden Else ' sonst Gosub Morsecode ' Morsezeichen End If Next I Return ' ------------------------------- Morsecode: ' Zeichen aus Tabelle holen Select Case Zeichen Case 48 : Restore Mo_0 Case 49 : Restore Mo_1 Case 50 : Restore Mo_2 Case 51 : Restore Mo_3 Case 52 : Restore Mo_4 Case 53 : Restore Mo_5 Case 54 : Restore Mo_6 Case 55 : Restore Mo_7 Case 56 : Restore Mo_8 Case 57 : Restore Mo_9 Case 65 : Restore Mo_a Case 66 : Restore Mo_b Case 67 : Restore Mo_c Case 68 : Restore Mo_d Case 69 : Restore Mo_e Case 70 : Restore Mo_f Case 71 : Restore Mo_g Case 72 : Restore Mo_h Case 73 : Restore Mo_i Case 74 : Restore Mo_j Case 75 : Restore Mo_k Case 76 : Restore Mo_l Case 77 : Restore Mo_m Case 78 : Restore Mo_n Case 79 : Restore Mo_o Case 80 : Restore Mo_p Case 81 : Restore Mo_q Case 82 : Restore Mo_r Case 83 : Restore Mo_s Case 84 : Restore Mo_t Case 85 : Restore Mo_u Case 86 : Restore Mo_v Case 87 : Restore Mo_w Case 88 : Restore Mo_x Case 89 : Restore Mo_y Case 90 : Restore Mo_z Case 44 : Restore Mo_komma Case 46 : Restore Mo_pkt Case 63 : Restore Mo_question Case 47 : Restore Mo_slash Case 34 : Restore Mo_quotation Case 59 : Restore Mo_semikolon Case Else : Restore Mo_eom End Select Read Morse ' Zeichen aus Dataanweisungen laden Do If Morse.0 = 0 Then ' 0 als Punkt, 1 als Strich Gosub Sende_punkt ' senden Else Gosub Sende_strich End If Shift Morse , Right , 1 ' 1 Bit nach Rechts Loop Until Morse = &B00000001 ' wenn 1 drin steht, Gosub Sende_pause3 ' ist Zeichen fertig Return ' ------------------------------- Tim1_isr: ' Timer 2 Zeit für Disable Timer1 ' Aufwachen aus Sleepzustand Return ' ------------------------------- Sende_strich: ' 3 * Punktzeit Led_pin = 0 Ptt_pin = 0 Tx_time = Faktor * Basetime Tx_time = 3 * Tx_time Waitms Tx_time Gosub Sende_pause1 Return ' ------------------------------- Sende_punkt: Led_pin = 0 Ptt_pin = 0 Tx_time = Faktor * Basetime Waitms Tx_time Gosub Sende_pause1 Return ' ------------------------------- Sende_pause1: Led_pin = 1 Ptt_pin = 1 ' 1 Einheit Pause Tx_time = Faktor * Basetime Waitms Tx_time Return ' ------------------------------- Sende_pause7: ' 7 Einheiten Pause, 3 haben wir schon nach jedem Zeichen gesendet, bleiben 4 Led_pin = 1 Ptt_pin = 1 ' 1 Einheit Pause Tx_time = Faktor * Basetime Tx_time = Tx_time * 4 Waitms Tx_time Return ' ------------------------------- Sende_pause3: ' 3 Einheiten Pause, 1 Pause haben wir schon vorher gesendet Led_pin = 1 Ptt_pin = 1 ' 1 Einheit Pause Tx_time = Faktor * Basetime Tx_time = Tx_time * 2 Waitms Tx_time Return ' ------------------------------- ' Codetabelle Mo_0: ' - - - - - Data &B00111111 Mo_1: ' * - - - - Data &B00111110 Mo_2: ' * * - - - Data &B00111100 Mo_3: ' * * * - - Data &B00111000 Mo_4: ' * * * * - Data &B00110000 Mo_5: ' * * * * * Data &B00100000 Mo_6: ' - * * * * Data &B00100001 Mo_7: ' - - * * * Data &B00100011 Mo_8: ' - - - * * Data &B00100111 Mo_9: ' - - - - * Data &B00101111 Mo_a: ' * - Data &B00000110 Mo_b: ' - * * * Data &B00010001 Mo_c: ' - * - * Data &B00010101 Mo_d: ' - * * Data &B00001001 Mo_e: ' * Data &B00000010 Mo_f: ' * * - * Data &B00010100 Mo_g: ' - - * Data &B00001011 Mo_h: ' * * * * Data &B00010000 Mo_i: ' * * Data &B00000100 Mo_j: ' * - - - Data &B00011110 Mo_k: ' - * - Data &B00001101 Mo_l: ' * - * * Data &B01010010 Mo_m: ' - - Data &B00000111 Mo_n: ' - * Data &B00000101 Mo_o: ' - - - Data &B00001111 Mo_p: ' * - - * Data &B00010110 Mo_q: ' - - * - Data &B00011011 Mo_r: ' * - * Data &B00001010 Mo_s: ' * * * Data &B00001000 Mo_t: ' - Data &B00000011 Mo_u: ' * * - Data &B00001100 Mo_v: ' * * * - Data &B00011000 Mo_w: ' * - - Data &B00001110 Mo_x: ' - * * - Data &B00011001 Mo_y: ' - * - - Data &B00011101 Mo_z: ' - - * * Data &B00010011 Mo_komma: ' - - * * - - , Data &B01110011 Mo_pkt: ' * - * - * - . Data &B01101010 Mo_question: ' * * - - * * ? Data &B01001100 Mo_slash: ' - * * - * / Data &B00101001 Mo_quotation: ' * - * * - * '' Data &B01010010 Mo_semikolon: ' - * - * - * ; Data &B01010101 Mo_eom: ' * - * - * End of Message Data &B00101010 ' ------------------------------- Readtemperatur: 1wreset 'Bus reset 1wwrite &HCC 'Skip ROM 1wwrite &H44 'Konversion Temperature 44hex Waitms 500 'min 500mSec 1wreset 1wwrite &HCC 'Skip ROM 1wwrite &HBE 'Read Scratchpad For I = 1 To 9 ' Temperatur Scr(i) = 1wread() 'Scratchpad einlesen Next Tempsign = "" If Scr(2).7 = 1 Then ' negativer Messwert Ttemperatur = Makeint(scr(1) , Scr(2)) Shift Ttemperatur , Right , 4 ' Nachkommastellen weg Ttemperatur = Ttemperatur Or &B1111000000000000 ' auf 16 Bit erweitern Ttemperatur = Ttemperatur * -1 ' positiv amchen Tempsign = "-" Else Ttemperatur = Makeint(scr(1) , Scr(2)) ' positiver Messwert Shift Ttemperatur , Right , 4 End If Strtemp = Str(ttemperatur) ' jetzt als Text Strtemp = Tempsign + Strtemp ' Vorzeichen dazu Return ' -------------------------------