Gast
#272816
Hallo zusammen, als neues Hobby habe ich mich den Mikrocontrollern zugewandt. Und natürlich muß sich da auch was bewegen, nicht nur LEDs flackern. Also habe ich folgendes geschrieben, um ein Servo zu steuern. Habe einige Beispiele gesehen, die zwei Timer/Counter verwenden und habe mir überlegt, wie man sich einen sparen kann. Funktionieren tut es, aber erstmal die Frage an die Experten: Verbesserungsvorschläge? Bei der Stromversorgung habe ich das Problem, daß mein Servo offenbar so viel Strom zieht, daß der ATMega resettet. Ich habe das Servo mit an den TS7805 gehängt, beides an ein uraltes Steckernetzteil, das 3-12 Volt bringt. Mein Elko hat 22µF. Größerer Elko oder Servo vor den 7805er? Zum Programm: Ich nutze Counter0 mit /64-Prescaler @8MHz um Signale mit 1-2 ms Länge zu produzieren. Die Zahl der dann nötigen Counter-Schritte passt schön in ein Byte: 125*1/8000*64=1ms, 250*1/8000000*64=2ms, Das anzusteuernde Servo wähle ich durch left shift aus. Danach lade ich den Timer vor und setze den Port für das Servo high. Beim nächsten Timer-Event wird der Port 0 gesetzt, dann über einen left shift das nächste Servo gewählt u.s.w. Wie könnte ich elegant Stellwerte für die Servos aus dem RAM holen? ; Servosteuerung 1 .DEF servo1 = r17; .include "m8def.inc" rjmp RESET .org 0x09 rjmp TIMER .org 0x15 RESET: ; Stackpointer initialisieren ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ; Prescaler clock/64 ldi r16,0b00000011 out TCCR0,r16 ; TOIE0 setzen = Freigabe der Timers ldi r16,0b00000001 out TIMSK,r16 ; PORTB für Ausgabe konfigurieren. ldi r16,0b00111111 out DDRB,r16 ; PORTD für Eingabe konfigurieren. ldi r16,0b00000000 out DDRD,r16 sei ;interrupts enabled ldi servo1,127; Default-Stellung ; im Loop 3 Knöpfe abfragen, die wen gedrückt die Pins auf GND ziehen. loop: sbis PIND,PIND5; ldi servo1,80; sbis PIND,PIND6; ldi servo1,180; sbis PIND,PIND0; ldi servo1,0;; rjmp loop TIMER: in r19,SREG ; push r19; SREG retten ldi r19,0x00000000; out PORTB,r19; (Alles auf 0) ; Nächster Überlauf soll nach 255-[servo1] Cyclen, ; zu je 0,008 ms kommen: out TCNT0, servo1; lsl r20; ; wenn das Carry-Bit nicht gesetzt ist, 0-Setzung überspringen brhc SKIPNULLING ldi r20,0x00000001; Wenn Carry, dann waren alle 8 Servos dran SKIPNULLING: out PORTB,r20;Gewähltes Servo auf high bis nächster TIMER pop r19; out SREG, r19; RSREG wieder herstellen reti Michael