'############################################################################## ' Audio-Multiplexer.BAS Stand 08.01.2010 ' --------------------- (C) Markus Fulde ' ' Steuerprogramm für Audio-Multiplexer mit folgenden Funktionen: ' - Spannungsversorgung über USB ' - blinkende Alive-LED ' - Mikrocontroller ATmega8 (inkl. ISP und Reset) ' - 2 Taster für Input-Select und Output-Select ' - LED-Anzeigen für Eingangsstatus und Ausgangsstatus ' '############################################################################## '------------------------------------------------------------------------------ ' Compilerinstruktionen und Compilerdirektiven '------------------------------------------------------------------------------ $regfile = "m8def.dat" ' Definitionsdatei für ATmega128 laden $crystal = 8000000 ' Quarzfrequenz für 16 MHz festlegen $hwstack = 128 ' HW-Stack auf 128 Bytes erweitern $swstack = 64 ' SW-Stack auf 64 Bytes erweitern $framesize = 80 ' Framesize auf 80 Byte festlegen '------------------------------------------------------------------------------ ' Definition von Ressourcen '------------------------------------------------------------------------------ ' ----- KEY: Tasten ----- ' Taste Input-Select Taste_in_pin Alias Pinc.1 ' GPIO für IN-Select (für DDR oder Input) Taste_in Alias Portc.1 ' GPIO für IN-Select (für Output oder PullUp) ' Taste Output-Select Taste_out_pin Alias Pinc.0 ' GPIO für OUT-Select (für DDR oder Input) Taste_out Alias Portc.0 ' GPIO für OUT-Select (für Output oder PullUp) ' ----- LED: Anzeige-LED's ----- ' Alive-LED Alive_pin Alias Pinb.0 ' GPIO für Alive-LED (für DDR oder Input) Alive Alias Portb.0 ' GPIO für Alive-LED (für Output oder PullUp) ' ----- REL: Ausgänge für LED und Relais ----- In_1_pin Alias Pinc.5 In_1 Alias Portc.5 In_2_pin Alias Pinc.4 In_2 Alias Portc.4 Out_1_pin Alias Pinc.3 Out_1 Alias Portc.3 Out_2_pin Alias Pinc.2 Out_2 Alias Portc.2 Ld1_not_pin Alias Pind.7 Ld1_not Alias Portd.7 Ld2_not_pin Alias Pind.6 Ld2_not Alias Portd.6 Ld3_not_pin Alias Pind.5 Ld3_not Alias Portd.5 Ld4_not_pin Alias Pind.4 Ld4_not Alias Portd.4 '------------------------------------------------------------------------------ ' Definition von Konstaten '------------------------------------------------------------------------------ ' Zeitvorgabe für Sekunden-Timer Const Timervorgabe = 34286 '------------------------------------------------------------------------------ ' Definition von Variablen und Datentypen '------------------------------------------------------------------------------ ' EE: EEPROM Datenstruktur internes EEPROM - Setting Dim Ee_data_in_select As Eram Byte At &H0000 Dim Ee_data_out_select As Eram Byte At &H0001 ' Arbeitsvariablen Dim In_select As Byte Dim Out_select As Byte '------------------------------------------------------------------------------ ' Prototyping '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' Konfiguration und Basiseinstellungen (Projekt und Testumgebung) '------------------------------------------------------------------------------ ' ----- Variablen und Werte ----- ' ----- CONFIG ----- ' Sekunden-Timer und Teiler definieren Config Timer1 = Timer , Prescale = 256 On Timer1 Sekunden_tick ' ----- Port's und Pin's ----- ' LED: LED's Config Alive_pin = Output ' Ausgang konfigurieren ' KEY: Tasten Config Taste_in_pin = Input ' Eingang konfigurieren Config Taste_out_pin = Input ' Eingang konfigurieren ' REL: Ausgänge Config In_1_pin = Output Config In_2_pin = Output Config Out_1_pin = Output Config Out_2_pin = Output Reset In_1_pin Reset In_2_pin Reset Out_1_pin Reset Out_2_pin Config Ld1_not_pin = Output Config Ld2_not_pin = Output Config Ld3_not_pin = Output Config Ld4_not_pin = Output Reset Ld1_not Reset Ld2_not Reset Ld3_not Reset Ld4_not ' PullUps werden via default aktiviert. Zur Sauberkeit Bit aber nochmal setzen Taste_in = 1 Taste_out = 1 ' ----- Freigabe aller Interrupts ---- Enable Timer1 Enable Interrupts ' ----- Gosub's ----- Gosub Ee_init ' Eepromwerte initialisieren ' Gosub In_change_state Gosub Out_change_state ' ############################################################################# ' ' Hauptprogramm ConvCtrl ' ' ############################################################################# ' ---------------------------------------------- ' ----- Hier ist die Programmhauptschleife ----- ' ---------------------------------------------- Do ' ----- Tastenauswertung ----- ' Taste 1: Umschalten Source (IN) ' Taste 2: Umschalten Destination (OUT) ' Abfrage Taste 2 und Ansprung Auswerteroutine für Taste 2 Debounce Taste_in_pin , 0 , Key_taste_in_request , Sub ' Abfrage Taste 3 und Ansprung Auswerteroutine für Taste 3 Debounce Taste_out_pin , 0 , Key_taste_out_request , Sub Loop '## End Hauptprogramm ######################################################### '****************************************************************************** ' Interruptroutinen '****************************************************************************** '------------------------------------------------------------------------------ ' Interrupt-Service-Routine (Timer1): Sekunden_tick ' Routine zur Auswertung des Timer Interrupts '------------------------------------------------------------------------------ Sekunden_tick: Timer1 = Timervorgabe Toggle Alive Return '-- End Sekunden_tick --------------------------------------------------------- '****************************************************************************** ' Funktionen '****************************************************************************** '****************************************************************************** ' GOSubroutinen '****************************************************************************** '------------------------------------------------------------------------------ ' Gosub-Routine: Ee_init ' Routine liest die letzten Einstellungen aus dem internen EEProm und schreibt ' diese in eine Variable. '------------------------------------------------------------------------------ Ee_init: In_select = Ee_data_in_select Out_select = Ee_data_out_select ' Überprüfung auf gültige Werte If In_select < 1 Then In_select = 1 Ee_data_in_select = In_select End If If In_select > 2 Then In_select = 2 Ee_data_in_select = In_select End If If Out_select < 1 Then Out_select = 1 Ee_data_out_select = Out_select End If If Out_select > 3 Then Out_select = 3 Ee_data_out_select = Out_select End If Return '-- End Ee_init --------------------------------------------------------------- '------------------------------------------------------------------------------ ' Gosub-Routine: Key_taste_in_request ' Routine verarbeitet die Tastendrücke für IN-Select. ' Dabei wird eine Variable rollierend hochgezählt. '------------------------------------------------------------------------------ Key_taste_in_request: Incr In_select If In_select > 2 Then In_select = 1 End If Ee_data_in_select = In_select Gosub In_change_state Return '-- End Key_taste_in_request -------------------------------------------------- '------------------------------------------------------------------------------ ' Gosub-Routine: Key_taste_out_request ' Routine verarbeitet die Tastendrücke für OUT-Select. ' Dabei wird eine Variable rollierend hochgezählt. '------------------------------------------------------------------------------ Key_taste_out_request: Incr Out_select If Out_select > 3 Then Out_select = 1 End If Ee_data_out_select = Out_select Gosub Out_change_state Return '-- End Key_taste_in_request -------------------------------------------------- '------------------------------------------------------------------------------ ' Gosub-Routine: In_change_state ' Routine setzt die Steuerleitungen für IN-Select. '------------------------------------------------------------------------------ In_change_state: Select Case In_select Case 1: Reset In_2 Reset Ld1_not Set In_1 Set Ld2_not Case 2: Reset In_1 Reset Ld2_not Set In_2 Set Ld1_not End Select Return '-- End In_change_state ------------------------------------------------------- '------------------------------------------------------------------------------ ' Gosub-Routine: Out_change_state ' Routine setzt die Steuerleitungen für OUT-Select. '------------------------------------------------------------------------------ Out_change_state: Select Case Out_select Case 1: Set Out_1 Reset Ld3_not Reset Out_2 Set Ld4_not Case 2: Reset Out_1 Set Ld3_not Set Out_2 Reset Ld4_not Case 3: Set Out_1 Reset Ld3_not Set Out_2 Reset Ld4_not End Select Return '-- End Out_change_state ------------------------------------------------------ End 'end program '###################################### END ################################### '################################### Historie ################################# ' 28.01.2009 : Version 1.0 ' Erste offizielle und vollständig umgesetzte Produktivsoftware '##############################################################################