-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: servo tester

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    24
    Beiträge
    206

    servo tester

    Anzeige

    hallo

    ich habe diesen fertigen programm text ( ich kann kein assambler nur Bascom doch ich möchte das rad nicht neu erfinden) wie kann ich hier den ad bereich auswählen zum beispiel ad zwischen 10 - 100 ansatt von 0 - 1024

    Code:
    ; ==========================================
    ; Servotester für den Modellbau mit ATtiny13
    ; ==========================================
    ;
    ; Version 1.00 (23.05.2008)
    ;
    ; Fuse-Bits:	BODLEVEL1=0	\ BrownOut-Spannung
    ;		BODLEVEL0=0	/ =4,3V
    ;		CKSEL1=1	\ Interner Oszillator
    ;		CKSEL0=0	/ =9,6MHz
    ;		CKDIV8=1	- Vorteiler /8 aus
    ;		SUT1=1		\ Maximale
    ;		SUT0=0		/ Startverzögerung
    ;
    ; Ports:	PB0 - Eingang (Pull-up)	nicht genutzt
    ;		PB1 - Eingang (Pull-up)	nicht genutzt
    ;		PB2 - Eingang (Pull-up)	nicht genutzt
    ;		PB3 - Eingang (analog)	Potentiometer
    ;		PB4 - Ausgang (H-aktiv)	Impuls-Ausgang zum Servo
    ;		PB5 - Eingang (Pull-up)	Reset
    ;
    ; Timer:	Timer0, wird mit Vorteiler 64 betrieben, Taktfrequenz=
    ;		150kHz, Interrupt bei Overflow und Zählung eines H-Byte
    ;
    .nolist
    .include "tn13def.inc"
    .list
    ;
    ; Register-Definitionen
    ;
    .def	timerh=	r2		;High-Byte für Timer0, wird bei jedem
    				;Timer0 Overflow Interrupt um 1 erhöht
    .def	backup=	r3		;SREG-Zwischenspeicher für Interrupts
    .def	servol=	r4		;berechneter Servo-Zählerstand Low
    .def	servoh=	r5		;berechneter Servo-Zählerstand High
    .def	flags=	r25		;Bit0: Impuls-Ende wurde bearbeitet
    ;
    .cseg
    .org	0
    ;
    reset:	rjmp	start		;Programm-Beginn
    int0ad:	reti			;External Int 0 (nicht genutzt)
    pci0ad:	reti			;Pin Change Interrupt (nicht genutzt)
    ovf0ad:	rjmp	timer0		;Timer0 Overflow Interrupt - 585,9Hz
    				;bzw. alle 1,707ms
    erdyad:	reti			;EEPROM Ready (nicht genutzt)
    aciadd:	reti			;Analog Comparator (nicht genutzt)
    oc0aad:	reti			;Timer0 Compare Match A (nicht genutzt)
    oc0bad:	reti			;Timer0 Compare Match B (nicht genutzt)
    wdtadd:	reti			;Watchdog Time-out (nicht genutzt)
    adccad:	reti			;ADC Conversion Complete (nicht gen.)
    ;
    ; Initialisierung ---------------------
    ;
    start:	ldi	r16,0b010000
    	out	ddrb,r16		;PB4 auf Ausgang setzen
    	ldi	r16,0b100111		;PB4 auf Low und Pull-up an den
    	out	portb,r16		;Eingängen PB0-PB2 aktivieren
    ;
    ;	ldi	r16,neuer-wert		;hier lässt sich der Oszillator
    ;	out	osccal,r16		;anpassen, falls das Ausgangs-
    ;					;signal stark von 20ms abweicht
    ;
    	clr	r16
    	out	tcnt0,r16		;Timer0 Zähler löschen
    	out	tccr0a,r16		;Timer0 im Normal-Modus
    	ldi	r16,0b11<<cs00
    	out	tccr0b,r16		;Timer0, Vorteiler=64 setzen
    	ldi	r16,1<<toie0		;Overflow Interrupt aktivieren
    	out	timsk0,r16		;Interrupt einschalten
    ;
    	ldi	r16,(1<<adlar)+(0b11<<mux0);Vcc als Referenz und PB3
    	out	admux,r16		;als Eingang, Wert linksbündig
    	ldi	r16,(1<<aden)+(1<<adsc)+(0b111<<adps0);ADC ein, Start,
    	out	adcsra,r16		;Vorteiler=128
    	ldi	r16,1<<adc3d		;Digital Input Disable PB3
    	out	didr0,r16		;setzen
    ;
    	clr	timerh			;Timer H-Byte löschen
    	sei				;Interrupt aktivieren
    	wdr				;Watchdog-Timer zurücksetzen
    	ldi	r16,1<<wde		;Watchdog ein, 2k (16ms)
    	out	wdtcr,r16		;Watchdog aktivieren
    ;
    ; Hauptprogramm -----------------------
    ;
    main:	wdr				;Watchdog-Timer zurücksetzen
    ;
    ; Impuls-Ende ermitteln und bearbeiten
    ;
    	bst	flags,0			;Impuls-Ende-Flag gesetzt?
    	brts	main10			;ja -> Bearbeitung überspringen
    	in	r16,tcnt0		;sonst Timer0 Zählerstand holen
    	mov	r17,timerh		;Timer H-Byte holen
    	sub	r16,servol
    	sbc	r17,servoh		;Zählerstand erreicht?
    	brmi	main10			;nein -> überspringen
    ;
    	sbr	flags,0b00000001	;Ende-Flag setzen
    	cbi	portb,4			;Ausgang PB4 auf Low setzen
    ;
    ; Zyklus-Ende / Impuls-Start ermitteln und bearbeiten
    ;
    main10:	in	r16,tcnt0		;Timer0 Zählerstand holen
    	mov	r17,timerh		;Timer H-Byte holen
    	ldi	r18,low(3000)
    	ldi	r19,high(3000)		;Zählerwert für 20ms laden
    	sub	r16,r18
    	sbc	r17,r19			;Zählerstand erreicht?
    	brmi	main			;nein -> Hauptschleife
    ;
    ; Timer zurücksetzen, ADC lesen
    ;
    	clr	r16			;sonst
    	out	tcnt0,r16		;Timer0 auf 0 setzen
    	clr	timerh			;H-Byte auf 0 setzen
    	sbi	portb,4			;Ausgang PB4 auf High setzen
    	clr	flags			;Flags löschen
    ;
    	in	r16,adch		;ADC-Wert lesen (0-255)
    	ldi	r17,181			;Multiplikator für Poti-Bereich
    					;1,2ms laden (Zählerstand 181)
    ;
    ; Multiplikation ADC-Wert mit 181 zur Ermittlung des Timer-Zählerstan-
    ; des, 8Bit * 8Bit Multiplikation nach Atmel Application Note AVR200
    ;
    	clr	r18			;Ergebnis H-Byte löschen
    	ldi	r19,8			;Schleifenzähler setzen
    	lsr	r17			;Multiplikator rotieren
    main20:	brcc	main30			;LSB=0? ja -> weiter, sonst
    	add 	r18,r16			;Multiplikand zum H-Byte add.
    main30:	ror	r18			;Ergebnis H-Byte rotieren
    	ror	r17			;Ergebnis L-Byte rotieren
    	dec	r19			;alle Schleifen durchlaufen
    	brne	main20			;nein -> Schleife
    ;
    ; Zählerstand für Servo-Position ermitteln, ADC neu starten
    ;
    	ldi	r16,low(135)
    	ldi	r17,high(135)		;Zählerwert für 0,9ms laden
    	clr	r19			;H-Byte des Multiplikations-
    	add	r16,r18			;Ergebnisses addieren
    	adc	r17,r19			;Übertrag addieren
    	mov	servol,r16		;berechneten Zählerwert
    	mov	servoh,r17		;speichern
    	sbi	adcsra,adsc		;ADC neu starten
    	rjmp	main
    ;
    ; Timer0 Overflow Interrupt -----------
    ;
    timer0:	in	backup,sreg		;SREG sichern
    	inc	timerh			;Timer0 H-Byte erhöhen
    	out	sreg,backup		;SREG wiederherstellen
    	reti
    ;
    danke schon mal
    gruß
    martin

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    20.09.2008
    Beiträge
    62
    Hallo Martin,
    Antwort kann ich dir leider auch keine geben, nehme aber die Gelegenheit beim Schopf, mich an deinen Tread anzuhängen, weil ich ebenfalls dabei bin, mir einen Servotester mit einem Atmel Tiny13 zu bauen (Assembler codiert).

    Bin mitten drin, habe aber ein Problem:
    Bei Einschalten wird der Wert des ADC-Wandlers einwandfrei abgefragt, aber im weiteren Programmverlauf scheint dies nicht mehr zu sein. Jedenfalls wird ein geänderter ADC-Wert (mit Poti) nicht in den Timer übernommen.
    Ich finde bei aller Mühe meinen Gedankenfehler nicht!

    Code ist angehängt (nicht ganz vollständig für den Servotester, sondern abgespeckt auf das Problem).

    Kann mir und Martin da jemand helfen?

    LG Heinz
    Angehängte Dateien Angehängte Dateien

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Hallo ihr Beiden,

    vor etlicher Zeit habe ich verschiedene Servotester gebaut. Tiny13 und ein Poti zum Verstellen. Hier ein Bild vom Aufbau (klick).

    ................

    Dazu gabs eine Programmierung in Assembler (klick) die ziemlich holprig war. Beachte: im Code ist die Schaltung skizziert - bitte darauf achten, dass die Servoversorgung nicht über den Spannungsregler läuft und als Zuleitung max. 6 V nehmen. Mittlerweile ist der ähnliche Aufbau in C programmiert (klick) und bei mir immer wieder in Betrieb. Der Aufbau ist nochmal hier gezeigt, Schaltung, Bestückung und Quellcode in C sind in diesem Link zu finden.

    Ergänzungen: Im hier gezeigten Bild ist rechts neben dem SigOut-Pin ein Kontaktstift zu sehen - der dient beim Testen manchmal zum Anschluss des Oskars. Oberhalb vom Poti ist eine zweipolige Buchse mit Brücke. Hier kann man zur Messung der Stromaufnahme des Servos ein Amperemeter einschleifen. Diese Ergänzungen sind immer wieder mal äusserst nützlich.

    Vielleicht hilft euch dies weiter.

    Viel Erfolg.
    Geändert von oberallgeier (14.09.2017 um 18:20 Uhr)
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.09.2008
    Beiträge
    62
    Hi,

    muss mich erst mal bei Martin entschuldigen, dass ich seinen tread "missbraucht" habe. Aber er hat sich angeboten, um nicht einen neuen aufzumachen.

    Hatte gestern eine "loop" in meinem Hirn ...
    Kam heute raus und nun funktioniert alles bestens - in Assembler.
    Ich muss dazu sagen, dass ich kein Profi auf dem Gebiet bin, sondern gelegentlich mal zu AVR's greife, wenn ich eine Problemstellung habe und mir eine Lösung mit einem µC als geeignet erscheint.
    "Gelernt" habe ich keine der Programmiersprachen. Ich wurschtle mich halt so durch - in Assembler.

    Anbei mein fertiger Code.

    @ Martin
    Falls du Fragen dazu hast, keine Scheu.

    Danke und LG Heinz
    Angehängte Dateien Angehängte Dateien

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.09.2008
    Beiträge
    62
    Hallo Joe,
    hab mir nun deinen code angesehen und versucht ihn zu "lesen" (zu verstehen).
    Leider reichen meine Kenntnisse nicht aus, um nachvollziehen zu können, was und wie da alles programmiert ist.
    Ist für mich "high sofisticated"!
    Und ich stecke programmtechnisch noch in den Kinderschuhen!
    Daran wird sich wahrscheinlich auch so schnell nichts ändern, denn dazu baue ich viel zu wenig oft etwas mit AVR's.
    Und wenn, dann sind das auch nur ganz simple Sachen ...

    lg Heinz

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von HeSt
    ... code angesehen und versucht ihn zu ... verstehen ... Leider ... "high sofisticated" ...
    UUUuuups. Sorry, das trifft mich jetzt wirklich. Ich dachte immer, ich hätte zwar lausig schlecht dokumentiert, aber immer noch genug, um so etwas nachvollziehen zu können. Ist dieser hier in ASM, Version x81 vom 18.Okt. 07, unverständlich? Hat noch keinen Timer in Gebrauch, aber man kann durch eine Warteschleife hübsch mit dem Servo spielen. Allerdings ist die Routine (in an sich zulässiger Weise) stark vereinfacht. Es wird kein konstanter 20-ms-Zyklus ausgegeben, sondern eine aktive Rampe mit einer wählbaren Länge zwischen 1 bis 2 ms wird durch ein 18,5-ms-Pause auf UNGEFÄHR die gewünschten 20 ms ergänzt.

    Zur Servoansteuerung kennst Du vermutlich diese Erläuterungen über die Ansteuerung von Servos ! ?

    Diese Quelle ist natürlich komplizierter. Liest über den ADC (adc_hol) den aktuellen Wert des Potiwiderstandes - aber nur als ADC-Wert und braut daraus die Ansteuerung für den Servo.

    Kann ich vielleicht helfen? Was genau verstehst Du nicht? Vielleicht könnten wir es klären?
    Ciao sagt der JoeamBerg

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.09.2008
    Beiträge
    62
    Keine Kritik an deiner Doku !!!!
    Da ich noch schlecht programmiere, habe ich noch Verständnisprobleme mit einigen Befehlen! Weiß also nicht wofür sie gut sind und wie sie arbeiten.
    Habe noch nie mit "word" gearbeitet, geschweige denn mit EEPROM oder SRAM (was bei dir eh nicht vorkommt). Deine defines (ms185,msvar) sind mir unbekannt. Kann man da Breiche angeben? Was bedeuten word lsb/msb?
    Du siehst, bei mir haperts schon am Basiswissen. Also kann ich dein Programm nicht richtig lesen, weil mir das Wissen dazu fehlt!
    Liegt nicht an deiner Doku !!!

    Wie gesagt, ich hab weder einen Kurs gemacht noch ein Fachbuch gelesen, weil es bislang für meine Anwendungen nicht notwendig war.
    Aber offensichtlich sollte ich mir da was zulegen.

    Die Ansteuerung der Servos ist mir sehr wohl bekannt. Habe ja früher 27MHZ Sender, Empfänger und Servoelektronik selber gebaut. Alles ohne µC's. Auch einen Servotester mit 555er. Der lässt aber starke Servos zucken. Deshalb versuche ich es nun mit dem Tiny13. Allerdings hab ich festgestellt, dass der interne Oszillator nicht ganz stabil läuft. Mal sehen, wie sich das auf die Servos auswirkt. Die HW-Realisierung muss noch ein wenig warten ...

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von HeSt
    Keine Kritik an deiner Doku ...
    Warum nicht. Dokumentation kann nie gut genug sein!

    Zitat Zitat von HeSt
    ... Verständnisprobleme mit einigen Befehlen! Weiß also nicht wofür sie gut sind und wie sie arbeiten ...
    Na dann wärs doch gut, irgendwelche ASM-Schnippsel zu nehmen und damit zu spielen - meinetwegen auch meine Schnippsel. Den kompletten Befehlsatz zum tiny13 gibts im Kapitel 21 der aktuellen Dokumentation (zum download) "Instruction Set Summary". Am besten runterladen und in die directory ..\Datenblätter\µController+Verwandtes abspeichern. Und im Namen immer gleich die Versionsnummer dazu.

    Vielleicht liest Du Dir mal dieses tutorial durch, das ist schon mal ne vernünftige Einführung - noch keine vollständige Schulung! Dazu könntest Du Dir auch AVRStudio installieren. Das hat einen Assembler - und der bringt Dir eine tolle Hilfe für die einzelnen Befehle!

    Zitat Zitat von HeSt
    ... Aber offensichtlich sollte ich mir da was zulegen ...
    Genau. Ein ziemlich tiefschürfendes Assemblertutorial findest Du hier. Da sind solche krytischen Dinge wie SRAM und mehr gut erklärt (klick).

    Word, MSB, LSB: lies das hier durch. Und sei nicht ungehalten, dass ich Dir Links nenne und das nicht selbst schreibe. Ich bin halt faul *ggg*. Ausserdem - bis ich die Geschichte der Groß- und Kleinender (little endian und so) erklärt hätte . . . .

    Zitat Zitat von HeSt
    ... dass der interne Oszillator nicht ganz stabil läuft. Mal sehen, wie sich das auf die Servos auswirkt ...
    Meine Erfahrungen mit Servos sind eher spärlich, aber Probleme mit dem internen Oszillator kann ich mir bei der Servosteuerung kaum vorstellen. WENN dieser Oszillator wegdriftet, dann wirkt sich das ja auf Highpegel und Lowpegel der Ansteuerung gleichmässig aus (ausser die Schwankungen wären schneller als 50 Hz *ggg*).

    Zitat Zitat von HeSt
    ... Die HW-Realisierung muss noch ein wenig warten ...
    Schade! Denn Du kannst natürlich im AVRStudio im Simulator die Auswirkungen des Codes sehen - aber im Realen ist das immer viel hübscher. Eben anschaulicher.

    Viel Erfolg.
    Ciao sagt der JoeamBerg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.09.2008
    Beiträge
    62
    Es ist richtig, dass eine Doku nie gut und ausreichend genug sein kann.
    Aber Kritik gibt's nur dann, wenn sie mies ist!
    Was ich bislang noch nicht rausgefunden hab ist, wie du die Impulszeit von extern (Poti, Taste) beeinflusst - oder ist das noch nicht in deinem code?

    Zum Lernen hab ich mir das Franzis-Paket zugelegt. Da ist das AVR-Studio dabei - damit hab ich mir die bisherigen Kenntnisse erworben. Aber hier sind halt nur ganz einfache Beispiele drin. Es geht ja eh noch weiter ...
    Allerdings kann man die Programme im AVR-Studio nur bedingt ablaufen lassen um deren Ablauf und Wirkung zu testen. Zumindest geht's mir so.
    In der Realität sieht's oft anders aus.

    Mit "Schnippsel" hab ich eigentlich noch nie gearbeitet, da ich aufgrund meiner minderen Kenntnisse andere Programme schwer bis kaum zu lesen (verstehen) vermag. Darum Suche ich auch kaum in/nach anderen Programmen.

    Auf jeden Fall danke ich dir für die vielen Links!! Ist in Ordnung es so zu machen - ich würde es auch! Warum das Rad neu beschreiben, wenn es schon was sinnvolles gibt!

    Den Oszillatordrift kannst du am Scope schön sehen. Er bewegt sich durch die angewandte Programmiertechnik beim Impuls in einem Bereich von ca. 0,02mS. Nachdem das ein gehöriger %-Satz von 0,7mS ist ...!?
    Ist ein schönes, gleichmäßiges "Pumpen", denn ein Zittern.
    Mal sehen, ob das nur am Scope so aussieht ....
    Bei der Pause ist das völlig egal - die kann um einige mS abdriften.

    Mit der HW-Realisierung meinte ich den Bau auf geätzter Platine.
    Ich hab einen Versuchsaufbau gemacht, um mit dem Scope die Zeiten zu messen. Hab aber noch kein Servo angeschlossen. Vielleicht mach ich das noch vor dem endgültigen Aufbau.

    Nochmals vielen Dank für die Hinweise und Links!!!!!

    ps:
    Hab meinen code durch "Umstellen" noch etwas effektiver/kürzer gebracht.
    Zuerst Poti lesen, dann Impuls ausgeben, danach die Pause. Dadurch braucht der Timer nur 1x gestartet werden, kann durchlaufen und nur wieder vor der ADC-Wandlung gestoppt werden.

    LGH

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Siehe kurzer Hinweis zum Code im PN. Ergänzung dazu: in C mit nem mega168/20MHz hatte ich auch mal einen Servotester gebaut. DER war gut - fünftausend Digits für den gesamten Verstellbereich und ein LCD zur Werteanzeige. War zum Experimentieren natürlich Spitze. Leider zerlegt - und der Code ist grottenschlecht.

    Find ich prima, dass Du die Oszillatordrift anschaust. Gibts dazu bitte mal ein Oskarbildchen? Und ein paar weitere Daten? Das ist ja mal was interessantes - würde ich gerne nachvollziehen.
    Ciao sagt der JoeamBerg

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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