-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Von Unterprogramm zum Hauptprogrammanfang springen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.11.2006
    Beiträge
    30

    Von Unterprogramm zum Hauptprogrammanfang springen

    Anzeige

    Moin,
    ich sitz da jetzt schon einige Stunden drüber, und komm nicht drauf wie ich das am besten lösen kann. Ich möchte eine Zeitschaltung für meinen Lötkolben bauen. Dafür soll wenn ein Taster gedrückt wird der Lötkolben angehen. Wenn eine Zeit von 29.30min überschritten ist soll ein Alarm losgehn. Dann, 30 sek später, soll der Lötkolben samt Alarm abgeschaltet werden.
    doch der "Countdown" soll jederzeit durch druck auf den Taster wieder auf Null gestellt werden. (auch während des Alarmes)

    Aber mein Programm funktioniert nicht so wie ich mir das vorstelle, könnt ihr mir villeicht sagen wo mein Fehler liegt?

    und ob es überhaupt möglich ist aus einem Unterprogramm zum Hauptprogramm-anfang zu springen?

    Mfg Hübi

    Code:
     
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 ' ATtinny 2313
    $crystal = 1000000                                          'Quarz: 1,0 MHz
    
    
    '******** Deklarationen ********
    
    '******** Initialisierung ********                                                 '
       Enable Int0
       Enable Interrupts
       On Int0 Taste0int
    
       Ddrb = &B11111111                                        ' port B als Ausgang
       Ddrd = &B0100000                                         ' pin D2 asl eingang
       Portd.2 = 1                                              ' interne pullup widerstände aktivieren
    '******** Hauptprogramm ********
    
     Do
         Start:
         If Pind.2 = 0 Then                                     'Wenn Taster Pind.2 gedrückt, dann
              Portb = &B10000000                                'Lötkolben an
           Wait 1770                                            ' warte 29.30 min
              Portb = &B11000000                                ' Alarm wird zugeschaltet (spätestes jetzt könnte man resetten)
           Wait 30                                              ' warte 30 Sekunden
              Portb = &B00000000                                ' alles wird ausgeschaltet
    
         End If
    Loop
    '******** Unterprogramme ********
     Taste0int:
          Sound Portd.0 , 1000 , 82                             'wenn Taster Pind.2 gedrückt, dann piept es
          Goto Start                                            ' Springe zu start und fange von vorn an
    
    
    End

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    Taste0int ist kein Unterprogramm in dem Sinne, sondern eine ISR (Interrupt).
    Da kann man nicht ungestraft in das Hauptprogramm zurückspringen !

    Du kannst Dir aber eine Variable anlegen, die im Hauptprogramm abgefragt wird, und in der ISR gesetzt wird, damit man den Tastendruck mitbekommt.
    Ein Sound in der ISR kommt auch nicht gut, würde ich auch in die Hauptschleife legen und über eine Variable starten.
    Statt dem Wait 1770 machst Du Wait 1 und zB. eine For-Schleife drumrum die bis 1770 zählt, und die Variable der ISR abgefragt wird, wenn die Variable gesetzt ist (also einen bestimmten Wert hat), einfach Sound aufrufen, For-Schleife beenden usw.

    So in der Richtung würde ich das anfangen.
    Eine Sekunde Verzögerung ist hier ja kein Problem.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.11.2006
    Beiträge
    30
    Moin

    danke für deine schnelle Antwort, ich habe versucht das was du sagst umzusetzten aber irgentwie haut das nicht so richtig hin, ich hoffe die Ansätze sind wenigstens richtig
    mfg Hübi


    Code:
     
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 '
    $crystal = 1000000                                          'Quarz: 1,0 MHz
    
    
    '******** Deklarationen ********
    Dim A As Word
    '******** Initialisierung ********                                                 '
       Enable Int0
       Enable Interrupts
       On Int0 Taste0int
    
       Ddrb = &B11111111                                        ' port B als Ausgang
       Ddrd = &B0100000                                         ' pin D2 asl eingang
       Portd.2 = 1                                              ' interne pullup widerstände aktivieren
    
    '******** Hauptprogramm ********
    
     Do
         If Pind.2 = 0 Then Portb = &B10001000
                 Wait 1
                 A = A + 1
                 If A > 1770 Then
                   Portb = &B11000000
                 End If
                 If A > 1800 Then
                   Portb = &B00000000
                 End If
    
    Loop
    '******** Unterprogramme ********
    Taste0int:
          A = 0
    
    End

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099
    Hallo

    du müsstest praktisch a nicht als null setzen sondern als 1 weil 0 = 0+ 1 wäre wieder null aber wenn 1 = 1+1 =2 usw. dann zählt er.

    hier der code: mit Print gibste RS232 aus und kannst dann schauen das er hoch zählt.

    Code:
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 '
    $crystal = 1000000                                          'Quarz: 1,0 MHz
    
    
    '******** Deklarationen ********
    Dim A As Word
    '******** Initialisierung ********                                                 '
       Enable Int0
       Enable Interrupts
       On Int0 Taste0int
    
       Ddrb = &B11111111                                        ' port B als Ausgang
       Ddrd = &B0100000                                         ' pin D2 asl eingang
       Portd.2 = 1                                              ' interne pullup widerstände aktivieren
    
    '******** Hauptprogramm ********
    
     Do
         If Pind.2 = 0 Then Portb = &B10001000
                 Wait 1
                 A = A + 1
                 Print A
                 If A > 1770 Then
                   Portb = &B11000000
                 End If
                 If A > 1800 Then
                   Portb = &B00000000
                 End If
    
    Loop
    '******** Unterprogramme ********
    Taste0int:
          A = 1
    
    End

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Bei den If-Abfragen musst Du noch ausschliessen, das beide gleichzeitig zutreffen können, wenn der Wert über 1800 ist, ist er auch über 1770 !
    Die Zeit dazwischen ist zwar sehr kurz, aber dazwischen wird erstmal der Ausgang gesetzt.
    Erst den höheren Wert abfragen und im Else den kleineren, dann werden nicht beide ausgeführt.

    Vielleicht kann man auch so abfragen, solange der Wert kleiner 1770 ist, den einen Ausgang setzen, wenn >1800 alles aus, ansonsten Ausgang und Alarm.

    Evtl. musst Du noch den Int0 konfigurieren, denn da kommt nix vor.
    Jetzt wird ein Int ausgelöst solange der Pegel Low ist.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    28.11.2006
    Beiträge
    30
    so, ich hoffe nun stimmt es,

    @patti16 du meinst wenn ich ein Display anschließe oder?

    Code:
     '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 '
    $crystal = 1000000                                          'Quarz: 1,0 MHz
    
    
    '******** Deklarationen ********
    Dim A As Word
    '******** Initialisierung ********
       Config Int0 = Falling                                    '
       Enable Int0
       Enable Interrupts
       On Int0 Taste0int
    
       Ddrb = &B11111111                                        ' port B als Ausgang
       Ddrd = &B0100000                                         ' pin D2 asl eingang
       Portd.2 = 1                                              ' interne pullup widerstände aktivieren
    
    '******** Hauptprogramm ********
    
     Do
         If Pind.2 = 0 Then Portb = &B10000000
                 Wait 1
                 A = A + 1
                 If A > 1800 Then
                   Portb = &B00000000
                  End If
                 If A > 1770 Then
                   Portb = &B11000000
                   Else
                   Portb = &B10000000
                 End If
    
    Loop
    '******** Unterprogramme ********
    Taste0int:
          A = 1
    
    End

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    29
    Beiträge
    1.099
    ich meine die Belgung der Ports im Programm von mir musste auf deins übertragen falls es nicht gleich angeschlossen ist.

    haste mal probiert?

    gruß
    patrick

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    hallo , habe mir auch mal ein paar gedanken gemacht.
    also im simulator läuft das prog. und auf meinem bord auch
    der einfachheitshalber habe ich mal die zeiten 1770 in 170
    und 1800 in 180 geändert,damit es schneller abläuft im test.
    also wieder in deine zeiten ändern.

    gruß mike

    Code:
    '--------------------------------------------------------------
    $regfile = "attiny2313.dat"                                 '
    $crystal = 1000000                                          'Quarz: 1,0 MHz
    '$sim
    
    '******** Deklarationen ********
    Dim A As Word
    
    
       Ddrb = &B11111111                                        ' port B als Ausgang
       Ddrd = &B0100000                                         ' pin D2 asl eingang
       Portd.2 = 1                                              ' interne pullup widerstände aktivieren
    
    '******** Hauptprogramm ********
    Portb.1 = 1        'zeigt ausgeschalteten zustand an
    Main1:
    
    Do
    
    If Pind.2 = 0 Then
    Goto Main2
    Else
    End If
    
    Loop
    
    Main2:
    
    Portb = &B10000000
    
    
    Do
    
    If Pind.2 = 0 Then
    A = 0
    Portb = &B10000000
    Else
    End If
    
     Wait 1
      A = A + 1
      Print A
       Toggle Portb.0         'lötkolben an
         If A > 177 Then
          Portb = &B11000000
           Sound Portd.0 , 1000 , 82
         End If
    
      If A > 180 Then
       Portb = &B00000000
      End If
    
    Loop Until A > 180
    
    Portb.1 = 1               'zeigt ausgeschalteten zustand an
    
    Do
    
    If Pind.2 = 0 Then Goto Main1
    
    Loop
    
    End

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    @Hübi:
    Fast, die Abfrage nach den 1700 noch in das Else der 1800, denn sonst geht es nie aus:
    Code:
      If A > 1800 Then
                   Portb = &B00000000
               else
                 If A > 1770 Then
                   Portb = &B11000000
                   Else
                   Portb = &B10000000
                 End If
             End If
    Also wenn der Wert über 1800 kommt ist alles aus,
    ist er unter 1800 aber über 1770 geht der Alarm mit an,
    ist der unter 1770 ist nur der Ausgang eingeschaltet.

    Ob in der ISR auf 0 oder 1 gesetzt wird ist eigentlich egal,
    bei 0 läuft die Schleife eine Sekunde länger.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.12.2006
    Alter
    51
    Beiträge
    117
    man kann nach der until abfrage die do loop schleife durch goto main1
    ersetzten , sonst ist es ja doppelt gemobbelt.

    hallo linux_80 :
    ist dein prog-beitrag auf meinen code gemünzt,oder ?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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