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
Lesezeichen