PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [läuft+Code] Servotest an ATtiny13 läuft nicht



oberallgeier
13.10.2007, 16:50
Hallo,

ein tiny13 soll einen Servo (Carson 502001) testweise mal hin- und herdrehen.

Also

tinyGND---------------ServoGND
tinyVcc----------------ServoVcc
tinyPB3----------------ServoImpuls

Dann mit ein paar lausigen Assemblerzeilen

etwa sechs Sekunden lang jeweils
0,5 ms PB3 auf 1
19,5 ms PB3 auf 0
danach etwa sechs Sekunden jeweils
1,5 ms PB3 auf 1
18,5 ms PB3 auf 0
und Endlosschleife.

Dabei zittert der Servo hin und wieder spastisch vor sich hin. Aber das sieht nicht wirklich gut aus. Bei genauerem Hinsehen zuckelt er bei der Schaltfolge

PB3 1 -> 0 (wie oben geschrieben) in einen Anschlag und nach dem Umprogrammieren mit

PB3 0 -> 1 in den anderen.

Die Versorgungsspannung kommt von einem 9V-Block und ist mit einem LP2950 auf 4,97 V festgelegt. Die Spannung des Servo bleibt während der Schaltspiele bei 4,97 V (DVM).

Wer hilft mir bitte weiter?

Nachtrag: Ach ja, und dann habe ich auch die Zeiten geändert: 1,2 ms und 1,8 ms Signal, Rest Pause. War auch nix.

pctoaster
13.10.2007, 18:35
Wenn die Impulsfolge so stimmt, sollte der Servo positionieren (1-2ms auf 5V bei 20ms Zyklus) . Hast Du das nachgemessen ? (Frequenz, Spannung).

Gruß
pctoaster

Dirk
13.10.2007, 20:31
Ohne die ...

... paar lausigen Assemblerzeilen ...
... zu kennen: Reines Rätselraten oder Glaskugellesen!

Gruß Dirk

oberallgeier
13.10.2007, 22:31
Danke Dirk, danke pctoaster,

aber es lag (ich schäme mich) nicht am Code. Ich hatte ja mit schlechtem Gewissen schon die Vcc am tiny geprüft, aber der war wohl jedes Mal beim Ansteuern des Servos (schon nach ein paar Mikrosekunden) an Auszehrung verhungert und die Spannung war wieder voll da - - - will sagen: ich hatte meine Ahnung leider bestätigt, dass der Port vom tiny13 den Servo nicht treiben kann - oder dass der LP2950 eben nicht ein paar hundert Milliampere durchlässt, und der µC vor Energiemangel einschläft. ALLES jenseits der Spezifikation.

Versorgung des Servos vom Netzteil mit Imax 1A am tiny13 vorbei hatte meine Nachtruhe gerettet, der Servo läuft jetzt brav mal links ca. 40° - danach rechts ca. 40°.


;================================================= ==================================
; Versionsgeschichte:
;
;* Servo CARSON 502001 einfach hin- und herfahren
;* Nach mehreren Versuchen gehts
; Fehler:
; PB3 des tiny13 liefert nicht genug Strom => brown out => teilw. reset
;
; +--------+
; Vcc(9VBlock) --+ LP2950 +---+------Vcc-tiny13
; +---+----+ +-----------------Vcc-Servo
; |
; | tiny13-PB3------Signal-Servo
; |
; | +----------GND-tiny13
; GND----------------+----+---------------------GND-Servo
;
;* ===============================================
; Behebung:
; Servo über getrennte Leitung, max. 1 A, vom Labornetzteil versorgt
;
; Vcc(6VLNT) ---------------------------------------Vcc-Servo
; +--------+
; Vcc 2 (9VBlock) --+ LP2950 +------Vcc-tiny13
; +---+----+
; | tiny13-PB3-----Signal-Servo
; +-----------GND-tiny13
; GND--------------------+--------------------------GND-Servo
;
;* ==============================================
Sorry für den verfrühten Hilferuf.

Danke pctoaster, danke Dirk.

oberallgeier
18.10.2007, 16:49
Nun höre ich auf. Die Lösung ist nicht so, wie ich es wollte - ohne Timerinterrupt, ohne PWM, das krieg ich mit dem tiny13 nicht hin.

Aber man kann mit dem tiny13 immerhin hübsch mit einem Servo spielen

