-
        

Ergebnis 1 bis 5 von 5

Thema: [läuft+Code] Servotest an ATtiny13 läuft nicht

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    [läuft+Code] Servotest an ATtiny13 läuft nicht

    Anzeige

    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.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    59
    Beiträge
    242
    Wenn die Impulsfolge so stimmt, sollte der Servo positionieren (1-2ms auf 5V bei 20ms Zyklus) . Hast Du das nachgemessen ? (Frequenz, Spannung).

    Gruß
    pctoaster

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ohne die ...
    ... paar lausigen Assemblerzeilen ...
    ... zu kennen: Reines Rätselraten oder Glaskugellesen!

    Gruß Dirk

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    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°.

    Code:
    ;===================================================================================
    ; 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.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    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
    Code:
    ;===================================================================================
    ;========== 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.
    Ciao sagt der JoeamBerg

Berechtigungen

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