-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Mehrere Programme gleichzeitig laufen lassen geht nicht.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.02.2005
    Alter
    27
    Beiträge
    23

    Mehrere Programme gleichzeitig laufen lassen geht nicht.

    Anzeige

    Hallo
    Ich mache für die Schule ein Projekt, ich baue einen Überwachungsroboter. dazu verwende ich den ATMega32 und programmiere mit Bascom.

    Wie kann man ein Sub Programm und eine Funtion gleichzeitig ausführen?
    Also im Klaren der Roboter muss zwei LEDs abwechselnd blinken lassen
    und dabei noch einen Analog-Port überwachen? (noch besser 3 Analog-Porte)
    Wenn das Sub-programm für die LEDs läuft kann ich nicht gleichzeitig
    einen Analog-Port (oder die Taster) überwachen.
    Danke schon im Voraus

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Multitaskfähig ist ein AVR nicht.
    Ist das blinken von irgendwas abhänig? Sonst kannst du dafür einfach ein Timer programmieren.
    Wenn die blinken nicht im ms-Takt erfolgen muss, sollte dein Problem zu lösen sein.
    Bei 16MHz arbeitet der Prozessor fast 16.000.000 Schritte in der Sekunde ab. Analogwerte auslesen benötigt etwa 7 Schritte. Dazu kommen dann noch die Schritte um die Werte auszuwerten. Das Wechselblinken wird auch nicht mehr als 100 Schritte beanspruchen.

    Probier erstmal deine Anwendung zu programmieren und schau dann ob noch alles schnell genug läuft.

    Wie gesagt, für's blinken könntest du ein Timer programmieren.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Wie kann man ein Sub Programm und eine Funtion gleichzeitig ausführen?
    Dein PC kann auch nicht mehrere Aufgaben gleichzeitig ausführen. Der arbeitet auch alle Programmbefehle nacheinander ab, da sorgt nur das Betriebssystem dafür, dass ständig zwischen den einzelnen Tasks gewechselt wird und es wie echtes Multitasking aussieht.

    Dein AVR ist so schnell, dass du mit blossem Auge ganz sicher nicht feststellen wirst, wenn die LEDs nacheinander geschaltet und zwischendurch noch ein paar Sensoren abgefragt werden.

    Dass du im deinem Programm selber dafür sorgen musst, dass die einzelnen Aufgaben schnell genug nacheinander ausgeführt werden, mag etwas lästig erscheinen, ist aber eigentlich meist sogar einfacher.

    Bei Mutitasking und Multithreading ist es oft ganz schön kompliziert die einzelnen Threads und Tasks zu synchronisieren.
    Wenn ein Thread schon auf das Messergebnis reagieren würde, bevor der andere Thread überhaupt gemessen hat, wäre das ja auch nicht so toll.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo,

    Dass blinken konnte mann am einfachsten mit einem Zeit verzogerungs Schleife (in 'C' for(i=0;i<Wert;i++) realisieren aber dann wird alle processorzeit vom verzogerung function (unnotig) benutzt.

    Am besten man benuzt so wie schon gesagt ein Timer der z.B jeden Zehntel Sekunde (0.1 Sek.) ein Interrupt generiert. Nuzte ein 10-zahler variabelen um die Leds jeden einzelne Sekunde 1-mahl blinken zu lassen und nutze die Interrupt (10 mahl pro Sekunde) um die Ports jedesmahl einmal zu uberprufen.

    Damit ist 99% der Prozessorzeit noch frei fur andere Sachen.

    So eine idee,

    gruss

    Henk

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.02.2005
    Alter
    27
    Beiträge
    23
    Hallo
    Danke für die vielen Ideen zum Blinken, dass funtioniert jetzt jetzt muss ich noch 3 Ports überwachen, zuerst ein Port alleine das geht und später sollte er zwei ports überwachen um einer Linie nach zufahren.
    Ich weiss nicht wie ich zwei Ports miteinander überwachen soll oder gibt es noch eine andere Lösung?
    Danke schon im Voraus

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Analogports?
    B=GETADC(1)
    C=GETADC(2)

    Beides nacheinander abfragen.

    Bei digitalen Ports das gleiche.

    Ich glaube du traust deinem AVR zu wenig zu
    Bedenke, das er bei 16MHz etwa 16.000.000 Befehle pro Sekunde ausführt. (Ein PIC nur etwa 8.000.000 bei 16MHZ (et gibt aber auch µC die 4 Takte pro Befehl benötigen.))
    Falls deine Angst ist, das nicht die besagten Ports gleichzeitig angefragt werden können, kann ich dich beruhigen. Das geht tatsächlich nicht. Aber wie hier auch schon gesagt, kann ein PC das auch nicht!
    Das Abfragen von 2 digitalen Ports nacheinander benötigt 2 Taktzyklen. Bei 16MHz und damit 16 Millionen Takte pro Sekunde kannst du dir ja ausrechenen, wie viele µs es dauert, bis dein AVR weiss, ob die abgefragten Ports High oder Low sind.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Zitat Zitat von Marco78
    ..Ich glaube du traust deinem AVR zu wenig zu
    Noch'n Vergleich: Hat es Dich schon jemals gestört, daß Dein Fernseher in Wirklichkeit immer nur einen einzigen verwuzelten Punkt am Schirm darstellen kann und erst in deinen Hirn überhaupt ein Bild entsteht ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.02.2005
    Alter
    27
    Beiträge
    23
    Hallo
    Ich habe die Analogports wie vorgeschlagen abgefragt.
    Oder habe ich trotzdem ein Fehler gemacht ?
    Ich wäre froh wenn mir jemand sagen könte was ich falsch gemacht habe.
    Danke schon im Voraus
    Hier ist noch mein Programmcode
    Code:
    Do
    
       Taste = Bewegungsmelder()
          If Taste <> 0 Then
    
    Select Case Taste
    
            Case 1
             Pwm1a = 0                                          'Linker Motor aus
             Waitms 1000
             Pwm1a = 1023
             Print "Rechts weisse Linie erkannt"
    
            Case 2
             Pwm1b = 0
             Waitms 1000
             Pwm1b = 1023
             Print "Links weisse Linie erkannt"
    
            Case 3
              Waitms 2000
              Porta.4 = 1
              Waitms 800
              Porta.4 = 0
              Waitms 1000
              Porta.4 = 1
              Waitms 500
              Porta.4 = 0
              Waitms 4000
              Porta.4 = 1
              Waitms 500
              Porta.4 = 0
              Waitms 4000
              Porta.4 = 1
              Waitms 500
              Porta.4 = 0
    
              Print "Person gesichtet und fotografiert"
              Waitms 5000
              Call Linieverfolgung
              End Select
       End If
    
      Waitms 100
    Loop
    
    End
    
    
    
    
    Function Bewegungsmelder()
    Local B As Word
    Local C As Word
    Local We As Word
    Bewegungsmelder = 0
                                           'Diese Unterfunktion überwacht den Raum und folgt Der Linie
    Start Adc
    B = Getadc(0)
    C = Getadc(1)
    We = Getadc(2)
       If We < 1010 Then
       Select Case We
       Case 380 To 470
          Bewegungsmelder = 3
    
       Case 535 To 720
          Bewegungsmelder = 3
       End If
       End Select
    
       If B < 1010 Then
       Select Case B
       Case 612 To 820
        Bewegungsmelder = 1
       End If
       End Select
    
       If C < 1010 Then
       Select Case C
       Case 612 To 820
        Bewegungsmelder = 2
       End If
       End Select
    
    End Function

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Ich wäre froh wenn mir jemand sagen könte was ich falsch gemacht habe.
    Was geht denn nicht?
    Reagiert das Programm überhaupt nicht?
    Die Schaltung an den Analogports ist auch richtig?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    15.02.2005
    Alter
    27
    Beiträge
    23
    Der Roboter überwacht den Raum und wenn es eine Person erkennt
    (input von Bewegungsmelder) löst es die Digicam aus und dann macht der Roboter drei Fotos. Bis hier hin geht alles.
    Dann sollte er der Linie nachfahren(um zu lenken schaltet er den linken/rechten Motor kurz aus)
    Bis jetzt hat er ab und zu den linken/rechten Motor ausgeschalten aber nicht wenn es sollte. Weiss nicht was es sein kann

    Was für eine Schaltung muss ich den haben?

    danke schon im voraus

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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