PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Relais nach x Sekunden abfallen lassen



BlaueLed
16.11.2006, 20:48
Hallo,

ich habe nen an einem mega8 über einen ULN2803 zwei Relais hängen. Über die RS485 Schnittstelle sende ich Befehle, um die Relais anziehen zu lassen. Zusätzlich habe ich eine per Software eine "Verriegelung" eingebaut, damit nie die zwei Relais gleichzeitig anziehen können. Das funktioniert auch alles prima. Jetzt soll, wenn der Befehl zum schalten des Relais1 kommt, das Relais anziehen und nach 10 sekunden wieder abfallen.

Folgender Code funzt ( ohne Timer ) :



'--------------------------------- Chip Definiton ----------------------------
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 1200
'--------------------------------- Portdefinition ----------------------------
Config Portb = Output
Config Portd = Output
Config Portc = Output
'----------------------------------------- Timer ------------------------------
'------------------------------------------ Subs -----------------------------
Declare Sub Blinken
Declare Sub Rolloauf
Declare Sub Rolloab
Declare Sub Rolloaufcheck
Declare Sub Rolloabcheck
Declare Sub Hochzehlen
'-------------------------------------- Dims --------------------------------
Dim I As Byte
Dim Temp1 As Byte
Dim Adresse As Byte
Dim Funktion As Byte
'Dim Myadress As Byte
Dim Stoppbyte As Byte
Dim X As Byte
Dim Rauf As Bit
Dim Rab As Bit
Dim Uauf As Bit
Dim Uab As Bit
'-------------------------------- Aliasse ------------------------------------
Auf Alias Portc.4
Ab Alias Portc.5
Rs485 Alias Portd.2
Led Alias Portb.1
'------------------------------------------ Syncbytes ------------------------
Const Sync = &B01010100
Const Myadress = &H02
'------------------------------------ Call Blinken ------------------------------
Call Blinken
Auf = 0
Ab = 0
Rauf = 0
Rab = 0
Ueberlauf = 0
'------------------------------------ Hauptroutine --------------------------
_start:

Temp1 = Waitkey()
If Temp1 <> Sync Then
Goto _start
Else
Inputbin Adresse , Funktion , Stoppbyte

If Adresse <> Myadress Then Goto _start

If Funktion = &H01 Then Goto Rolloauf
If Funktion = &H02 Then Goto Rolloab

If Stoppbyte = &H7F Then Goto _start


End If
'--------------------------------------- Rolloauf -----------------------------
Rolloauf:
Led = 1
Waitms 100
Led = 0

If Rab = 1 Then
Goto _start
Else
Toggle Auf : Toggle Rauf
End If
Goto Rolloaufcheck
'--------------------------------------- Rolloaufcheck ----------------------
Rolloaufcheck:
Goto _start
'------------------------------------- Rolloab -------------------------------
Rolloab:
Led = 1
Waitms 100
Led = 0

If Rauf = 1 Then
Goto _start
Else
Toggle Ab : Toggle Rab
End If
Goto Rolloabcheck
'----------------------------------- Rolloabcheck ------------------------
Rolloabcheck:
Goto _start
'------------------------------------------ Hochzehlen -------------------
Hochzehlen:
Return
'-------------------------------- Blinken --------------------------------------
Blinken:
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Return


Nur wie stelle ich es an, das die Relais nach 10 Sekunden wieder abfallen ?
Ich habe versucht, durch den Timer1 ne Variable hochzählen zu lassen, aber das hat nicht geklappt.

Hab es so probiert :



'--------------------------------- Chip Definiton ----------------------------
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 1200
'--------------------------------- Portdefinition ----------------------------
Config Portb = Output
Config Portd = Output
Config Portc = Output
'----------------------------------------- Timer ------------------------------
Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Enable Timer1
On Timer1 Hochzaehlen
'------------------------------------------ Subs -----------------------------
Declare Sub Blinken
Declare Sub Rolloauf
Declare Sub Rolloab
Declare Sub Rolloaufcheck
Declare Sub Rolloabcheck
Declare Sub Hochzaehlen
'-------------------------------------- Dims --------------------------------
Dim I As Byte
Dim Temp1 As Byte
Dim Adresse As Byte
Dim Funktion As Byte
'Dim Myadress As Byte
Dim Stoppbyte As Byte
Dim X As Byte
Dim Rauf As Bit
Dim Rab As Bit
Dim Uauf As Bit
Dim Uab As Bit
Dim Timerwert As Byte
'-------------------------------- Aliasse ------------------------------------
Auf Alias Portc.4
Ab Alias Portc.5
Rs485 Alias Portd.2
Led Alias Portb.1
'------------------------------------------ Syncbytes ------------------------
Const Sync = &B01010100
Const Myadress = &H02
'------------------------------------ Call Blinken ------------------------------
Call Blinken
Auf = 0
Ab = 0
Rauf = 0
Rab = 0
Timerwert = 0
'------------------------------------ Hauptroutine --------------------------
_start:

