Hallo,
ich habe eine Relaissteuerung seit längerem in Betrieb.
Nun sind Relais dazugekommen und da ist der Fehler entstanden.
Anscheinend funktioniert nur 0-15 als Wert und ich benötige mindestens 16, besser mehr.
Was muss ich ändern, damit ich mehr eintragen kann?
es geht um diesen Programmteil: L.16 geht nicht mehr
Hier das (fast) ganze Programm:Code:Dim T1 As Byte , T2 As Byte Dim L As Integer '... Setzen: Portd.2 = L.1 Portd.4 = L.2 Portc.5 = L.3 Portc.4 = L.4 Portc.3 = L.5 Portc.2 = L.6 Portc.1 = L.7 Portc.0 = L.8 Portb.5 = L.9 Portb.4 = L.10 Portb.3 = L.11 Portb.2 = L.12 Portb.1 = L.13 Portb.0 = L.14 Portd.7 = L.15 'Portd.6 = L.16 Return
vielen Dank, TobiasCode:'Timer0 = 8 Bit Config Timer0 = Timer , Prescale = 8 On Timer0 Timer0_irq Const Timervorgabe_t0 = 78 'Timeraufruf alle 178µs (10 Samples = 1 Bit = 1,778ms) Enable Timer0 'Hier werden die Timer aktiviert Enable Interrupts '16Bit Timer: Config Timer1 = Timer , Prescale = 64 On Timer1 Timer1_irq Const Timervorgabe_t1 = 64286 '100 mal pro Sekunde @ 8MHz Enable Timer1 'Hier werden die Timer aktiviert Enable Interrupts '------------------------------------------------------------------------------- 'Variablen: '------------------------------------------------------------------------------- Dim Address_rc5 As Byte , Command_rc5 As Byte , Rc5_flag As Bit , Command_old As Bit 'Taste 1-6 auf der FB Dim T1 As Byte , T2 As Byte Dim Status As Byte 'zeigt den Status der gewaehlten Lampe an NICHTS / AN / AUS Dim Empfang As Bit 'ist 0 wenn kein empfang (also 255 von Variable address) Dim Zaehler As Byte 'wenn = 100 dann 1 sec um Dim L As Integer Dim Setzen_merker As Bit '1 = setzenroutine freigegeben Dim Z_timer1 As Byte '100 = 1 sec Input_pin Alias Pind.3 'Set Portd.3 'Pull Up für Empfänger Const An = 1 Const Aus = 0 Const Nichts = 255 'Timing für 10 Samples Per Bit = 1,778ms Const Samples_early = 8 'Flanke Frühestens Nach 8 Samples Const Samples_late = 12 'Flanke Spätestens Nach 12 Samples Const Samples_min = 3 'Flanke Vor 3 Samples - > Paket Verwerfen 'Variablen der IR-ISR Dim Sample As Byte 'eigentlich Bit, spart aber 46Byte ROM Dim Ir_lastsample As Byte 'zuletzt gelesenes Sample Dim Ir_bittimer As Byte 'zählt die Aufrufe von Timer_IRQ Dim Ir_data_tmp As Word 'Bitstream Dim Ir_bitcount As Byte 'Anzahl gelesener Bits '------------------------------------------------------------------------------- 'Vor Programmstart: Zaehler = 0 Status = Nichts '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Print "Programm Start 38400 Baud..." Do If Rc5_flag = 1 Then Reset Rc5_flag If Address_rc5 = 10 Then 'Adresse 10=ASAT /(0=TV FB) Incr Zaehler If Command_rc5.7 <> Command_old Then Zaehler = 0 'wenn ungleich also neuer Befehl, dann Zaehler zurücksetzen Status = Nichts Command_old = Command_rc5.7 End If Reset Command_rc5.7 'reset toggle bit 'Print Command_rc5 Select Case Command_rc5 Case 0 : Gosub Alles_aus 'Print "CASE = 0" Case 1 : T1 = 1 T2 = 2 Gosub Lampe1 Case 2 : T1 = 3 T2 = 4 Gosub Lampe1 Case 3 : T1 = 5 T2 = 6 Gosub Lampe1 Case 4 : T1 = 7 T2 = 8 Gosub Lampe1 Case 5 : T1 = 9 T2 = 10 Gosub Lampe1 Case 6 : T1 = 11 T2 = 12 Gosub Lampe1 Case 7 : Gosub Gruppe_7 Case 9 : Gosub Gruppe_9 Case 12 : Gosub Alles_aus Case Else : Print "Fehler: " ; Command_rc5 End Select End If End If '_______________________________________________________________________________ If Z_timer1 > 40 And Setzen_merker = 1 Then 'Schaltvert für Z_Timer1 ist Quarzfrequenz abhängig und soll bei langem Tastendruck verhindern Setzen_merker = 0 'dass wenn eine Lampe an ist und die zweite hinzukommt, dass die erste kurz aus geht! Gosub Setzen End If Loop End '------------------------------------------------------------------------------- 'Relais ansteuern '------------------------------------------------------------------------------- 'Status = so wie der aktuelle Status IST (nicht wie er sein soll!!!) Lampe1: '============= 'aktuellen Status auslesen und setzen If Status = Nichts Then If L.t1 = 0 Then Status = Aus Else Status = An End If End If If Zaehler = 0 Then 'WENN KURZ GEDRÜCKT WURDE 'Print Zaehler ; " = Zaehler = 0" If Status = Aus Then 'wenn lampe eingeschaltet werden soll dann Set L.t1 'Print "L" ; T1 ; ":1" Else 'wenn lampe 1 = an If L.t2 = 1 Then Reset L.t2 'Print "L" ; T2 ; ":0" Else Reset L.t1 'Print "L" ; T1 ; ":0" End If End If End If 'WENN LANGE GEDRÜCKT WURDE If Zaehler > 2 Then 'Print Zaehler ; " = Zaehler > 2" If Status = Aus Then Set L.t2 'Print "Lange" ; T2 ; ":1" Else If L.t2 = 0 Then Set L.t1 Set L.t2 'Print "Lange" ; T1 ; ":1 und " ; T2 ; ":1" End If End If End If Setzen_merker = 1 'Print "Setzen_merker = " ; Setzen_merker If Zaehler = 0 Then 'die Variable soll nur bei kurzem Tastendruck eine Zeitverzögerung machen Z_timer1 = 0 'Timer1 zurücksetzen End If 'Gosub Setzen Return 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 'XXXXXXXXX P R O B L E M XXXXXXXXXXXXXXXXXXXXXXXXX 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Setzen: 'Print " S E T Z E N " 'Print Zaehler ; " Zaehler" Portd.2 = L.1 Portd.4 = L.2 Portc.5 = L.3 Portc.4 = L.4 Portc.3 = L.5 Portc.2 = L.6 Portc.1 = L.7 Portc.0 = L.8 Portb.5 = L.9 Portb.4 = L.10 Portb.3 = L.11 Portb.2 = L.12 Portb.1 = L.13 Portb.0 = L.14 Portd.7 = L.15 'Portd.6 = L.16 Print L.1 ; L.2 ; L.3 ; L.4 ; L.5 ; L.6 Return Timer1_irq: Timer1 = Timervorgabe_t1 If Z_timer1 < 255 Then Incr Z_timer1 End If Return '************************************************************************************* 'Quelle: Bascom-Forum Timer0_irq: Timer0 = Timervorgabe_t0 Sample = Not Input_pin 'bittimer erhöhen (bleibt bei 255 stehen) If Ir_bittimer < 255 Then Incr Ir_bittimer 'flankenwechsel erkennen If Ir_lastsample <> Sample Then If Ir_bittimer <= Samples_min Then 'flanke kommt zu früh: paket verwerfen Ir_bitcount = 0 Else 'nur Flankenwechsel in Bit-Mitte berücksichtigen If Ir_bittimer >= Samples_early Then If Ir_bittimer <= Samples_late Then 'Bit speichern Shift Ir_data_tmp , Left , 1 Ir_data_tmp = Ir_data_tmp + Sample Incr Ir_bitcount Else 'Flankenwechsel zu spät: Neuanfang mit gemessener Flanke Ir_bitcount = 1 Ir_data_tmp = Sample End If 'bittimer zurücksetzen wenn Timer > Samples_early Ir_bittimer = 0 End If End If 'Kontrolle des Startbits auf 1 If Ir_bitcount = 1 Then Ir_bitcount = Ir_data_tmp.0 'Alle 14 Bits gelesen? If Ir_bitcount >= 14 Then Command_rc5 = Ir_data_tmp 'Bit 6 und 7 siehe unten Shift Ir_data_tmp , Right , 6 Address_rc5 = Ir_data_tmp And &B00011111 'For extended RC5 code, the extended bit is bit 6 of the command. Command_rc5.6 = Not Ir_data_tmp.6 'The toggle bit is stored in bit 7 of the command Command_rc5.7 = Ir_data_tmp.5 'Paket erfolgreich gelesen Set Rc5_flag 'paket zurücksetzen Ir_bitcount = 0 End If End If 'sample im samplepuffer ablegen Ir_lastsample = Sample Return







Zitieren

Lesezeichen