- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: Bin am verzeifeln mit einem Sekundenzähler und PWM

  1. #1

    Bin am verzeifeln mit einem Sekundenzähler und PWM

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo allerseits,

    habe folgendes Problem:
    Hardware: RN-Control board

    Das Programm soll ein Abwärtszähler in Sekunden mit einem PWM Ausgang für einen Servomotor werden. Die Zeit und Geschwindigkeit werden über 2 Encoder eingestellt. Über eine beleuchtete Taste wird der Abwärtszähler eingeschaltet. Der Motor läuft nun mit der eingestellten Geschwindigkeit bis die Zeit abgelaufen ist. Außerdem gibt es noch ein LCD zur Anzeige. Das Programm funktioniert eigendlich. Wenn ich aber versuche einen PWM Ausgang zu programmieren geht gar nichts mehr. Ich habe das versucht über die config servo funktion und über Timer0 = PWM. Hat alles nicht geklappt.

    Es wäre schön wenn einer mal den Code ansieht und mir ein paar Tips gibt, wie man so was richtig programmiert


    Code:
     $regfile = "m32def.dat"                                                   'specify the used micro
          $crystal = 4000000                                                        ' used crystal frequency
          $hwstack = 32                                                             ' default use 32 for the hardware stack
          $swstack = 64                                                             ' default use 10 for the SW stack
          $framesize = 40                                                           ' default use 40 for the frame spaceconfig
    
          Config Clock = Soft                                                       ' Konfiguriere softclock für LCD Anzeige in mm:ss
          Config Debounce = 30                                                      'Konfiguriere Debouncezeit = 30ms
    
         Config Timer1 = Timer , Prescale = 1024                                    'Konfiguriere Timer1 Für Sekundentakt                            '
         Enable Timer1                                                              ' Timer1 einschalten
         On Timer1 Sekundentakt                                                     'Verzweige bei Timer1 überlauf zu   Isr_von_Timer1
         Timer1 = 49900
    
         Enable Interrupts
    
         Config Portb.3 = Input                                                     'Start/Abbruch Taster
         Config Portb.4 = Output                                                    'LED  blinkt während Betrieb
    
         Config Porta.0 = Input
         Config Porta.1 = Input
         Config Porta.2 = Input
         Config Porta.3 = Input
         Config Porta.4 = Input
         Config Porta.5 = Input
    
    
         Portb.3 = 1
         Portb.4 = 0
         Porta = &B11111111
         'Portd = &B11111111
    
          Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
          Config Lcd = 20 * 4
          Cursor Off
    
          Dim B As Byte
          Dim A As Byte
          Dim Speed As Integer
          Dim Overtorque As Word
          Dim Flag_overtorque As Bit
          Dim Sekunde As Long
          Dim Act_sekunde As Long
          Dim Str_time As String * 10
          Dim Str_speed As String * 10
          Dim Taster_count As Byte
          Dim Skip_flag As Byte
          Dim Mem_sekunde As Eram Long
          Dim Mem_speed As Eram Integer
    
          Taster_start_stop Alias Pinb.3
    
          Speed = Mem_speed
          Sekunde = Mem_sekunde
          Taster_count = 0
          Skip_flag = 1
    
          Cls
          Home
          Lcd "** CALOGRINDER V5 **"
          Locate 3 , 5 : Lcd "PVT-BENSHEIM"
          Wait 2
          Lowerline
          Cls
          Home
          Lcd "SPEED (%)"
          Str_speed = Str(speed)
          Locate 1 , 18 : Lcd Format(str_speed , "000")
          Lowerline
          Lcd "TIME (min)"
          Str_time = Time(sekunde)
          Locate 2 , 16 : Lcd Right(str_time , 5)
          Thirdline
          Lcd "____________________"
          Fourthline
          Lcd "REMAINING TIME"
          Locate 4 , 16
          Lcd "00:00"
    
       '-----------------------------------------------------------------------------------
          Mainprogram:
     '-----------------------------------------------------------------------------------
          Do
              B = Encoder(pina.1 , Pina.0 , Runtime_up , Runtime_down , 0)
              A = Encoder(pina.4 , Pina.3 , Speed_up , Speed_down , 0)
              Debounce Pinb.3 , 0 , Tasterevent , Sub
              Debounce Pina.5 , 0 , Speedplus , Sub
              Debounce Pina.2 , 0 , Timeplus , Sub
        Loop
    
     '-----------------------------------------------------------------------------------
          Speed_up:
     '-----------------------------------------------------------------------------------
          If Skip_flag = 1 Then
             Skip_flag = 0
             Return
          End If
          Incr Speed
          Skip_flag = 1
          If Speed >= 100 Then
             Speed = 100
          End If
          Str_speed = Str(speed)
          Locate 1 , 18
          Lcd Format(str_speed , "000")
          Return
    
      '-------------------------------------------------------------------------------------
          Speed_down:
     '-------------------------------------------------------------------------------------
          If Skip_flag = 1 Then
             Skip_flag = 0
             Return
          End If
          Decr Speed
         Skip_flag = 1
          If Speed < 1 Then
             Speed = 0
          End If
          Str_speed = Str(speed)
          Locate 1 , 18
          Lcd Format(str_speed , "000")
          Return
    
     '-------------------------------------------------------------------------------------
          Runtime_up:
     '-------------------------------------------------------------------------------------
          If Skip_flag = 1 Then
             Skip_flag = 0
             Return
          End If
          If Sekunde <= 3598 Then
          Incr Sekunde                                                              '
               Skip_flag = 1
               Str_time = Time(sekunde)
               Locate 2 , 16 : Lcd Right(str_time , 5)
          End If
          Return
     '------------------------------------------------------------------------------------
          Runtime_down:
     '------------------------------------------------------------------------------------
          If Skip_flag = 1 Then
             Skip_flag = 0
             Return
          End If
          If Sekunde > 0 Then
             Decr Sekunde                                                           '
             Skip_flag = 1
             Str_time = Time(sekunde)
             Locate 2 , 16 : Lcd Right(str_time , 5)
          End If
          Return
     '
     '-----------------------------------------------------------------------------
          Sekundentakt:
     '-----------------------------------------------------------------------------
          Timer1 = 49900
          If Taster_count = 1 Then
             Decr Act_sekunde
             Str_time = Time(act_sekunde)
             Locate 4 , 16 : Lcd Right(str_time , 5)
             Gosub Run
          End If
          Return
    
      '-----------------------------------------------------------------------------
          Run:
      '-----------------------------------------------------------------------------
          '
          Toggle Portb.4
          Waitms 500
          Toggle Portb.4
    
          If Act_sekunde <= 0 And Taster_count = 1 Then
             Taster_count = 0
             Reset Portb.4
             Cls
             Lowerline
             Locate 2 , 3 : Lcd "**GRINDING END**"
             Sound Portd.7 , 400 , 450
             Waitms 333
             Sound Portd.7 , 400 , 450
             Waitms 333
             Sound Portd.7 , 400 , 450
             Waitms 333
             Goto Startanzeige
          End If
          Return
    
     '-----------------------------------------------------------------------------
          Tasterevent:
     '-----------------------------------------------------------------------------
          Taster_count = Taster_count + 1
          Act_sekunde = Sekunde
         If Taster_count = 1 And Sekunde = 0 Or Speed = 0 Then
             Taster_count = 0
          End If
    
          If Sekunde <> Mem_sekunde Then
                  Mem_sekunde = Sekunde
          End If
          If Speed <> Mem_speed Then
                  Mem_speed = Speed
          End If
    
          If Taster_count = 2 Then
             Taster_count = 0
             Reset Portb.4
             Cls
             Lowerline
             Locate 2 , 3 : Lcd "<<<<BREAKOFF>>>>"
             Sound Portd.7 , 50 , 80000
             Goto Startanzeige
          End If
    
          Return
    
      '-----------------------------------------------------------------------------
          Speedplus:
     '-----------------------------------------------------------------------------
           If Speed < 91 Then
             Speed = Speed + 10
             Str_speed = Str(speed)
             Locate 1 , 18
             Lcd Format(str_speed , "000")
             Waitms 100
          Elseif Speed = 100 Then
             Speed = 0
          End If
          Return
    
      '-----------------------------------------------------------------------------
      Timeplus:
     ' -----------------------------------------------------------------------------
          Sekunde = Sekunde + 60
          Str_time = Time(sekunde)
          Locate 2 , 16 : Lcd Right(str_time , 5)
          Waitms 100
          Return
    
     '-----------------------------------------------------------------------------
        Startanzeige:
     '-----------------------------------------------------------------------------
          Cls
          Home
          Lcd "SPEED (%)"
          Str_speed = Str(speed)
          Locate 1 , 18 : Lcd Format(str_speed , "000")
          Lowerline
          Lcd "TIME (min)"
          Str_time = Time(sekunde)
          Locate 2 , 16 : Lcd Right(str_time , 5)
          Thirdline
          Lcd "____________________"
          Fourthline
          Lcd "REMAINING TIME"
          Locate 4 , 16
          Lcd "00:00"
          Return

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2007
    Beiträge
    27
    habe ein ähnliches Problem,

    LCD Ausgabe funktioniert, aber nur solange bis ich den Timer für PWM vorbereite !

    ich tippe auf LCD nutzt Timerroutinen

    blicke noch nicht durch, bin erst seit 3 Tagen mit AVR zugange, hab vorher 6502,z80,LH5801 bas c und asm programmiert

    Atmels sind völlig neu für mich

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Timer0

    Es liegt daran, dass Timer0 bei dir schon durch CONFIG CLOCK = SOFT belegt ist.
    Wenn du zusätzlich CONFIG Servos benutzt, wird der Timer0 doppelt belegt, das gilt auch für Timer0 = PWM.

    Gruß Dirk

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von jar_
    bin erst seit 3 Tagen mit AVR zugange, hab vorher 6502,z80,LH5801 bas c und asm programmiert
    Naja, was hindert dich daran den µC in C zu programmieren?
    Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.

    Grüße,
    Hanni
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2007
    Beiträge
    27
    Zitat Zitat von Hanni
    Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.
    Grüße,
    Hanni
    ja danke, werde ich uberlegen, bin ja grad erst neu dabei

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Nebeneffekte

    Hallo Hanni,

    Unter Bascom gibt es nämlich immer mal wieder solche Nebeneffekte.
    Als Bascom-Fan muss ich natürlich sagen, dass man sicher auch in C keinen Timer doppelt belegen kann. Oder?

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569

    Re: Nebeneffekte

    [quote="Dirk"]Hallo Hanni,

    Als Bascom-Fan muss ich natürlich sagen, dass man sicher auch in C keinen Timer doppelt belegen kann. Oder?
    Ja und nein.
    Das Problem bei Bascom ist, das Timer zum Teil exklusiv für diverse Funktionen benutzt werden.

    der Vorteil von C / ASM ist, das man es sich selbst aussuchen kann was man wofür und wie benutzt ....
    Grundregeln des Forenpostings:
    1. Nutze niemals die Suchfunktion!
    2. Überprüfe niemals die Topics nach Ähnlichkeiten!
    3. Schreibe alles in hellgelb!

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    der Vorteil von C / ASM ist, das man es sich selbst aussuchen kann was man wofür und wie benutzt ....
    Ja, das ist klar. Und deshalb geht manchmal natürlich nichts ohne ASM.

    Zumindest schweigt die Bascom-Doku sich nicht darüber aus, welcher Timer für welche Funktion verwendet wird. Insofern kann man auch damit planen. Bei manchen Befehlen läßt sich auch die Timer-Nutzung ändern.

    Gruß Dirk

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    ich bin nun jar ohne _

Berechtigungen

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

Labornetzteil AliExpress