Hallo,
sorry das ich erst nun antworte.
@peterfido
Das Programm läuft leider nicht.
Dadurch dass mehrere Impulse von der FB gesendet werden reicht die Verriegelung mit der 255 nicht aus und man schafft es fast nie die FB Taste so kurz zu drücken das der Kontakt nicht mehrmals schaltet.
Die andere Sache ist, dass nur ein Leuchtmittel gesteuert werden kann (oder ich hab das Programm noch nicht durchschaut) Jede Lampe hat 2 Leuchtmittel, wodurch 2 Helligkeitsstuffen möglich sind.
ABER ich habe die Programmierweise (über die Variablen L.1 - L.12 die Lampen auswählen und so viele Programmzeilen sparen) übernommen.
Jetzt kommt der Fehler der mir unmöglich erscheint. Alle Funktionen mit Taste 1,3,5 funktionieren - Taste 2,4,6 LANGE drücken auswerten funktioniert nicht?! Dabei werden doch alle Tasten gleich abgefragt...
(zur Funktion: kurz drücken -> erstes Leuchtmittel an bzw. aus. lange drücken beide Leuchtmittel an bzw. aus)
Code:'------------------------------------------------------------------------------- 'Konfiguration µC: $regfile = "m8def.dat" 'AT-Mega8 $crystal = 16000000 'Quarz: 16 MHz $baud = 38400 'Baudrate definieren '------------------------------------------------------------------------------- 'Ein- Ausgänge: Ddrb = &B11111111 '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang Ddrc = &B11111111 '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang Portb = 0 Portc = 0 '------------------------------------------------------------------------------- 'Timer0 = 8 Bit 'wird für RC5 Auswertung benötigt!!! Config Rc5 = Pind.3 'Timer0 in Benutzung!!! Portd.3 = 1 '?????????????????????????????????? '16Bit Timer: Config Timer1 = Timer , Prescale = 256 On Timer1 Timer1_irq Const Timervorgabe = 64911 '100 mal pro Sekunde Enable Timer1 Enable Interrupts '------------------------------------------------------------------------------- 'Variablen: '------------------------------------------------------------------------------- Dim Address As Byte , Command As Byte , Command_old As Bit , Flag As Bit 'RC5 'Taste lange gedrückt Dim Taste_lang As Word Dim Empfang As Bit 'ist 0 wenn kein empfang also 255 von address Dim Sek As Byte 'wenn = 100 dann 1 sec um Dim L As Integer , Ls As Integer , Lampe_x As Byte , Lampe_y As Byte 'Lampen festlegen Lampe1 Alias Portc.5 Lampe2 Alias Portc.4 Lampe3 Alias Portc.3 Lampe4 Alias Portc.2 Lampe5 Alias Portc.1 Lampe6 Alias Portc.0 Lampe7 Alias Portb.5 Lampe8 Alias Portb.4 Lampe9 Alias Portb.3 Lampe10 Alias Portb.2 Lampe11 Alias Portb.1 Lampe12 Alias Portb.0 '------------------------------------------------------------------------------- 'Vor Programmstart: 'alle Lampen aus: Lampe1 = 0 Lampe2 = 0 Lampe3 = 0 Lampe4 = 0 Lampe5 = 0 Lampe6 = 0 Lampe7 = 0 Lampe8 = 0 Lampe9 = 0 Lampe10 = 0 Lampe11 = 0 Lampe12 = 0 Address = 255 'also kein Signal Command = 255 'also kein Signal Lampe_x = 255 Lampe_y = 255 '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Print "Programm Start 38400 Baud..." Do Anfang: '------------------------------------------------------------------------------- 'Rc5 Code einlesen: Getrc5(address , Command) 'Print "Address: " ; Address 'Print "Command: " ; Command '------------------------------------------------------------------------------- 'RC5 Code umsetzen: If Address = 255 Then 'also kein Signal Empfang = 0 End If If Address = 0 Then 'Adresse 0=TV FB If Empfang = 0 Then Empfang = 1 Timer1 = Timervorgabe 'Timer1 zurücksetzen, damit erst bei Tastendruck gezählt wird 'Print "timerzurück" End If If Command.7 = Command_old Then Incr Taste_lang Else Taste_lang = 0 'Variable zurücksetzen Command_old = Command.7 End If 'Print "Command.7: " ; Command.7 'Print "Taste_lang: " ; Taste_lang 'Command = Command And &B01111111 'reset toggle bit Reset Command.7 'reset toggle bit 'Print Command Select Case Command Case 0 : Goto All_off Case 1 : Lampe_x = 1 Lampe_y = 2 Goto Lampe Case 2 : Lampe_x = 3 Lampe_y = 4 Goto Lampe Case 3 : Lampe_x = 5 Lampe_y = 6 Goto Lampe Case 4 : Lampe_x = 7 Lampe_y = 8 Goto Lampe Case 5 : Lampe_x = 9 Lampe_y = 10 Goto Lampe Case 6 : Lampe_x = 11 Lampe_y = 12 Goto Lampe Case Else : Print "Fehler: " ; Command End Select End If '------------------------------------------------------------------------------- 'Relais ansteuern '------------------------------------------------------------------------------- Lampe: '============= If Lampe_x < 255 And Taste_lang < 7 Then 'wenn Taste 1 gedrückt wurde UND Taste_lang nicht überlaufen ist! Ls.lampe_x = L.lampe_x 'Iststatus von Lampen übernehmen Ls.lampe_y = L.lampe_y 'Iststatus von Lampen übernehmen If Ls.lampe_x = 0 And Ls.lampe_y = 0 Then L.lampe_x = 1 Goto Sprung1 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If Ls.lampe_x = 1 And Ls.lampe_y = 0 Then L.lampe_x = 0 Goto Sprung1 End If If Ls.lampe_x = 1 And Ls.lampe_y = 1 Then L.lampe_y = 0 End If Sprung1: If Taste_lang => 3 And Taste_lang < 7 Then 'wenn lange gedrückt wird (<=5 damit nicht über Timer gesprungen wird) Print "Taste_lang: " ; Taste_lang Taste_lang = 100 'Variable setzen damit Routine kein zweites mal erfüllt wird If Ls.lampe_x = 1 And Ls.lampe_y = 0 Then L.lampe_x = 1 'immer beide setzen, falls davor anders gesetzt wurde(einzellampe) L.lampe_y = 1 Goto Sprung2 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If Ls.lampe_x = 1 And Ls.lampe_y = 1 Then L.lampe_x = 0 L.lampe_y = 0 Goto Sprung2 'wenn Bedingung richtig, dann Restüberspringen bzw. bei lange drücken weitermachen End If If Ls.lampe_x = 0 And Ls.lampe_y = 0 Then L.lampe_x = 1 L.lampe_y = 1 End If End If Sprung2: Gosub Lampen_setzen End If 'ENDE von "wenn Taste 1 gedrückt wurde" '_______________________________________________________________________________ 'If Sek = 50 Then 'Goto Ausgabe 'Ausgabe: 'End If '_______________________________________________________________________________ If Sek => 100 And Address = 255 Then Sek = 0 Print "L1: " ; Lampe1 Print "L2: " ; Lampe2 Print "L3: " ; Lampe3 Print "L4: " ; Lampe4 Print "L5: " ; Lampe5 Print "L6: " ; Lampe6 Print "L7: " ; Lampe7 Print "L8: " ; Lampe8 Print "L9: " ; Lampe9 Print "L10: " ; Lampe10 Print "L11: " ; Lampe11 Print "L12: " ; Lampe12 Print "____________" End If Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Sprungmarken '------------------------------------------------------------------------------- Timer1_irq: Timer1 = Timervorgabe Incr Sek Return '------------------------------------------------------------------------------- Lampen_setzen: Lampe1 = L.1 'Werte auf Ausgänge übertragen Lampe2 = L.2 Lampe3 = L.3 Lampe4 = L.4 Lampe5 = L.5 Lampe6 = L.6 Lampe7 = L.7 Lampe8 = L.8 Lampe9 = L.9 Lampe10 = L.10 Lampe11 = L.11 Lampe12 = L.12 Lampe_x = 255 Lampe_y = 255 Return '------------------------------------------------------------------------------- All_off: 'Alle Lampen ausschalten Lampe1 = 0 'Werte auf Ausgänge übertragen Lampe2 = 0 Lampe3 = 0 Lampe4 = 0 Lampe5 = 0 Lampe6 = 0 Lampe7 = 0 Lampe8 = 0 Lampe9 = 0 Lampe10 = 0 Lampe11 = 0 Lampe12 = 0 'rücksetzen der Variablen L.1 = 0 L.2 = 0 L.3 = 0 L.4 = 0 L.5 = 0 L.6 = 0 L.7 = 0 L.8 = 0 L.9 = 0 L.10 = 0 L.11 = 0 L.12 = 0 Goto Anfang







Zitieren

Lesezeichen