Ansteuerung eines DC Motors mit Lichtschranke und Näherungsschalter. Codefrage.

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Hallo alle zusammen.
      Dieses Problem ist schon etwas betagter, aber ich bin derzeit mit einem PWM-Problem "schwanger".

      Leider kann ich nicht erkennen, wie ich die "Compare a" für weitere verarbeitungen anfassen kann.
      Ich habe schon einiges nachgetrickt aber es will mit nicht gelingen.

      Wie, also, kann ich Compare a in eine PWM_wert bekommen, damit ich dann am Port z.b. einen Motor o.ä. ansteuern kann???

      " pwm_wert = compare1a "
      funktioniert nicht.

      in der Hoffnung einer Aufklärung schon mal vielen Dank für Eure Zeit.
      frank
    • Hallo Michael
      Danke für Deine Antwort.
      Ich verstehe das so:
      Der Timer hat doch in seiner Config stehen:
      "compare a pwm = clear up"
      also steht doch im Reister ein Wert. Den will ich doch weiterverarbeiten, oder nicht??
      Deshalb habe ich pwm_wert =compare1a gedacht.
      Nach dem Datenbllatt sind die pwm-Ausgänge bei diesem Chip D4 bis D7. Aber es wurde
      hier ein Motor angesteuert, der nicht an diesen PINs liegt.
      Da wird über "A.." der Motor mit dem PWM versorgt, warum? wie ?

      frank
    • dd0ow schrieb:

      Der Timer hat doch in seiner Config stehen:
      "compare a pwm = clear up"
      also steht doch im Reister ein Wert.
      nein, das Register mit dem PWM-Wert (compare1a z.B.) wird in der Config-Zeile nicht gesetzt.
      In der Config legst du fest, ob bei zunehmendem Wert für das Register(compare1a) die Ausgangspwm größer oder kleiner wird.
      clear down wäre dann die invertierte Ausgabe.

      dd0ow schrieb:

      Nach dem Datenbllatt sind die pwm-Ausgänge bei diesem Chip D4 bis D7. Aber es wurde
      hier ein Motor angesteuert, der nicht an diesen PINs liegt.
      Da wird über "A.." der Motor mit dem PWM versorgt, warum? wie ?
      Der Beitrag, auf den du geantwortet hast, ist fast 4 Jahre alt.
      Es wäre angebracht, du postest das Programm, worauf du dich beziehst oder zumindest den Link darauf oder wenigstens die Nummer hier im Thread.
      Dann kann man auch helfen ;)
    • dd0ow schrieb:

      Nach dem Datenbllatt sind die pwm-Ausgänge bei diesem Chip D4 bis D7
      Daher meine Frage nach dem Programm.
      Dort würde der Chip drin stehen und ich wüsste, ob die Pins auch PWM-Werte liefern können.
      Der Attiny85 kann es z.B. nicht.

      dd0ow schrieb:

      Es war in diesem Thread der Beitrag 97 (??).
      Dort steht nur ein Bruchstück, kein Prozessor, keine Stackwerte, keine Variablen.
      Poste einfach dein Programm mit dem Problem.

      Das mit dem Register Compare1a hast du aber verstanden?
    • Moin
      Es war 107, da ist dieser Code veröffentlicht. Den meine ich:
      'AVR Konfigurierung_____________________________________________________________
      $regfile = "m644pdef.dat"
      $crystal = 20000000
      $hwstack = 40
      $swstack = 16
      $framesize = 32
      $baud = 9600


      'Timer1 Konfigurierung als HW PWM_______________________________________________
      Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1


      'Anschluss- Konfigurierung______________________________________________________
      Config Pina.5 = Input 'Endschalter auf NO für Endposition oben mit Pullup
      Oben_no Alias Pina.5
      Porta.5 = 1


      Config Pina.7 = Input 'Naeherungssensor bei ausgelöst low für oben
      Naeherung_oben Alias Pina.7


      Config Pina.4 = Input 'Endschalter auf NO für Endposition unten mit Pullup
      Unten_no Alias Pina.4
      Porta.4 = 1


      Config Pina.6 = Input 'Naeherungssensor bei ausgelöst low für oben
      Naeherung_unten Alias Pina.6


      Config Pina.1 = Input 'Taster zum manuellen ansteuern der Hebeanlage
      Taster Alias Pina.1
      Porta.1 = 1


      Config Porta.3 = Output 'Enabelausgang der H-Bruecke fuer hochfahren
      Pwm_l_en Alias Porta.2


      Config Pina.2 = Output 'Enabelausgang der H-Bruecke fuer hochfahren
      Pwm_r_en Alias Porta.3


      'LCD Konfigurierung_____________________________________________________________
      Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _
      Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0



      Config Lcd = 16 * 2 '2x16 Zeichen
      Config Lcdbus = 4 '4Bit Modus
      Cursor Off 'Cursor aus
      Cls 'Display loeschen


      'Werbung________________________________________________________________________
      Locate 1 , 1 : Lcd " LiftUP "
      Locate 2 , 1 : Lcd " By Prytek "
      Wait 2
      Cls


      'Konstannten für Fahrgeschwindigkeit____________________________________________
      Const Motor_langsam = 850
      Const Motor_schnell = 1000


      'Variablen setzen_______________________________________________________________
      Dim Status As Bit
      Dim Neustart As Bit
      Dim Sensor_erreicht As Bit
      Dim Empfang As Byte
      Dim Ascii_code As Byte
      Dim Pwm_wert As Word
      Dim Verzoegerung As Word


      'Ausgaenge alle AUS_____________________________________________________________
      Status = 0
      Neustart = 0
      Sensor_erreicht = 0
      Pwm_wert = 0
      Verzoegerung = 0
      Compare1a = 0 'PWM zum fahren
      Reset Pwm_l_en
      Reset Pwm_r_en


      'Anzeige vor Selbsttest_________________________________________________________
      Locate 1 , 1 : Lcd " Standby... "
      Locate 2 , 1 : Lcd " "
      Wait 1


      'Hauptschleife #################################################################
      'Selbsttest_____________________________________________________________________
      Do
      'Falls während der Fahrt mal der Strom weg sein sollte und der TV irgendwo stehen geblieben ist
      'wird hier geprüft


      If Neustart = 0 Then
      If Oben_no = 1 And Unten_no = 1 Then Gosub Back
      Neustart = 1


      'Anzeige nach Selbsttest________________________________________________________
      Locate 1 , 1 : Lcd " Ready! "
      Locate 2 , 1 : Lcd " Press to start "
      End If


      'Auswertung des Tasters und BlueTooth___________________________________________
      Empfang = Ischarwaiting()
      If Taster = 0 Or Empfang = 1 Then
      Ascii_code = Inkey()
      If Status = 0 Or Ascii_code = 97 Then
      Gosub Fahrhoch
      Elseif Status = 1 Or Ascii_code = 65 Then
      Gosub Fahrrunter
      End If
      End If


      Loop
      End


      'Unterprogramme ################################################################
      'Vorbereitung fuer Zuruecksetzen des Schlittens_________________________________
      Back:
      Locate 1 , 1 : Lcd "Reset to start.."
      Locate 2 , 1 : Lcd " "
      Reset Pwm_l_en
      Set Pwm_r_en
      Gosub Fahrrunter_start
      Return


      'Routine zum normalen hoch fahren_______________________________________________
      Fahrhoch:
      Locate 1 , 1 : Lcd ">>>>>>>>>>>>>>>>"
      Locate 2 , 1 : Lcd " "
      Reset Pwm_r_en
      Set Pwm_l_en
      Gosub Anfahren
      Do
      If Naeherung_oben = 0 And Sensor_erreicht = 0 Then Gosub Langsam_werden
      Loop Until Unten_no = 1 And Oben_no = 0
      Gosub Stoppen
      Locate 1 , 1 : Lcd ">>>>>Above<<<<< "
      Locate 2 , 1 : Lcd " "
      Status = 1
      Return


      'Routine zum normalen runterfahren______________________________________________
      Fahrrunter:
      Locate 1 , 1 : Lcd " "
      Locate 2 , 1 : Lcd "<<<<<<<<<<<<<<<<"
      Reset Pwm_l_en
      Set Pwm_r_en
      Gosub Anfahren
      Do
      If Naeherung_unten = 0 And Sensor_erreicht = 0 Then Gosub Langsam_werden
      Loop Until Unten_no = 0 And Oben_no = 1
      Gosub Stoppen
      Locate 1 , 1 : Lcd " "
      Locate 2 , 1 : Lcd ">>>>>Below<<<<< "
      Status = 0
      Return


      'Unterprogramm zum zurecksetzen des Schlittens__________________________________
      Fahrrunter_start:
      Do
      Compare1a = 600
      Loop Until Unten_no = 0 And Oben_no = 1
      Compare1a = 0
      Reset Pwm_l_en
      Reset Pwm_r_en
      Locate 1 , 1 : Lcd " "
      Locate 2 , 1 : Lcd ">>>>>Below<<<<< "
      Return


      'Routine zum anfahren des Schlittens____________________________________________
      Anfahren:
      Do
      'Die Verzögerung ist fuer ein langsameres Anfahren
      If Verzoegerung = 100 Then
      Verzoegerung = 0
      Incr Pwm_wert
      Compare1a = Pwm_wert 'Pwm_wert
      End If
      Incr Verzoegerung
      Loop Until Pwm_wert = Motor_schnell
      Verzoegerung = 0
      Return


      'Routine zum langsam werden gegen Ende der Fahrt________________________________
      'Wird angesprungen wenn Position vor Endschalter erreicht ist
      Langsam_werden:
      Do
      'Die Verzögerung ist für ein langsameres anhalten gedacht und der Wert 2500 lässt sich auch anpassen
      If Verzoegerung = 100 Then
      Verzoegerung = 0
      Decr Pwm_wert
      Compare1a = Pwm_wert
      End If
      Incr Verzoegerung
      Loop Until Pwm_wert = Motor_langsam
      Verzoegerung = 0
      Sensor_erreicht = 1
      Return


      'Routine zum stoppen der Fahrt__________________________________________________
      'Wird angesprungen wenn Endschalter auslöst
      Stoppen:
      Do
      Decr Pwm_wert
      Compare1a = Pwm_wert
      Loop Until Pwm_wert = 0
      Reset Pwm_l_en
      Reset Pwm_r_en
      Compare1a = 0
      Sensor_erreicht = 0
      Return
    • dd0ow schrieb:

      Config Lcdbus = 4 '4Bit Modus
      Der Atmega644 hat kein externes Speicherinterface, das LCD hängt daher nicht auf dem Bus.
      Eine Busadresse hätte dann auch noch gefehlt.
      Hier ist ein Beispiel, wie das aussieht im Programm: avrhelp.mcselec.com/config_lcdbus.htm

      Lass den Befehl einfach weg, der wurde mal irgendwann falsch in ein Tutorial geschrieben und hält sich hartnäckig im Netz.


      Ich vermisse im Programm die Deklaration des PWM-Pins als Output.

      Ich würde dir hier ans Herz legen, das Programm erstmal abzuspecken, um mit der Thematik PWM vertraut zu werden.
      In der Hauptschleife einfach mal eine Anweisung, um zu sehen, ob die Hardware überhaupt reagiert:

      Do

      Compare1a = 50
      Wait 5
      Compare1a = 512
      Wait 5
      Compare1a = 1000
      Wait 5

      Loop

      Wenn das funktioniert, das wäre schonmal die halbe Miete.