Forum: Mikrocontroller und Digitale Elektronik PIC16F628A PWM mit delay (ASM)


von Finn J. (draddicted)


Lesenswert?

Hallo liebe Mikrocontroller community.

Ich sehe mir nun schon seit längerem viele Beiträge an, mit denen ich 
auch schon einige Dinge lernen konnte. Jetzt stehe ich vor einem 
Problem, das sich scheinbar nicht lösen lassen möchte.
Zu steuern ist eine einfache Modellservo.
Ich weiß, dass es nicht optimal ist, das Steuersignal immer manuell zu 
generieren indem man Timer nutzt, aber eine andere Aufgabe hat der PIC 
nicht.

Mein Vorhaben wird in dem Header der Programmierung erklärt.

Zunächst mein, recht langer (zu lang), Code.
(vieles davon kann überflogen werden, weil es sich schlicht und einfach 
um die 10 malige Wiederholung des Servo Signals handelt.

;       -Servosteuerung für Demonstrationszwecke.-
;
;Die Servo wird sich jede 10 Sekunden von Linksanschlag
;in 12 Schritten (15° Schritte) weiter nach rechts bewegen.
;Dann wird die Modellservo 120 Sekunden lang nichts tun,
;um danach wieder auf Linksanschlag zu gehen.
;Ab dem Punkt geht es von vorne los.
;
;Es wird der Pin RB0 für das Signal verwendet. (PORTB,0)
;Es wird der Interne 4MHz Oszillator verwendet.
;              ____
;         RA2-|O|__| |-RA1
;         RA3-|  1   |-RA0
;         RA4-|  6   |-RA7
;         RA5-|  F   |-RA8
;      VSS----|  6   |----VDD
;Signal ->RB0-|  2   |-RB7
;         RB1-|  8   |-RB6
;         RB2-|  A   |-RB5
;         RB3-|______|-RB4
;
;Verwendet wird ein PIC16F628A
;
;Einen großen Dank an die Seite:
;http://www.piclist.com/techref/piclist/codegen/delay.htm
;
;Es handelt sich größtenteils um verschachtelte Schleifen.
;Mittels diesem Generator lassen sich schnell und einfach die Schleifen
;erzeugen.
;
    list        p=16f628a
    #include    <P16F628A.inc>
    __CONFIG    h'3F38'
    errorlevel  -302

    org         0x00

    cblock      0x20
        c1      ;10 Sekunden | Hier einfache Zeitschleifen Variablen
        c2
        c3
        d1      ;120 Sekunden
        d2
        d3
        d4
        e1      ;ab hier PWM Signal Variablen
        e2
        e3
        e4
        f1
        f2
        f3
        f4
        g1
        g2
        g3
        g4
        h1
        h2
        h3
        h4
        i1
        i2
        i3
        i4
        j1
        j2
        j3
        j4
        k1
        k2
        k3
        k4
        l1
        l2
        l3
        l4
        m1
        m2
        m3
        m4
        n1
        n2
        n3
        n4
        o1
        o2
        o3
        o4
        p1
        p2
        p3
        p4
        q1
        q2
        q3
        q4
    endc

init
    bsf     STATUS, RP0
    movlw   B'00000000'
    movwf   TRISB
    bcf     STATUS, RP0
    clrf    PORTB

Hauptprogramm
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000
    bsf     PORTB,0
    call    Warten_1.000
    bcf     PORTB,0
    call    Warten_19.000

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917
    bsf     PORTB,0
    call    Warten_1.083
    bcf     PORTB,0
    call    Warten_18.917

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834
    bsf     PORTB,0
    call    Warten_1.166
    bcf     PORTB,0
    call    Warten_18.834

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751
    bsf     PORTB,0
    call    Warten_1.249
    bcf     PORTB,0
    call    Warten_18.751

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668
    bsf     PORTB,0
    call    Warten_1.332
    bcf     PORTB,0
    call    Warten_18.668

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585
    bsf     PORTB,0
    call    Warten_1.415
    bcf     PORTB,0
    call    Warten_18.585

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502
    bsf     PORTB,0
    call    Warten_1.498
    bcf     PORTB,0
    call    Warten_18.502

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419
    bsf     PORTB,0
    call    Warten_1.581
    bcf     PORTB,0
    call    Warten_18.419

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336
    bsf     PORTB,0
    call    Warten_1.664
    bcf     PORTB,0
    call    Warten_18.336

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253
    bsf     PORTB,0
    call    Warten_1.747
    bcf     PORTB,0
    call    Warten_18.253

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170
    bsf     PORTB,0
    call    Warten_1.830
    bcf     PORTB,0
    call    Warten_18.170

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087
    bsf     PORTB,0
    call    Warten_1.913
    bcf     PORTB,0
    call    Warten_18.087

    call    Warten_9800

    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004
    bsf     PORTB,0
    call    Warten_1.996
    bcf     PORTB,0
    call    Warten_18.004

    call    Warten_9800
    call    Warten_120000
    goto    Hauptprogramm

;10 Sekunden Warteschleife, bis nächstes PWM Signal

Warten_9800
  movlw  0xBE
  movwf  c1
  movlw  0x5D
  movwf  c2
  movlw  0x16
  movwf  c3
Warten_9800_0
  decfsz  c1, f
  goto  $+2
  decfsz  c2, f
  goto  $+2
  decfsz  c3, f
  goto  Warten_9800_0
  goto  $+1
  goto  $+1
  nop
  return

;120 Sekunden Warteschleife, bis "nächster Tag"

Warten_120000
  movlw  0x54
  movwf  d1
  movlw  0x74
  movwf  d2
  movlw  0xCC
  movwf  d3
  movlw  0x01
  movwf  d4
Warten_120000_0
  decfsz  d1, f
  goto  $+2
  decfsz  d2, f
  goto  $+2
  decfsz  d3, f
  goto  $+2
  decfsz  d4, f
  goto  Warten_120000_0
  nop
  return

;Start von PWM Signalgenerierung

Warten_1.000
      ;993 cycles
  movlw  0xC6
  movwf  e1
  movlw  0x01
  movwf  e2
Warten_1.000_0
  decfsz  e1, f
  goto  $+2
  decfsz  e2, f
  goto  Warten_1.000_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return

Warten_19.000
      ;18993 cycles
  movlw  0xD6
  movwf  e3
  movlw  0x0F
  movwf  e4
Warten_19.000_0
  decfsz  e3, f
  goto  $+2
  decfsz  e4, f
  goto  Warten_19.000_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return


Warten_1.083
      ;1078 cycles
  movlw  0xD7
  movwf  f1
  movlw  0x01
  movwf  f2
Warten_1.083_0
  decfsz  f1, f
  goto  $+2
  decfsz  f2, f
  goto  Warten_1.083_0

      ;1 cycle
  nop

      ;4 cycles (including call)
  return

Warten_18.917
      ;18913 cycles
  movlw  0xC6
  movwf  f3
  movlw  0x0F
  movwf  f4
Warten_18.917_0
  decfsz  f3, f
  goto  $+2
  decfsz  f4, f
  goto  Warten_18.917_0

      ;4 cycles (including call)
  return

Warten_1.166
      ;1158 cycles
  movlw  0xE7
  movwf  g1
  movlw  0x01
  movwf  g2
Warten_1.166_0
  decfsz  g1, f
  goto  $+2
  decfsz  g2, f
  goto  Warten_1.166_0

      ;4 cycles
  goto  $+1
  goto  $+1

      ;4 cycles (including call)
  return

Warten_18.834
      ;18828 cycles
  movlw  0xB5
  movwf  g3
  movlw  0x0F
  movwf  g4
Warten_18.834_0
  decfsz  g3, f
  goto  $+2
  decfsz  g4, f
  goto  Warten_18.834_0

      ;2 cycles
  goto  $+1

      ;4 cycles (including call)
  return


Warten_1.249
      ;1243 cycles
  movlw  0xF8
  movwf  h1
  movlw  0x01
  movwf  h2
Warten_1.249_0
  decfsz  h1, f
  goto  $+2
  decfsz  h2, f
  goto  Warten_1.249_0

      ;2 cycles
  goto  $+1

      ;4 cycles (including call)
  return

Warten_18.751
      ;18743 cycles
  movlw  0xA4
  movwf  h3
  movlw  0x0F
  movwf  h4
Warten_18.751_0
  decfsz  h3, f
  goto  $+2
  decfsz  h4, f
  goto  Warten_18.751_0

      ;4 cycles
  goto  $+1
  goto  $+1

      ;4 cycles (including call)
  return

Warten_1.332
      ;1328 cycles
  movlw  0x09
  movwf  i1
  movlw  0x02
  movwf  i2
Warten_1.332_0
  decfsz  i1, f
  goto  $+2
  decfsz  i2, f
  goto  Warten_1.332_0

      ;4 cycles (including call)
  return

Warten_18.668
      ;18663 cycles
  movlw  0x94
  movwf  i3
  movlw  0x0F
  movwf  i4
Warten_18.668_0
  decfsz  i3, f
  goto  $+2
  decfsz  i4, f
  goto  Warten_18.668_0

      ;1 cycle
  nop

      ;4 cycles (including call)
  return

Warten_1.415
      ;1408 cycles
  movlw  0x19
  movwf  j1
  movlw  0x02
  movwf  j2
Warten_1.415_0
  decfsz  j1, f
  goto  $+2
  decfsz  j2, f
  goto  Warten_1.415_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return

Warten_18.585
      ;18578 cycles
  movlw  0x83
  movwf  j3
  movlw  0x0F
  movwf  j4
Warten_18.585_0
  decfsz  j3, f
  goto  $+2
  decfsz  j4, f
  goto  Warten_18.585_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return

Warten_1.498
      ;1493 cycles
  movlw  0x2A
  movwf  k1
  movlw  0x02
  movwf  k2
Warten_1.498_0
  decfsz  k1, f
  goto  $+2
  decfsz  k2, f
  goto  Warten_1.498_0

      ;1 cycle
  nop

      ;4 cycles (including call)
  return

Warten_18.502
      ;18498 cycles
  movlw  0x73
  movwf  k3
  movlw  0x0F
  movwf  k4
Warten_18.502_0
  decfsz  k3, f
  goto  $+2
  decfsz  k4, f
  goto  Warten_18.502_0

      ;4 cycles (including call)
  return

Warten_1.581
      ;1573 cycles
  movlw  0x3A
  movwf  l1
  movlw  0x02
  movwf  l2
Warten_1.581_0
  decfsz  l1, f
  goto  $+2
  decfsz  l2, f
  goto  Warten_1.581_0

      ;4 cycles
  goto  $+1
  goto  $+1

      ;4 cycles (including call)
  return

Warten_18.419
      ;18413 cycles
  movlw  0x62
  movwf  l3
  movlw  0x0F
  movwf  l4
Warten_18.419_0
  decfsz  l3, f
  goto  $+2
  decfsz  l4, f
  goto  Warten_18.419_0

      ;2 cycles
  goto  $+1

      ;4 cycles (including call)
  return

Warten_1.664
      ;1658 cycles
  movlw  0x4B
  movwf  m1
  movlw  0x02
  movwf  m2
Warten_1.664_0
  decfsz  m1, f
  goto  $+2
  decfsz  m2, f
  goto  Warten_1.664_0

      ;2 cycles
  goto  $+1

      ;4 cycles (including call)
  return

Warten_18.336
      ;18328 cycles
  movlw  0x51
  movwf  m3
  movlw  0x0F
  movwf  m4
Warten_18.336_0
  decfsz  m3, f
  goto  $+2
  decfsz  m4, f
  goto  Warten_18.336_0

      ;4 cycles
  goto  $+1
  goto  $+1

      ;4 cycles (including call)
  return


Warten_1.747
      ;1743 cycles
  movlw  0x5C
  movwf  n1
  movlw  0x02
  movwf  n2
Warten_1.747_0
  decfsz  n1, f
  goto  $+2
  decfsz  n2, f
  goto  Warten_1.747_0

      ;4 cycles (including call)
  return

Warten_18.253
      ;18248 cycles
  movlw  0x41
  movwf  n3
  movlw  0x0F
  movwf  n4
Warten_18.253_0
  decfsz  n3, f
  goto  $+2
  decfsz  n4, f
  goto  Warten_18.253_0

      ;1 cycle
  nop

      ;4 cycles (including call)
  return

Warten_1.830
      ;1823 cycles
  movlw  0x6C
  movwf  o1
  movlw  0x02
  movwf  o2
Warten_1.830_0
  decfsz  o1, f
  goto  $+2
  decfsz  o2, f
  goto  Warten_1.830_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return

Warten_18.170
      ;18163 cycles
  movlw  0x30
  movwf  o3
  movlw  0x0F
  movwf  o4
Warten_18.170_0
  decfsz  o3, f
  goto  $+2
  decfsz  o4, f
  goto  Warten_18.170_0

      ;3 cycles
  goto  $+1
  nop

      ;4 cycles (including call)
  return


Warten_1.913
      ;1908 cycles
  movlw  0x7D
  movwf  p1
  movlw  0x02
  movwf  p2
Warten_1.913_0
  decfsz  p1, f
  goto  $+2
  decfsz  p2, f
  goto  Warten_1.913_0

      ;1 cycle
  nop

      ;4 cycles (including call)
  return

Warten_18.087
      ;18083 cycles
  movlw  0x20
  movwf  p3
  movlw  0x0F
  movwf  p4
Warten_18.087_0
  decfsz  p3, f
  goto  $+2
  decfsz  p4, f
  goto  Warten_18.087_0

      ;4 cycles (including call)
  return

Warten_1.996
      ;1988 cycles
  movlw  0x8D
  movwf  q1
  movlw  0x02
  movwf  q2
Warten_1.996_0
  decfsz  q1, f
  goto  $+2
  decfsz  q2, f
  goto  Warten_1.996_0

      ;4 cycles
  goto  $+1
  goto  $+1

      ;4 cycles (including call)
  return

Warten_18.004
      ;17998 cycles
  movlw  0x0F
  movwf  q3
  movlw  0x0F
  movwf  q4
Warten_18.004_0
  decfsz  q3, f
  goto  $+2
  decfsz  q4, f
  goto  Warten_18.004_0

      ;2 cycles
  goto  $+1

      ;4 cycles (including call)
  return

    goto    Hauptprogramm

;Ende der PWM Signalgenerierung

    end

von Finn J. (draddicted)


Angehängte Dateien:

Lesenswert?

Das ist noch mal die ASM Datei, falls ihr das ganze lieber in MPLAB 
einfügen wollt, der Übersicht halber.

von chris (Gast)


Lesenswert?

Hier ein Codebeispiel , wo extra kein Timer verwendet wurde.
In so einem Falle wuerde ich den Timer verwenden, ohne Interrupts,
um 16.4 Sekunden Interval fuèr das Servo zu haben, das Servo aber
immer noch mit delay angesteuert, also ohne Timer.

Hier nur 90 Grad implementiert, da gewisse Servos 180 Grad nicht 
vertragen.
Einfach Servo_start entsprechend abàndern und servo_step auf von 6 auf 
12 erhòhen.


;Die Servo wird sich jede 10 Sekunden von Linksanschlag
;in 12 Schritten (15° Schritte) weiter nach rechts bewegen.
;Dann wird die Modellservo 120 Sekunden lang nichts tun,
;um danach wieder auf Linksanschlag zu gehen.
;Ab dem Punkt geht es von vorne los.
;
;Es wird der Pin RB0 für das Signal verwendet. (PORTB,0)
;Es wird der Interne 4MHz Oszillator verwendet.
;              __
;         RA2-|O|__| |-RA1
;         RA3-|  1   |-RA0
;         RA4-|  6   |-RA7
;         RA5-|  F   |-RA8
;      VSS----|  6   |----VDD
;Signal ->RB0-|  2   |-RB7
;         RB1-|  8   |-RB6
;         RB2-|  A   |-RB5
;         RB3-|______|-RB4
;
;Verwendet wird ein PIC16F628A
;;
    list        p=16f628a
    #include    <P16F628A.inc>
    __CONFIG    h'3F38'
    errorlevel  -302
  radix    dec

;**********************************************************************
    org         0x00

    cblock      0x20
    cnt :2
    servo_val
    endc
#define SERVO    PORTB,0
#define uS      +8/16
#define sec      *50
#define ms100    *5
#define minutes    sec *60
#define SERVO_START  1000 uS
#define SERVO_STEP  (1000*15/90 uS)
#define SERVO_END  SERVO_START+6*SERVO_STEP

wait  macro time
    if time > 256
      movlw  high(time)
      movwf  cnt+1
    endif
    movlw  low(time)
    call  delay_20ms
    endm
;**********************************************************************

  clrf  STATUS
  movlw  0
  tris    PORTB
  movwf  PORTB

loop
  movlw  SERVO_START
  movwf  servo_val
  wait    1 sec + 2 ms100 ; estimated time for traveling 180 degree

loop_move
  wait  10 sec
  movlw  SERVO_STEP
  addwf  servo_val
  movlw  SERVO_END
  xorwf  servo_val,w
  bnz    loop_move
  wait  120 sec
  goto  loop

;**********************************************************************
delay_20ms ; interval , 16bit argument
  movwf  cnt
  comf  cnt+1
  call  do_servo
  decfsz  cnt
  goto  $-2
  incfsz  cnt+1
  goto  $-4
  return
;**********************************************************************
do_servo ; 20ms servo pulse
  bsf    SERVO
  movfw  servo_val
  call  delay_16
  bcf    SERVO
  comf  servo_val,w
;----------------------------------------------------------------------
  call delay_16-1;5x
  movlw -30    ; 20ms adj
  call $+1      ; 4x
  call delay_16 ; 2x
;----------------------------------------------------------------------
delay_16_loop
  goto $+1
  clrwdt
  nop
;**********************************************************************
delay_16 ; delay 16*w clk, if W=0 delay = 256*8 = 4096 clocks
  goto $+1
  goto $+1
  goto $+1
  goto $+1
  addlw -1
  skpz
  goto delay_16_loop
dlY_4
  return







 end

von chris (Gast)


Lesenswert?

habe gerade bemerkt #define uS      +8/16 ist falsch, +8 sollte eine 
Rundung
machen, da die Prioritàt aber nicht passt wegen fehlender Klammern, geht 
es nicht. Einfach nur
#define uS      /16
verwenden, dann passt es.

von Finn J. (draddicted)


Lesenswert?

Danke Chris!
Du hast mir sehr geholfen, denke ich! Ich werde mir das Programm heute 
genauer ansehen! Die Lösung wirkt auf den ersten Blick schon mal genial!
Ich wusste noch gar nicht, dass es einen Befehl gibt #define, mit dem 
man solche Fälle schnell und leicht lösen kann!

Was mir noch nicht ganz klar ist; wo kann man die Schleifen einbauen, wo 
die Servo eigentlich nur die Position halten soll?
Evenetuell klärt sich das auch später, wenn ich es mir ansehe, aber ich 
frage schon mal so.

Vielen Dank auf jeden Fall erstmal!

von chris (Gast)


Lesenswert?

In wait wird delay_20ms aufgerufen, was wiederum do_servo aufruft, 
welches
einen Servoimpuls alle 20ms rausgibt.
Dort wird einmal der Impulse, habe deshalb extra delay_16 gemacht, damit
die 180 Grad des Servos in eine Byte variable passt, rausgeschickt, und
dann nochmals was vom Impuls fehlt, um auf die ca 4ms zu kommen.
4msx5 = 20ms.

Wenn man dies normal programmiert, wuerde man den Prescaler des tmr0
auf 4*16=64 stellen fuer 16.384ms und dann einfach das TMR0IF auswerten
und dann ruecksetzen, ohne die Interrupts einzuschalten.
Dann hat man zwischen den Servoimpulsen noch Zeit fuer andere Sachen.

von Finn J. (draddicted)


Lesenswert?

Okay, ich habe mir den code angesehen, aber erstmal noch nicht ganz 
verstanden, wie genau er funktioniert. MPLAB hat mir viele Fehler 
gezeigt, dass die Befehle unbekannt sind, usw..

Ich habe noch einmal mein Programm ausprobiert und es passiert genau 
das, was ich auch erreichen möchte. Eine PWM Kurve, die in 10 Sekunden 
Schritten
immer für 200ms wirkend eine Wachsende Impulsbreite hat.
Sprich, es sieht auf dem Oszilloskop aus wie aus einem Lehrbuch.

Aber wenn ich die Modellservo an dem PIN, über den das PWM Signal kommt, 
anschließe, dreht sich die Servo nur bis zum Anschlag ganz nach rechts.
Das ist, zumindest nach meinem Verständis von Modellservos doch falsch 
oder?
Anfangs bekommt die Servo ja nur ein Signal mit dem Impuls von 1ms, 19ms 
nichts. Demnach müsste sich die Servo sich eigentlich bis zum 
Linksanschlag drehen und nicht umgekehrt.

Allgemein habe ich einige Testprogramme ausprobiert, wo die Servo z.B. 
auch einfach nur auf die Mittelstellung laufen soll (1,5ms), aber sie 
dreht sich immer ganz nach rechts. Ich habe das Signal auch Invertiert 
und es dann noch einmal ausprobiert - gleiches Ergebnis.
Laut Servodatabase kann die Servo einen Impulsbereich von ~0,5 bis ~2.5 
abfahren.

Ich schließe die Servo bisher ohne Vorwiderstand direkt an den PIC an.
Eigentlich dürfte es so, laut vielen im Forum funktioniere, aber das tut 
es nicht.

Im Moment versoge ich die Servo auch autonom mit 5V Spannung über einen 
Spannungsregler. Die Stromversorgung dürfte somit eigentlich auch kein 
Problem sein. Auch wenn der PIC und die Servo nicht die gleiche Masse 
haben.

Tut mir leid wegen dieser Textwand, aber hättest du eine Idee, woran es 
liegen kann, dass die Servo sich nur nach rechts dreht?

Viele nutzen ja genau die Servo und da funktioniert sie dann auch.

Hier noch mal das ausfürlichste Datenblatt für die Servo:
http://www.servodatabase.com/servo/modelcraft/rs-2

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Ich habe es probiert, es uebersetzt ohne Probleme.
Es kommen 3-4 Warnungen raus, wegen Default destination usw.
Ansonst passt es

Dann probier dies hier, und wenn Fehler rauskommen, poste hier die 
Fehler.

    list        p=16f628a
    #include    <P16F628A.inc>
    __CONFIG    h'3F38'
    errorlevel  -302
  radix    dec

;**********************************************************************
    org         0x00

    cblock      0x20
    cnt
    servo_val
    endc
#define SERVO    PORTB,0
#define uS       /16
#define sec      *50
#define ms       /20
#define minutes    sec *60
#define SERVO_START  1000 uS
#define SERVO_STEP  (1000*15/90 uS)
#define SERVO_END  SERVO_START+6*SERVO_STEP

;Servo
;Rotational Range:  203°
;Pulse Cycle:  20 ms
;Pulse Width:  540-2470 µs
#define DEG      *(2479-540)/203 us + 1500 us
#define DEG_15  (((188 DEG) - (0 DEG))/12) ;188 wegen rundung und 
integer
; damit es uebersichtlicher ist
call_w macro imm, addr
  movlw imm
  call addr
  endm

call_f macro f,a
  movf f,w
  call a
  endm

;**********************************************************************


init
    bsf     STATUS, RP0
    movlw   B'00000000'
    movwf   TRISB
    bcf     STATUS, RP0
    clrf    PORTB

; hier in deinem Stil
  call_w 0 DEG, set_servo
  call_w 5 , delay_sec
  call_w -100 DEG, set_servo
  call_w 5 , delay_sec
  call_w 2450 us, set_servo
  call_w 5 , delay_sec
  call_w -90 DEG, set_servo
  call_w 10, delay_sec
  call_w -90 DEG + DEG_15 * 1, set_servo
  call_W 5, delay_sec
  call_w -90 DEG + DEG_15 * 2, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 3, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 4, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 5, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 6, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 7, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 8, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 9, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 10, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 11, set_servo
  call_w 5, delay_sec
  call_w -90 DEG + DEG_15 * 12, set_servo
  call_w 5, delay_sec
  call_w 5, delay_sec

; und hier als loop
loop
  call_w -90 DEG, set_servo
  movlw 12
  movwf tmp
loop_move
  call_w 10,delay_sec
  movlw (188 DEG) / 12
  addwf servo_val
  decfsz tmp
  goto loop_move
  call_w 120,delay_sec
  goto loop


set_servo
  movwf servo_val
;**********************************************************************
do_servo ; 20ms servo pulse
  movf  servo_val,w
  bsf    SERVO
  call  delay_16
  bcf    SERVO
  comf  servo_val,w
  call  delay_16
  movlw 226
  call  $+1
  call  $+1
;----------------------------------------------------------------------
delay_16_loop
  goto $+1
  clrwdt
  nop
;**********************************************************************
delay_16 ; delay 16*w clk, if W=0 delay = 256*8 = 4096 clocks
  goto $+1
  goto $+1
  goto $+1
  goto $+1
  addlw -1
  skpz
  goto delay_16_loop
dlY_4
  return

delay_sec
  movwf cnt
  call do_servo
  call do_servo
  call do_servo
  call do_servo
  call do_servo
  decfsz cnt
  goto delay_sec+1
  return

von Finn J. (draddicted)


Lesenswert?

Tut mir leid für die Späte Antwort und dass ich gar nicht auf die 
Programme eingehe!

Aber ich habe mein eigenes ausprobiert und das erfüllt den Zweck, für 
den es geschrieben ist eigentlich vollständig.

Mein Problem liegt eben jetzt wirklich nur noch bei der Hardware, denn 
ich weiß nicht, warum die Modellservo sich nur bis zum Rechtsanschlag 
dreht, anstatt Schrittweise, oder eben NUR in die Mittelstellung zu 
fahren.
Sie dreht sich wirklich bis zum Anschlag, egal wie lang der Impuls ist.
Ob 1ms oder 2ms oder eben 1,5ms, die Servo dreht bis zum Rechtsanschlag 
und knurrt dann... Ich bin mir nicht sicher, ob die Servo kaputt ist.
Wäre es eventuell Ratsam, eine andere Servo zu benutzen?
Eben eine Digitale Servo? Oder einfach eine etwas besser dokumentierte?
Im Moment wird noch die Modelcraft RS-2 genutzt.

von chris (Gast)


Lesenswert?

Teilweise sind deine Timing Routinen falsch.

von Finn J. (draddicted)


Lesenswert?

Hm... Das könnte jetzt problematisch sein, denn die Zeitschleifen hab 
ich mir bisher von der Seite

http://www.piclist.com/techref/piclist/codegen/delay.htm

geholt.

Meinst du, dass ich kleine Zahlendreher drin habe, wie z.B.:
Ich möchte einen Impuls von 1ms und gebe, da ich den Wert in Sekunden 
eingeben muss statt 0,001s - 0,0001s ein?

Wie gesagt, Zweck wird eigentlich erfüllt, das Oszilloskop zeigt mir die 
gewünschten Rechteckkurven an, nur die Servo macht was sie will...

---

Ich weiß allerdings auch nicht, wie ich die Servo mit dem PIC verbinden 
soll.
Das ist mir schon fast peinlich! Bisher habe ich beide unabhängig 
voneinander an Versorgungsspannungen angeschloßen, also zwei 
verschiedene Netzteile.
Sollte ich Servo und PIC eventuell einfach mal an die gleiche Quelle 
legen und bestenfalls noch einen Vorwiderstand zwischen Signalpin und 
Servo schalten?

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Die Massen muessen verbunden sein, also -/gnd von Servo mit -/gnd von 
pic.
Warscheinlich fehlt dies. Die Zeiten sind nicht soo falsch, zumindest 
muessten diverse davon funktionieren.

von Finn J. (draddicted)


Angehängte Dateien:

Lesenswert?

Okay, gut! Ich hab noch mal eine sehr stark vereinfachte Grafik gemacht, 
einfach damit wir definitiv auf dem gleichen Nenner sind!
Das mit der Masse dachte ich mir eben auch schon länger, ich frage mich 
nur, wie ich beide Massen verbinden soll, wenn die Servo und der PIC 
unabhängig von zwei verschiedenen Netzteilen/Akkus betrieben werden.
In meinem Fall erstmal ein Labornetzteil, mit Spannungsregler auf 5V und 
ein Vellemannboard mit 12V Netzteil und reglung auf der Platine.

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Die beiden VSS muessen verbunden werden, bitte vor dem Einschalten der
beiden Spannungsquellen.
Es ist mòglich, dass ev. ein Transistor im Servo in Mitleidenschaft
gezogen wurde, die Warscheinlichkeit ist aber hoch dass dem nicht so 
ist.

von Finn J. (draddicted)


Lesenswert?

Okay! Wenn die Servos kaputt sind ist das eigentlich nicht so schlimm, 
die kosten ja nicht wirklich viel, ~5€.

Die Masse von beiden Netzteilen muss auch verbunden werden oder?
Also, vereinfacht gesagt, wir haben eine Leitung von der einen zu der 
anderen Masse der Netzgeräte und an dieser Leitung sind dann der PIC und 
die Servo. Richtig?

von chris (Gast)


Lesenswert?

Einfach ein GND vom Pic Board zum GND des Labornetzteiles machen.
GND der Platine z.B. vom ICSP Stecker.

von Finn J. (draddicted)


Angehängte Dateien:

Lesenswert?

Das wäre dann die neue Beschaltung, ohne Spannungsregler auf dem 
Steckboard und Vellemannbrenner.

von Finn J. (draddicted)


Lesenswert?

Ich konnte heute mein Programm endlich wieder ausprobieren und habe 
festgestellt, dass es wirklich nur an den ungleichen Massen lag.
Heute will ich mein Programm kürzen, es soll also im Hauptprogramm nicht 
jedes mal 20fach
1
call warten_x
2
bsf  0
3
call warten_x
4
bsf  0

stehen, sondern eben für jeden Wert nur ein mal und das ganze dann 20 
mal wiederholt

Ich dachte ich könnte dafür eine Schleife nutzen, die bei mir dann so 
aussah:
1
ServoRechts
2
    movlw   d'100'
3
    movwf   Wiederholen
4
    bsf     PORTB,0
5
    call    Warten_2
6
    bcf     PORTB,0
7
    call    Warten_18
8
    decfsz  Wiederholen,F
9
    goto    ServoRechts
10
    call    Warten_1000
11
12
    goto    ServoLinks
13
14
ServoLinks
15
    movlw   d'100'
16
    movwf   Wiederholen
17
    call    Warten_1
18
    bcf     PORTB,0
19
    call    Warten_19
20
    bsf     PORTB,0
21
    decfsz  Wiederholen,F
22
    goto    ServoLinks
23
    call    Warten_1000
24
25
    goto    ServoRechts

(Das ist jetzt nur ein kleines, kurzes Testprogramm)

Wie würde man eine, sich wiederholende, Befehlsreihe wirklich aufbauen?

von Finn J. (draddicted)


Lesenswert?

Okay, ich hab jetzt selbst rausgefunden, wie ich das mache, ist sowas in 
der Art wie eine verschachtelte Schleife, blos statt einer inneren 
Schleife einfach das Aufrufen von den 4 Befehlen (bsf, dann Warten, bcf, 
dann Warten)

Jetzt muss ich nur noch die Servo so umbauen, dass sie statt 90°, 180° 
schafft... Dafür müsste ich soweit ich weiß nur das Potentiometer mit 
Widerständen beschalten oder?

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Finn Jensen schrieb:
> Okay, ich hab jetzt selbst rausgefunden, wie ich das mache, ist
> sowas in
> der Art wie eine verschachtelte Schleife, blos statt einer inneren
> Schleife einfach das Aufrufen von den 4 Befehlen (bsf, dann Warten, bcf,
> dann Warten)

Eigentlich hatte ich dir das oben schon mehrfach gepostet.
Es selber rauszufinden macht mehr Spass.
>
> Jetzt muss ich nur noch die Servo so umbauen, dass sie statt 90°, 180°
> schafft... Dafür müsste ich soweit ich weiß nur das Potentiometer mit
> Widerständen beschalten oder?
Nein, dein Servo schafft 203 Grad.
Servo ganz nach links: ein Impuls von 640 uS.
Servo ganz nach rechts: ein Impuls von 2351 uS.
Laut Datasheet muessten 1000uS 105 Grad sein.

von Finn J. (draddicted)


Lesenswert?

chris schrieb:
> Eigentlich hatte ich dir das oben schon mehrfach gepostet.
> Es selber rauszufinden macht mehr Spass.

Das tut es in der Tat! Aber mir hat es dennoch immer sehr geholfen, den 
Dialog mit dir und noch weiteren zu halten. Das hilft immer sehr!
Das Programm ist, wenn man so zurückschaut eigentlich ja auch wirklich 
einfach, aber bis das dann auch so läuft wie man möchte, das ist dann 
wieder eine andere Geschichte!

> Nein, dein Servo schafft 203 Grad.
> Servo ganz nach links: ein Impuls von 640 uS.
> Servo ganz nach rechts: ein Impuls von 2351 uS.
> Laut Datasheet muessten 1000uS 105 Grad sein.

Okay, das werde ich noch mal ausprobieren müssen!
Bei 1ms fährt die Servo nämlich momentan im Rechts Links Testprogramm 
nur in die Mittelstellung, etwas merkwürdig und bei 2ms auf 
Rechtsanschlag.
Das ist jetzt ja aber leicht losbar!

Vielen Dank noch mal für deine Geduld und auch für deine Programme,
hat mich alles sehr angeregt, doch noch weiter zu bohren und nun läuft 
das ganze tatsächlich auch richtig, bis eben auf diese 90° Drehung.

von Finn J. (draddicted)


Lesenswert?

Jetzt habe ich ja sehr lange nichts mehr geschrieben.
Ich möchte nur noch kurz die Rückmeldung geben, dass die Modelservo sich 
jetzt korrekt dreht. Es wurde noch eine weitere Modelservo, gleiches 
Model, so umgebaut, dass sie sich unendlich weit in beide Richtungen 
drehen kann (als spielerei).
Ich habe die Wiederholung der Signale signifikant verkürzen können 
mittels Zählern und und die Impulse überarbeitet.
Die Modelservo arbeitet jetzt genau so wie sie soll!

Vielen Dank noch mal, Chris!

Und hier ist das Programm von mir:
1
;       -Servosteuerung für Demonstrationszwecke.
2
;       -Dauer PWM
3
;
4
;       -Projekt von Nico Subic, Daniel Wittmann & Finn Jensen
5
;
6
;Die Servo wird sich jede 3 Sekunden von Linksanschlag
7
;in 13 Schritten (15° Schritte) weiter nach rechts bewegen.
8
;Dann wird die Modellservo 36 Sekunden lang nichts tun,
9
;um danach wieder auf Linksanschlag zu gehen.
10
;Ab dem Punkt geht es von vorne los.
11
;
12
;Es wird der Pin RB0 für das Signal verwendet. (PORTB,0)
13
;Es wird der Interne 4MHz Oszillator verwendet.
14
;
15
;              ______
16
;         RA2-|O|__| |-RA1
17
;         RA3-|  1   |-RA0
18
;         RA4-|  6   |-RA7
19
;         RA5-|  F   |-RA8
20
;      VSS----|  6   |----VDD
21
;Signal ->RB0-|  2   |-RB7
22
;         RB1-|  8   |-RB6
23
;         RB2-|  A   |-RB5
24
;         RB3-|______|-RB4
25
;
26
;Verwendet wird ein PIC16F628A
27
28
29
    list        p=16f628a
30
    #include    <P16F628A.inc>
31
    __CONFIG    h'3F38'
32
    errorlevel  -302
33
34
    org         0x00    ;Alles auf Anfang stellen
35
36
;Variablenvergabe
37
38
    cblock      0x20
39
        d1      ;3 Variablen für die 36 Sekunden
40
        d2
41
        d3
42
43
        e2      ;2 Variablen
44
        e3      ;für die 20ms, bei denen das bit auf 0 gesetzt sein muss
45
                ;Man könnte jedes mal den Wert berechnen, der noch
46
                ;über bleibt von dem Impuls, um das Signal
47
                ;immer auf 20ms zu halten, aus Platzgründen wird das
48
                ;hier nicht gemacht!
49
50
        e1      ;ab hier PWM Impuls Variablen
51
        f1
52
        g1
53
        g2
54
        h1
55
        h2
56
        i1
57
        i2
58
        j1
59
        j2
60
        k1
61
        k2
62
        l1
63
        l2
64
        m1
65
        m2
66
        n1
67
        n2
68
        o1
69
        o2
70
        p1
71
        p2
72
        q1
73
        q2
74
75
        Timer150_0  ;ab hier die Zähler Variablen
76
        Timer150_1
77
        Timer150_2
78
        Timer150_3
79
        Timer150_4
80
        Timer150_5
81
        Timer150_6
82
        Timer150_7
83
        Timer150_8
84
        Timer150_9
85
        Timer150_10
86
        Timer150_11
87
        Timer150_12
88
    endc
89
90
;Initialisierung
91
92
init
93
    bsf     STATUS, RP0
94
    movlw   B'00000000'
95
    movwf   TRISB
96
    bcf     STATUS, RP0
97
    clrf    PORTB
98
99
;Alle Timer auf 150 mal stellen.
100
;Jedes PWM Signal wird so 150 mal wiederholt,
101
;bis das nächste PWM Signal kommen kann.
102
;150 * 20ms = 3.000ms => 3s - Also 3 Sekunden bis nächstes PWM Signal
103
;Hier wird gänzlich auf eine Warteschleife in der nichts passiert verzichtet.
104
;Die Servo kann jederzeit nachrichten um definitiv die Position zu halten.
105
;Idealfall, braucht aber mehr Strom.
106
107
;###############################################################################
108
;#Hauptprogramm                                                                #
109
;###############################################################################
110
Timer0
111
  movlw  0x96
112
  movwf  Timer150_0
113
Timer0_0
114
  decfsz  Timer150_0, f
115
  goto  PWM0
116
    goto    Timer1
117
118
Timer1
119
  movlw  0x96
120
  movwf  Timer150_1
121
Timer1_0
122
  decfsz  Timer150_1, f
123
  goto  PWM1
124
    goto    Timer2
125
126
Timer2
127
  movlw  0x96
128
  movwf  Timer150_2
129
Timer2_0
130
  decfsz  Timer150_2, f
131
  goto  PWM2
132
    goto    Timer3
133
134
Timer3
135
  movlw  0x96
136
  movwf  Timer150_3
137
Timer3_0
138
  decfsz  Timer150_3, f
139
  goto  PWM3
140
    goto    Timer4
141
142
Timer4
143
  movlw  0x96
144
  movwf  Timer150_4
145
Timer4_0
146
  decfsz  Timer150_4, f
147
  goto  PWM4
148
    goto    Timer5
149
150
Timer5
151
  movlw  0x96
152
  movwf  Timer150_5
153
Timer5_0
154
  decfsz  Timer150_5, f
155
  goto  PWM5
156
    goto    Timer6
157
158
Timer6
159
  movlw  0x96
160
  movwf  Timer150_6
161
Timer6_0
162
  decfsz  Timer150_6, f
163
  goto  PWM6
164
    goto    Timer7
165
166
Timer7
167
  movlw  0x96
168
  movwf  Timer150_7
169
Timer7_0
170
  decfsz  Timer150_7, f
171
  goto  PWM7
172
    goto    Timer8
173
174
Timer8
175
  movlw  0x96
176
  movwf  Timer150_8
177
Timer8_0
178
  decfsz  Timer150_8, f
179
  goto  PWM8
180
    goto    Timer9
181
182
Timer9
183
  movlw  0x96
184
  movwf  Timer150_9
185
Timer9_0
186
  decfsz  Timer150_9, f
187
  goto  PWM9
188
    goto    Timer10
189
190
Timer10
191
  movlw  0x96
192
  movwf  Timer150_10
193
Timer10_0
194
  decfsz  Timer150_10, f
195
  goto  PWM10
196
    goto    Timer11
197
198
Timer11
199
  movlw  0x96
200
  movwf  Timer150_11
201
Timer11_0
202
  decfsz  Timer150_11, f
203
  goto  PWM11
204
    goto    Timer12
205
206
Timer12
207
  movlw  0x96
208
  movwf  Timer150_12
209
Timer12_0
210
  decfsz  Timer150_12, f
211
  goto  PWM12
212
    call    Warten_36000
213
    goto    Timer0
214
215
;###############################################################################
216
;#Subroutinen                                                                  #
217
;###############################################################################
218
PWM0
219
    bsf     PORTB,0
220
    call    Warten_Impuls_0
221
    bcf     PORTB,0
222
    call    Warten_20ms
223
    bcf     PORTA,
224
    goto    Timer0_0
225
226
PWM1
227
    bsf     PORTB,0
228
    call    Warten_Impuls_1
229
    bcf     PORTB,0
230
    call    Warten_20ms
231
    goto    Timer1_0
232
233
PWM2
234
    bsf     PORTB,0
235
    call    Warten_Impuls_2
236
    bcf     PORTB,0
237
    call    Warten_20ms
238
    goto    Timer2_0
239
240
PWM3
241
    bsf     PORTB,0
242
    call    Warten_Impuls_3
243
    bcf     PORTB,0
244
    call    Warten_20ms
245
    goto    Timer3_0
246
247
PWM4
248
    bsf     PORTB,0
249
    call    Warten_Impuls_4
250
    bcf     PORTB,0
251
    call    Warten_20ms
252
    goto    Timer4_0
253
254
PWM5
255
    bsf     PORTB,0
256
    call    Warten_Impuls_5
257
    bcf     PORTB,0
258
    call    Warten_20ms
259
    goto    Timer5_0
260
261
PWM6
262
    bsf     PORTB,0
263
    call    Warten_Impuls_6
264
    bcf     PORTB,0
265
    call    Warten_20ms
266
    goto    Timer6_0
267
268
PWM7
269
    bsf     PORTB,0
270
    call    Warten_Impuls_7
271
    bcf     PORTB,0
272
    call    Warten_20ms
273
    goto    Timer7_0
274
275
PWM8
276
    bsf     PORTB,0
277
    call    Warten_Impuls_8
278
    bcf     PORTB,0
279
    call    Warten_20ms
280
    goto    Timer8_0
281
282
PWM9
283
    bsf     PORTB,0
284
    call    Warten_Impuls_9
285
    bcf     PORTB,0
286
    call    Warten_20ms
287
    goto    Timer9_0
288
289
PWM10
290
    bsf     PORTB,0
291
    call    Warten_Impuls_10
292
    bcf     PORTB,0
293
    call    Warten_20ms
294
    goto    Timer10_0
295
296
PWM11
297
    bsf     PORTB,0
298
    call    Warten_Impuls_11
299
    bcf     PORTB,0
300
    call    Warten_20ms
301
    goto    Timer11_0
302
303
PWM12
304
    bsf     PORTB,0
305
    call    Warten_Impuls_12
306
    bcf     PORTB,0
307
    call    Warten_20ms
308
    goto    Timer12_0
309
310
;###############################################################################
311
;#36 Sekunden Warteschleife, bis "nächster Tag"                                #
312
;###############################################################################
313
Warten_36000
314
  movlw  0x47
315
  movwf  d1
316
  movlw  0x7A
317
  movwf  d2
318
  movlw  0x4F
319
  movwf  d3
320
Warten_36000_0
321
  decfsz  d1, f
322
  goto  $+2
323
  decfsz  d2, f
324
  goto  $+2
325
  decfsz  d3, f
326
  goto  Warten_36000_0
327
  goto  $+1
328
  goto  $+1
329
  goto  $+1
330
  return
331
332
;###############################################################################
333
;#Start von PWM Signalgenerierung                                              #
334
;###############################################################################
335
Warten_20ms
336
  movlw  0x9E
337
  movwf  e2
338
  movlw  0x10
339
  movwf  e3
340
Warten_20ms_0
341
  decfsz  e2, f
342
  goto  $+2
343
  decfsz  e3, f
344
  goto  Warten_20ms_0
345
  goto  $+1
346
  nop
347
  return
348
349
;###############################################################################
350
;#Jetzt kommen die Impulssignale                                               #
351
;###############################################################################
352
Warten_Impuls_0
353
  movlw  0xB2
354
  movwf  e1
355
Warten_Impuls_0_0
356
  decfsz  e1, f
357
  goto  Warten_Impuls_0_0
358
  nop
359
  return
360
361
Warten_Impuls_1
362
  movlw  0xE3
363
  movwf  f1
364
Warten_Impuls_1_0
365
  decfsz  f1, f
366
  goto  Warten_Impuls_1_0
367
  goto  $+1
368
  return
369
370
Warten_Impuls_2
371
  movlw  0xA6
372
  movwf  g1
373
  movlw  0x01
374
  movwf  g2
375
Warten_Impuls_2_0
376
  decfsz  g1, f
377
  goto  $+2
378
  decfsz  g2, f
379
  goto  Warten_Impuls_2_0
380
  return
381
382
Warten_Impuls_3
383
  movlw  0xC3
384
  movwf  h1
385
  movlw  0x01
386
  movwf  h2
387
Warten_Impuls_3_0
388
  decfsz  h1, f
389
  goto  $+2
390
  decfsz  h2, f
391
  goto  Warten_Impuls_3_0
392
  goto  $+1
393
  nop
394
  return
395
396
Warten_Impuls_4
397
  movlw  0x05
398
  movwf  i1
399
  movlw  0x02
400
  movwf  i2
401
Warten_Impuls_4_0
402
  decfsz  i1, f
403
  goto  $+2
404
  decfsz  i2, f
405
  goto  Warten_Impuls_4_0
406
  goto  $+1
407
  return
408
409
Warten_Impuls_5
410
  movlw  0xFF
411
  movwf  j1
412
  movlw  0x01
413
  movwf  j2
414
Warten_Impuls_5_0
415
  decfsz  j1, f
416
  goto  $+2
417
  decfsz  j2, f
418
  goto  Warten_Impuls_5_0
419
  return
420
421
Warten_Impuls_6
422
  movlw  0x1D
423
  movwf  k1
424
  movlw  0x02
425
  movwf  k2
426
Warten_Impuls_6_0
427
  decfsz  k1, f
428
  goto  $+2
429
  decfsz  k2, f
430
  goto  Warten_Impuls_6_0
431
  return
432
433
Warten_Impuls_7
434
  movlw  0x3A
435
  movwf  l1
436
  movlw  0x02
437
  movwf  l2
438
Warten_Impuls_7_0
439
  decfsz  l1, f
440
  goto  $+2
441
  decfsz  l2, f
442
  goto  Warten_Impuls_7_0
443
  goto  $+1
444
  return
445
446
Warten_Impuls_8
447
  movlw  0x58
448
  movwf  m1
449
  movlw  0x02
450
  movwf  m2
451
Warten_Impuls_8_0
452
  decfsz  m1, f
453
  goto  $+2
454
  decfsz  m2, f
455
  goto  Warten_Impuls_8_0
456
  nop
457
  return
458
459
Warten_Impuls_9
460
  movlw  0x75
461
  movwf  n1
462
  movlw  0x02
463
  movwf  n2
464
Warten_Impuls_9_0
465
  decfsz  n1, f
466
  goto  $+2
467
  decfsz  n2, f
468
  goto  Warten_Impuls_9_0
469
  goto  $+1
470
  goto  $+1
471
  return
472
473
Warten_Impuls_10
474
  movlw  0x93
475
  movwf  o1
476
  movlw  0x02
477
  movwf  o2
478
Warten_Impuls_10_0
479
  decfsz  o1, f
480
  goto  $+2
481
  decfsz  o2, f
482
  goto  Warten_Impuls_10_0
483
  goto  $+1
484
  nop
485
  return
486
487
Warten_Impuls_11
488
  movlw  0xB1
489
  movwf  p1
490
  movlw  0x02
491
  movwf  p2
492
Warten_Impuls_11_0
493
  decfsz  p1, f
494
  goto  $+2
495
  decfsz  p2, f
496
  goto  Warten_Impuls_11_0
497
  nop
498
  return
499
500
Warten_Impuls_12
501
  movlw  0xCF
502
  movwf  q1
503
  movlw  0x02
504
  movwf  q2
505
Warten_Impuls_12_0
506
  decfsz  q1, f
507
  goto  $+2
508
  decfsz  q2, f
509
  goto  Warten_Impuls_12_0
510
  return
511
512
;###############################################################################
513
;#Ende der PWM Signalgenerierung                                               #
514
;###############################################################################
515
516
    end

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.