-         

Ergebnis 1 bis 8 von 8

Thema: Relais nach x Sekunden abfallen lassen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    36
    Beiträge
    318

    Relais nach x Sekunden abfallen lassen

    Anzeige

    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 ) :

    Code:
    '--------------------------------- 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 :

    Code:
    '--------------------------------- 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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    36
    Beiträge
    318
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    36
    Beiträge
    318
    also ich habe das programm jetzt nochmal sehr vereinfacht, ohne Verriegelung der Relais und ohne Timer.

    Code:
    '--------------------------------- 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 ?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    17.09.2006
    Beiträge
    11
    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    36
    Beiträge
    318
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •