'Bakensteuerung_V1-0.bas - Programm zur Bakensteuerung 'Wolfgang Schneider, 26.12.2007 'Wichtig: 'Include-Dateien mit Subroutinen für RTC DS1307, ... '$include "Subroutine_RTC.bas" 'Historie 'V1.0 Grundfunktionen 'Basis: Microcontroller ATMega32 und LC-Display 4 x 20 auf Port C 'Eingabe auf Port A 'PA7: Text 4 'PA6: Text 3 'PA5: Text 2 'PA4: Text 1 'PA3: Analogeingabe Betriebsspannung Controller 'PA2: Analogeingabe Betriebsspannung Oszillator 'PA1: Analogeingabe Betriebsspannung Endstufe 'PA0: Analogeingabe Ausgangsleistung Bake 'Ausgabe Steuerbefehle auf Port B 'PB7: nicht belegt 'PB6: nicht belegt 'PB5: nicht belegt 'PB4: nicht belegt 'PB3: nicht belegt 'PB2: nicht belegt 'PB1: PTT\ (low-aktiv) 'PB0: Key\ (low-aktiv) 'Ein/Ausgabe (I2C, 1-Wire, RS232, ... auf Port D 'PD7:SCL 'PD6: SDA 'PD4: 1-Wire 'Funktionsbeschreibung 'Das Programm übernimmt die Steuerung und Kontrolle einer Amateurfunkbake. 'Steuerfunktionen sind die CW-Tastung (Key\) und zur Schaltung eines Senders, 'Transceivers, Endstufe oder aber auch Antenne zusätzlich den Port PTT\ 'Zur Kontrolle sind vorgesehen die Überwachung ddiverser Betriebsspannungen. 'Zur Eingabe können darüber hinaus diverse Ein-/Ausgabeports herangezogen 'werden. $regfile = "m32def.dat" $crystal = 9216000 'Quarzfrequenz $baud = 9600 $prog &HFF , &HFF , &HD9 , &H00 'Fuse-Bits: JTAG disabled, OSC High Frequency 'Unterprogramme Declare Sub String_senden Declare Sub Analogeingabe Declare Sub Temperaturmessung Declare Sub Anzeige_startsequenz Declare Sub Rtc_setzen 'Variablen Dim X As Byte 'Hilfsvariable Dim Wochentag As Byte Dim Stunde As Byte Dim Minute As Byte Dim Sekunde As Byte Dim Ar(2) As Byte , A As Byte , I As Byte , Temperatur As Integer Dim Halb As Byte Dim Adc_wert As Long 'Long-Integer Dim Spannung As Long 'Long-Integer Dim Sendstring As String * 20 Dim Sendchar As String * 1 Dim Charcode As Byte Dim Dataindex As Byte Dim Charindex As Byte Dim Nextcharindex As Byte Dim Charstring As String * 12 Dim Stringlength As Byte Dim Codelength As Byte Dim Codeindex As Byte Dim Codeelement As String * 1 Dim Concatindex As Byte 'Set Speed and Dot, they determine the remaining constants Const Speed = 12 'WPM (12 WPM = 60 BPM) Const Dot = 1200 / Speed Const Dash = 3 * Dot Const Letter = 3 * Dot Const Wordw = 5 * Dot 'Adresse der Ds1307 Uhr als Konstante Const Ds1307w = &HD0 Const Ds1307r = &HD1 'Interne Time/Date Routinen für Bascom konfigurieren Config Clock = User Config Date = Dmy , Separator = . 'I2C-Bus initialisieren Config Scl = Portd.7 'Port PD7 ist SCL Config Sda = Portd.6 'Port PD6 ist SDA Config I2cdelay = 100 'SCL = 10 kHz, Default I2cdelay = 5 (200 kHz) I2cinit 'I2cdelay = 10 (100 kHz) geht nicht, Kabel 3 bzw. 7m 'LCD initialisieren Config Lcd = 20 * 4 'configure lcd screen Config Lcdbus = 4 Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0 Initlcd Cursor Off Cls 'Clear LCD 'Initialisieren 1-Wire-Bus Config 1wire = Portd.4 'Initialisieren der Ports Config Porta.4 = Input Config Porta.5 = Input Config Porta.6 = Input Config Porta.7 = Input Config Portb = Output 'Startbedingung Portb = &B11111111 'Steuerport für PTT und Key Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc 'Stellen der Uhr, muss nur einmal ausgeführt werden. Pufferung durch Stützbatterie 3V 'Call Rtc_setzen 'Start Hauptprogramm Do Call Anzeige_startsequenz Stunde = _hour Minute = _min Sekunde = _sec If Sekunde = 0 Then Cls 'Clear LCD Portb.0 = 1 'Steuerport für Key\ Waitms 20 'TX/RX-Delay ' Portb = &B11111111 'Steuerport für PTT\ und Key\ Waitms Wordw 'Pauselänge 5 Punkte 'Lesen der Eingabeports ' If Porta.4 = 0 Then Sendstring = "DJ8ES" 'Grossschreibung erforderlich! ' If Porta.5 = 0 Then Sendstring = "DJ8ES JO43SX" ' If Porta.6 = 0 Then Sendstring = "DJ8ES JO43SX PSE QSL" ' If Porta.7 = 0 Then Sendstring = "DJ8ES JO43SX 24 GHZ" Sendstring = "DJ8ES JO43SX" 'CW-Ausgabe auf Port und LCD Locate 1 , 1 'LCD Auf Position 1 , 1 Portb.1 = 0 'Steuerport für PTT\ Waitms 20 'TX/RX-Delay Call String_senden Waitms Wordw 'Pausenlänge 5 Punkte Portb.0 = 0 'Steuerport für Key\ (Dauerstrich) Wait 5 'Messung der aktuellen Temperaturen Call Temperaturmessung 'Messung der Betriebsspannungen und Ausgangsleistung Call Analogeingabe Wait 15 Cls End If Waitms 100 Loop 'Subroutinen für die RTC DS1307 über I2C-Bus $include "Subroutine_RTC.bas" End 'ab hier Unterprogramme Sub String_senden 'get length of string Stringlength = Len(sendstring) 'for each character in this string For Charindex = 1 To Stringlength 'extract character and get decimal ascii code Sendchar = Mid(sendstring , Charindex , 1) Charcode = Asc(sendchar) Lcd Sendchar 'is space, wait space time If Charcode = 32 Then Waitms Wordw 'if other than "<" handle character Elseif Charcode <> 60 Then 'get ranknumber and lookup corresponding morse string Dataindex = Charcode - 35 Charstring = Lookupstr(dataindex , Morse_alphabet) 'get length of morse string Codelength = Len(charstring) 'for each character in this string For Codeindex = 1 To Codelength Codeelement = Mid(charstring , Codeindex , 1) 'extract character 'sende CW-Zeichen auf Key\ Portb.0 = 0 'CW-Key\ If Codeelement = "." Then Waitms Dot Else 'send dash sound Waitms Dash End If Portb.0 = 1 'CW-Key\ If Codeindex < Codelength Then Waitms Dot 'wait dot time, but not after last character Next Codeelement Nextcharindex = Charindex + 1 'if next character in sendstring is not "<", wait letter time Sendchar = Mid(sendstring , Nextcharindex , 1) Charcode = Asc(sendchar) Waitms Letter End If Next Charindex End Sub String_senden Sub Analogeingabe 'Messung der Betriebsspannungen und Ausgangsleistung 'Messung Kanal 0 "Ausgangsleistung" Adc_wert = Getadc(0) Adc_wert = 5000 * Adc_wert 'Normierung wg. Spannungsteiler Anz = 0 * 5000 Spannung = Adc_wert / 1024 'Spannung in mV Locate 4 , 12 Lcd "HF: " ; Spannung 'Anzeige normierte Spannung in mV 'Messung Kanal 1 "Betriebsspannung Endstufe" Adc_wert = Getadc(1) Adc_wert = 16000 * Adc_wert 'Normierung wg. Spannungsteiler Anz = 3,2 * 5000 Spannung = Adc_wert / 1024 'Spannung in mV Locate 3 , 12 Lcd "PA: " ; Spannung 'Anzeige normierte Spannung in mV 'Messung Kanal 2 "Betriebsspannung Oszillator" Adc_wert = Getadc(2) Adc_wert = 16000 * Adc_wert 'Normierung wg. Spannungsteiler Anz = 3,2 * 5000 Spannung = Adc_wert / 1024 'Spannung in mV Locate 3 , 1 Lcd "CO: " ; Spannung 'Anzeige normierte Spannung in mV 'Messung Kanal 3 "Betriebsspannung Controller" Adc_wert = Getadc(3) Adc_wert = 16000 * Adc_wert 'Normierung wg. Spannungsteiler Anz = 3,2 * 5000 Spannung = Adc_wert / 1024 'Spannung in mV Locate 4 , 1 Lcd "uC: " ; Spannung 'Anzeige normierte Spannung in mV End Sub Analogeingabe Sub Temperaturmessung 'Messung der aktuellen Temperaturen 1wreset 'reset the device 1wwrite &HCC 'read ROM command 1wwrite &H44 Waitms 100 'read ROM command 1wreset 'reset the device 1wwrite &HCC 'read ROM command 1wwrite &HBE 'read ROM command For I = 1 To 2 Ar(i) = 1wread() 'place into array Next Temperatur = Ar(1) If Ar(2) > 0 Then Temperatur = 0 Else Shift Temperatur , Right Halb = Ar(1) And 1 Locate 2 , 1 Lcd "Temperatur: " ; Temperatur ; "." If Halb = 1 Then Lcd "5" Else Lcd "0" Lcd " C" End Sub  Sub Anzeige_startsequenz 'Ausgabe Wochentag und aktuelle Uhrzeit Locate 1 , 1 : Lcd Date$ 'Ausgabe aktuelles Datum Locate 1 , 13 : Lcd Time$ 'Ausgabe aktuelle Uhrzeit 'Anzeige Grunddaten auf LCD 20x4 Locate 3 , 1 : Lcd "Bake DJ 8 ES 24 GHz" End Sub Anzeige_startsequenz Sub Rtc_setzen 'Stellen der Uhr, muss nur einmal ausgeführt werden. Pufferung durch Stützbatterie 3V Time$ = "18:37:00" 'Uhrzeit in UTC Date$ = "14.01.08" 'Mittwoch End Sub Rtc_setzen 'Tabelle Zuordnung Morsezeichen Morse_alphabet: Data "........." '# Data "........." '$ Data "........." '% Data "........." '& Data ".----." ' ' Data "-.--." ' ( Data "-.--.-" ') Data "........." '* Data "........." '+ Data "--..--" ', Data "-...._" '- Data ".-.-.-" '. Data "-..-." '/ Data "-----" '0 Data ".----" '1 Data "..---" '2 Data "...--" '3 Data "....-" '4 Data "....." '5 Data "-...." '6 Data "--..." '7 Data "---.." '8 Data "----." '9 Data "---..." ': Data "........." '; Data "........." '< Data "........." '= Data "........." '> Data "..--.." '? Data "........." '@ Data ".-" 'A Data "-..." 'B Data "-.-." 'C Data "-.." 'D Data "." 'E Data "..-." 'F Data "--." 'G Data "...." 'H Data ".." 'I Data ".---" 'J Data "-.-" 'K Data ".-.." 'L Data "--" 'M Data "-." 'N Data "---" 'O Data ".--." 'P Data "--.-" 'Q Data ".-." 'R Data "..." 'S Data "-" 'T Data "..-" 'U Data "...-" 'V Data ".--" 'W Data "-..-" 'X Data "-.--" 'Y Data "--.." 'Z