PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bereich zu klein?



TobiasBlome
14.04.2011, 19:08
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


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
Hier das (fast) ganze Programm:



'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

'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
'XXXXXXXXX P R O B L E M XXXXXXXXXXXXXXXXXXXXXXXXX
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
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
vielen Dank, Tobias

Rone
14.04.2011, 19:29
Hallo!

Ungetestet und ein Schuß ins Blaue:

Nimm ein Long - sind 4 Byte sollte dann theoretisch von 0 - 31 gehen.

Probiers mal.

MfG

TobiKa
14.04.2011, 20:22
Anscheinend funktioniert nur 0-15 als Wert und ich benötige mindestens 16, besser mehr.
0-15 sind 16!

TobiasBlome
14.04.2011, 21:10
Hallo Rone,
da hab ich wohl einen Denkfehler gemacht.
Vielen Dank! Mit "LONG" funktioniert es und 0-31 reicht aus.

Tobias