Temp1 = Waitkey()
If Temp1 <> Sync Then
Goto _start
Else
Inputbin Adresse , Funktion , Stoppbyte

If Adresse <> Myadress Then Goto _start

If Funktion = &H01 Then Goto Rolloauf
If Funktion = &H02 Then Goto Rolloab

If Stoppbyte = &H7F Then Goto _start


End If
'--------------------------------------- Rolloauf -----------------------------
Rolloauf:
Led = 1
Waitms 100
Led = 0

If Rab = 1 Then
Goto _start
Else
Toggle Auf : Toggle Rauf : Timerwert = 0 : Start Timer1
End If
Goto Rolloaufcheck
'--------------------------------------- Rolloaufcheck ----------------------
Rolloaufcheck:
Goto _start
'------------------------------------- Rolloab -------------------------------
Rolloab:
Led = 1
Waitms 100
Led = 0

If Rauf = 1 Then
Goto _start
Else
Toggle Ab : Toggle Rab : Timerwert = 0 : Start Timer1
End If
Goto Rolloabcheck
'----------------------------------- Rolloabcheck ------------------------
Rolloabcheck:
Goto _start
'------------------------------------------ Hochzehlen -------------------
Hochzaehlen:
Timerwert = Timerwert + 1
If Timerwert = 10 Then Ab = 0 : Toggle Rab
If Timerwert = 11 Then Auf = 0 : Toggle Rauf

Return
'-------------------------------- Blinken --------------------------------------
Blinken:
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Return



Wie könnte ich das denn richtig lösen ? vielen dank

mfg Kay

Marco78
16.11.2006, 21:05
Declare Sub Blinken
Declare Sub Rolloauf
Declare Sub Rolloab
Declare Sub Rolloaufcheck
Declare Sub Rolloabcheck
Declare Sub Hochzaehlen

Mal gut das der M8 genug Speicher hat!


Declare Sub Hochzaehlen

Ist schon durch den Timer deklariert. Probier mal ob es ohne diese Zeile geht.

Woher weisst du, das der Timer so immer eine Sekunde zählt?

BlaueLed
16.11.2006, 21:29
ich habe vorher ne led togglen lassen, und habe gesehen, dass es ungefähr ne sekunde ist. mir kommts net auf die genau sekunden an. nur halt ca. 10 - 15 sekunden.

auch wenn ich die Zeile

Declare Sub Hochzeahlen weg mache funktioniert es nicht.

vielleicht habe ich auch mein programm zu umständlich geschrieben. Ich will nur ,das wenn ein relais angezogen ist, das andere "blockiert" ist. Und wenn eins angezogen hat, soll es nach x sekunden abfallen.

mfg Kay

Marco78
16.11.2006, 21:59
Toggle Ab : Toggle Rab : Timerwert = 0 : Start Timer1

Der Timer wird im Programm ja nie gestoppt.


If Timerwert = 10 Then Ab = 0 : Toggle Rab
If Timerwert = 11 Then Auf = 0 : Toggle Rauf

Mit den : wird ein neuer Befehl eingeleitet.
Anders geschrieben würde es so aussehen:


Hochzaehlen:
Timerwert = Timerwert + 1
If Timerwert = 10 Then Ab = 0
Toggle Rab
If Timerwert = 11 Then Auf = 0
Toggle Rauf

Return


Oder noch anders geschrieben:


Hochzaehlen:

Timerwert = Timerwert + 1

If Timerwert = 10 Then Ab = 0
If Timerwert = 11 Then Auf = 0

Toggle Rab
Toggle Rauf

Return