;================================================= ==================================
;========== Beachte: printout aus AVRStudio geht (nur) bis col 85 ==================
;* Target MCU : ATtiny13
;* Target Hardware : Servo auf PB4
;* Target cpu-frequ. : 4,8 MHz, interner Oszillator
;
;================================================= ==================================
;* Versionsgeschichte:
;x81 18Okt07 17:38 ;Quelle bereinigen
;x80 18Okt07 17:mm ;Servo variabel 1 -- 2 ms und Pause 18,5 ms ==> ok
;x04 18Okt07 15:21 ;Servo fest auf ca. 1,5 ms und Pause 18,5 ms ==> ok
;x03 18Okt07 14:56 ;20ms und 18,5 ms sind gesicherte Werte
;x01 18Okt07 13:42
;
;* Aufgabenstellung
;* Programm zum Testen des Servos (CARSON 502001)
; Servo über getrennte Leitung, max. 1 A, vom Labornetzteil versorgt
; Portbelegung, Schaltung auszugsweise
;
; Vcc(6V LNT) --------------------------------------Vcc-Servo
; +--------+
; Vcc2 (9VBlock) --+ LP2950 +------Vcc-tiny13
; +---+----+
; | tiny13-PB4-----Signal-Servo
; |
; +-----------GND-tiny13
; |
; GND--------------------+--------------------------GND-Servo
;
;* ===============================================
; ######### Original war:
;================================================= ==================================
; Speicherbelegung
; r20 Pausenwert Zähler, um r24,r25 rauf + runterzuzählen
; r21 Merker 100 ==> raufzählen, 0 ==> runterzählen
; r24 Word LSB vgl: ADIW Rd+1:Rd,K
; r25 Word MSB zu r24
; r26 word lsb Dies ist der COUNTER!! wird in Warte raufgezählt
; r27 word msb r24/r25 ist der Merker - der kann geändert werden
;================================================= ==================================

#include "tn13def.inc"

.org 0x0000 rjmp anfang ; Reset
;
;================================================= ==================================
; Deklarationen für den Praeprozessor
; Konstanten ####### evtl. auch keine Konstanten definiert
#define port4 servo
#define servo 4 ;Servo auf Port PB4
#define aufab r20 ;Register bis 240 rauf- und wied. runterzählen
#define ms185 65536-20655 ;Vorbelegung Counter-neu f 18,5 ms-wait (=18,44) OK
#define msvar 65536-1700 ;Vorbelegung Counter-neu f 1,5 ms-wait (=)
;================================================= ==================================
; Hauptprogramm
;================================================= ==================================
;
anfang:
rcall p_init ;Initialisierung
anfang2:
sbi portb,servo ;Schalte Servorampe ein
anf11: rcall wtvarms ;Warteschleife für aktive Rampe
cbi portb,servo ;Schalte Servorampe aus
anf31: rcall wt185ms ;Feste Warteschleife 18,5 ms
;
; Es folgt jetzt die Routine um den Servo (vorerst automatisch durch Zählen)
; runter- und raufzufahren. Später mit Tasten. Spannweite etwa 500 bis 3000
; das heisst: in 255 Schritten für etwas über 180 Grad Schwenkwinkel
; Zuerst: Variiere das Register aufab von 0 bis 250
; Prüfe ob rauf- oder runterzählen? Merker r21=100 ==> rauf, r21=0 ==> runter
;
andi r21,100 ;=100?
brne w_rauf ;bei 100 zähle word rauf um je 10
w_runtr:
sbiw r24,10 ;Zähle Merker word runter
dec aufab ;und dazu auch die Laufvariable
brne w_raus
ldi r21,100
rjmp w_raus
w_rauf:
adiw r24,10 ;Zähle Merker rauf
inc aufab ;und dazu auch die Laufvariable
brne w_raus
ldi r21,0
w_raus:
rjmp anfang2
;
;================================================= ==================================
; Prozeduren
;================================================= ==================================
;
p_init: ;=== Initialisiere den Mikrocontroller
; PB3 und PB4 als Ausgang
sbi ddrb,servo ;Datenrichtungsbit setzen
sbi ddrb,3 ;Datenrichtungsbit setzen
cbi portb,servo
sbi portb,3 ;Schalte
ldi aufab,125 ;Vorbelegen Merker für Hoch+ Runterzählen
ldi r21,100
ldi r24,low(msvar) ; Aktivzeit für Servo, kann durch Tasten hoch-
ldi r25,high(msvar) ; gefahren werden (wird noch realisiert)
ret ;=====----->>>>>
;
wt185ms: ;=== Warte 18,5 ms (===>> bei 4,8 MHz)
ldi r26,low(ms185) ;Lade Counter
ldi r27,high(ms185) ; mit festem Wert für 18,5 ms
wt185a:
adiw r26,1
brne wt185a
ret ;=====----->>>>>
;
wtvarms: ;=== Warte variable ms (angestrebt 1 .. 2 msec bei 4,8 MHz)
mov r26,r24 ;Lade Counter aus den Merker-Bytes. Der Merker
mov r27,r25 ; wird automatisch oder durch Tasten verändert
wtvara:
adiw r26,1
brne wtvara
ret ;=====----->>>>>
;
;================================================= ==================================
; Ende des Quellcodes
;================================================= ==================================

und wenns läuft, machts dann doch wieder Freude.