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
Das ist noch mal die ASM Datei, falls ihr das ganze lieber in MPLAB einfügen wollt, der Übersicht halber.
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
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.
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!
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.
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
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
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.
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
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.
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
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.
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?
Einfach ein GND vom Pic Board zum GND des Labornetzteiles machen. GND der Platine z.B. vom ICSP Stecker.
Das wäre dann die neue Beschaltung, ohne Spannungsregler auf dem Steckboard und Vellemannbrenner.
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?
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.