Also wird nach jede (fast) Sekunde Rab und Rauf getoggelt.

Richtig wäre

Hochzaehlen:
Timerwert = Timerwert + 1
If Timerwert = 10 Then Ab = 0 : Toggle Rab : End If
If Timerwert = 11 Then Auf = 0 : Toggle Rauf : End If

Return

Ohne Kommentare ist es auch schwer nachzuvollziehen, was das Programm bewirken soll.

Aber ich denke mal, das ist schonmal ein großer Fehler.

BlaueLed
16.11.2006, 22:33
also ich habe das programm jetzt nochmal sehr vereinfacht, ohne Verriegelung der Relais und ohne Timer.



'--------------------------------- Chip Definiton ----------------------------
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 1200
'--------------------------------- Portdefinition ----------------------------
Config Portb = Output
Config Portd = Output
Config Portc = Output
'----------------------------------------- Timer ------------------------------
Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Enable Timer1
'------------------------------------------ Subs -----------------------------
Declare Sub Blinken
Declare Sub Rolloauf
Declare Sub Rolloab
'-------------------------------------- Dims --------------------------------
Dim I As Byte
Dim Temp1 As Byte
Dim Adresse As Byte
Dim Funktion As Byte
'Dim Myadress As Byte
Dim Stoppbyte As Byte
Dim X As Byte
'-------------------------------- Aliasse ------------------------------------
Auf Alias Portc.4
Ab Alias Portc.5
Rs485 Alias Portd.2
Led Alias Portb.1
'------------------------------------------ Syncbytes ------------------------
Const Sync = &B01010100
Const Myadress = &H02
'------------------------------------ Call Blinken ------------------------------
Call Blinken
Auf = 0 ' Relais Auf = 0
Ab = 0 ' Relais Ab = 0
'------------------------------------ Hauptroutine --------------------------
_start: ' RS485 Bus einlesen

Temp1 = Waitkey()
If Temp1 <> Sync Then
Goto _start
Else
Inputbin Adresse , Funktion , Stoppbyte

If Adresse <> Myadress Then Goto _start

If Funktion = &H01 Then Goto Rolloauf
If Funktion = &H02 Then Goto Rolloab

If Stoppbyte = &H7F Then Goto _start


End If
'--------------------------------------- Rolloauf -----------------------------
Rolloauf: ' Relais Auf umschalten
Led = 1
Waitms 100
Led = 0
Toggle Auf
Goto _start
'------------------------------------- Rolloab -------------------------------
Rolloab: ' Relais Ab umschalten
Led = 1
Waitms 100
Led = 0
Toggle Ab
Goto _start
'-------------------------------- Blinken --------------------------------------
Blinken:
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Portb.1 = 1
Waitms 100
Portb.1 = 0
Waitms 100
Return


Gibt es denn eine einfache Weise, die Relais gegenseitig zu verriegeln, ohne großartig viele Hilfsvariablen ?

matlen
17.11.2006, 04:16
Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Enable Timer1
On Timer1 Hochzaehlen

So wird dein Timer dochauch nie ausgelöst!

Du mußt noch den Time befehle setzen damit die Timervariable auch hochgezählt wird.
Timer1 = 3035 'Timer wird jede sekunde aufgerufen

Timer1= 3035 muß auch in deiner Hochzaelen vorhanden sein. Nun kannst du eine Variable Hochzählen und nach 10 sec dein Befehl ausführen.

Marco78
17.11.2006, 08:28
Do

Temp1 = Waitkey()
If Temp1 <> Sync Then Loop

Inputbin Adresse , Funktion , Stoppbyte

If Adresse <> Myadress Then Loop

If Funktion = &H01 Then Gosub Rolloauf
If Funktion = &H02 Then Gosub Rolloab

If Stoppbyte = &H7F Then Loop

Loop


Rolloauf:

Auf = 1
Wait 10
Auf = 0
Return

Rolloab:

Ab = 1
Wait 10
Ab = 0
Return



Was hälst du erstmal davon?
Durch das Wait 10 ist es unmöglich, das ein anderes Relais angesteuert wird.

BlaueLed
17.11.2006, 16:34
hi, das ist ne gute idee. nur leider ist es dann nicht möglich, während dem warten noch andere dinge mit dem avr zu machen. deswegen wollte ich den timer verwenden.

mfg Kay