Abfragen in Welcher Position sich ein Servo befindet?

Alles über Software für die Elektronik

Moderator: dussel07

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon topas » 22.09.2011, 04:58

Typisch hws! Da wurde eine klare Aufgabenstellung beschrieben : Abfrage der Position eines Servos. Es wurde ein Bascom-Programm vorgestellt. Man sollte den Thread schon richtig lesen.
Natürlich kann man auch das Multiplexsignal verarbeiten. War hier aber nicht gefragt. Ist bei den meisten Empfängern auch nicht verfügbar. (Wozu auch? Es sollen ja Servos angeschlossen werden)
topas
 
Beiträge: 3796
Registriert: 16.08.2010, 12:47

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon finn » 22.09.2011, 06:32

*klick... patronen nachfüll... schrotflinte wieder zu klapp... klick*
finn
 

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon blueberlin » 25.09.2011, 16:27

Hallo Freunde, danke für die vielen Antworten....


um mal aufzuklären wofür ich es benutzen möchte.


Ich habe ein RC Auto mit Verbrennungsmotor.

Servo I ist für die Lenkung zuständig
Servo II ist für Gas bzw. Bremse zuständig.

Wenn der Servo II ein Vollausschlag nach Links habe wird der Vergaser geöffnet und der Motor gibt Vollgas
Wenn der Servo II in der MIttelstellung steht, dann läuft der Motor in leerlauf und das Fahrzeug rollt aus.
Wenn der Servo II ein Vollausschlag nach Rechts hat, dann drückt er auf die Bremsscheiben und Bremst.

Mein Ziel ist es zu Messen Wann der Servo nach Rechts ausschlägt um dann Bremslichter ( LEDS ) Einzuschalten.


Meine erste Idee war es einfach ein Taster so zu Montieren dass er gedrückt wird sobald ich bremse, da das Auto aber sich regelmässig überschlägt und gerne mal was abbricht und wegfliegt, möchte ich keine Extra Bauteile Montieren. Wenn ich das ganze mit ein Atmega Auslesen kann dann kann die komplette Schaltung sicher mit in der Box eingebaut werden in der sich der Empfänger und Akku befindet.
blueberlin
 
Beiträge: 236
Registriert: 23.09.2009, 19:23
Wohnort: Berlin

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Anse » 25.09.2011, 17:36

Für die Aufgabe brauchst du keinen Atmega8. Das wäre Verschwendung. Da tuts auch einer mit weniger Rechenpower. Vieleicht Attiny26 oder noch kleiner.
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon topas » 26.09.2011, 15:46

@Anse: Die Verschwendung wäre etwa 25 Cent. Aber man hat die Gewissheit, dass das Programm garantiert rein passt. Und Platz zum experimentieren bleibt auch noch. Und man darf auch - ich will es mal diplomatisch sagen, und das ist jetzt allgemein gesagt und keinesfalls auf den Threadersteller gemünzt, mal umständlich programmieren. Für alle die das Programmieren üben, darf der Flashspeicher ruhig etwas grösser sein. Wenn man das Programmieren beherrscht und auch optimieren kann- so wie Anse - dann nimmt man sich den kleinsten möglichen Chip - insbesondere wenn man auf den Cent schauen muss. :D
topas
 
Beiträge: 3796
Registriert: 16.08.2010, 12:47

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Anse » 26.09.2011, 16:33

darf der Flashspeicher ruhig etwas grösser sein

Wenn du auf den Flashspeicher schauen würdest, wäre der Atmega mit 8 kbyte für die Bascom Demoversion immenoch zu groß.
Zum Experimentieren auf dem Steckboard ist der Attmega8 gut geeignet. Wenn das Programm optimiert ist kann man ja auch auf einenen kleineren umsteigen.
Wenn man das Programmieren beherrscht und auch optimieren kann- so wie Anse...

Danke, aber ich lerne noch. Es gibt noch ein paar Fragen, die auch nicht durch das tolle Buch von topas beantwortet werden. z.B. der Befehl Data
Anse
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon topas » 26.09.2011, 16:45

Data dient zum Abspeichern von Konstanten. Die "Anweisung" data kündigt an, dass konstante Daten folgen (Tabellen, Zahlenwerte, Texte) mit read fragst Du sie ab. Mit restore setzt Du die Leseposition neu. Wenn ich mich nicht irre, ist die data-Anweisung von Chefs Beetle-Basic weitgehend konform mit der Bascom-Geschichte. Schau dort mal nach (auf Chefs Projektseite) - zumindest der Sinn dieser "Anweisung" wird Dir dann vielleicht klarer.
Die Vollversion von Bascom ist nicht soooo teuer. Und aus meiner Erfahrung: 2KB sind schnell voll.
topas
 
Beiträge: 3796
Registriert: 16.08.2010, 12:47

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon blueberlin » 27.09.2011, 13:48

Soweit ich weiss, die aktuelle bascom demo kann man bis 4kb schreiben, mir persönilch hat das für die ersten projekte gereicht, jetzt sind die projekte oft größer deswegen habe ich mir die vollversion gekauft. Um auch mal programme zu schreiben die grafiken auf ein display darstellt, da sind ganz schnell mal 30kb weg nur für die grafiken :(
blueberlin
 
Beiträge: 236
Registriert: 23.09.2009, 19:23
Wohnort: Berlin

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Chef » 27.09.2011, 14:16

Tipp: Versuche Assembler zu lernen. Dies geht wunderbar in Verbindung mit Bascom. Man kann die Funktion der einzelnen Anweisungen wunderbar testen. Im Zuge dessen kannst du dann nach und nach einzelne Bascom-Sequenzen durch Assembler ersetzen. Du wirst sehen wie dein Objektcode implusionsartig zusammen schrumpft ;)

Beispiel:
Spoiler: show
Code: Alles auswählen
' #############################
' ## Sub Commandinput        ##
' ## Eingabe von Anweisungen ##
' #############################

Commandinput:
  'Var1 = 0 : Var2 = 0 : Zero = 0 : Carry = 0 : Hlpbyte = 0
  'Select Case Key
  '  Case 0                                                  ' LOAD
  '    Gosub Paramregnum : If Zero = 1 Then Return
  '    Hlpbyte = &H0C Or Carry
  '  Case 1                                                  ' MOVE
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H0E Or Carry
  '  Case 2                                                  ' INC
  '    Gosub Inputregister : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H0A
  '  Case 3                                                  ' DEC
  '    Gosub Inputregister : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H0B
  '  Case 4                                                  ' ADD
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H0F Or Carry
  '  Case 5                                                  ' SUB
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H10 Or Carry
  '  Case 6                                                  ' AND
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H11 Or Carry
  '  Case 7                                                  ' OR
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H12 Or Carry
  '  Case 8                                                  ' JUMP
  '    Gosub Inputflags : If Zero = 1 Then Return
  '    If Carry <> 0 Then
  '      Lcd "," : Gosub Inputadr : If Zero = 1 Then Return
  '    End If
  '    Var1 = Hlpwordl : Var2 = Hlpwordh : Hlpbyte = &H03 Or Carry
  '  Case 9                                                  ' CALL
  '    Gosub Inputflags : If Zero = 1 Then Return
  '    If Carry <> 0 Then
  '      Lcd "," : Gosub Inputadr : If Zero = 1 Then Return
  '    End If
  '    Var1 = Hlpwordl : Var2 = Hlpwordh : Hlpbyte = &H04 Or Carry
  '  Case 10                                                 ' RET
  '    Hlpbyte = &H02
  '  Case 11                                                 ' COMP
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H13 Or Carry
  '  Case 12                                                 ' ROTL
  '    Gosub Inputregister : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H08
  '  Case 13                                                 ' ROTR
  '    Gosub Inputregister : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H09
  '  Case 14                                                 ' SWAP
  '    Gosub Inputregister : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H07
  '  Case 15                                                 ' XOR
  '    Gosub Paramregreg : If Zero = 1 Then Return
  '    Hlpbyte = &H0D Or Carry
  '  Case 16                                                 ' CLR
  '    Gosub Inputregflags : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H05 Or Carry
  '  Case 17                                                 ' NEG
  '    Gosub Inputregflags : If Zero = 1 Then Return
  '    Var1 = Key + 1 : Hlpbyte = &H06 Or Carry
  '  Case 18                                                 ' HALT
  '    Hlpbyte = &H01
  '  Case 19                                                 ' NOP
  '    Hlpbyte = &H00
  'End Select
  'Key = 24 : While Key <> 22 : Gosub Inputkey : Wend
  'Prg(pgpos) = Hlpbyte : Parm1(pgpos) = Var1 : Parm2(pgpos) = Var2
  'Incr Pgpos : If Pgpos > Progsize Then Pgpos = Progsize
'Return
   $asm
    !ldi    r24,0
    !sts    {Var1},r24
    !sts    {Var2},r24
    !sts    {Zero},r24
    !sts    {Carry},r24
    !sts    {Hlpbyte},r24
    !lds    r24,{Key}
    !cpi    r24,0                                           'LOAD
    !brne   Commandinput_k01
    !call   Paramregnum
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k00_1
    !ret
  Commandinput_k00_1:
    !lds    r24,{Carry}
    !ori    r24,&h0C
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k01:
    !cpi    r24,1                                           ' MOVE
    !brne   Commandinput_k02
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k01_1
    !ret
  Commandinput_k01_1:
    !lds    r24,{Carry}
    !ori    r24,&h0e
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k02:
    !cpi    r24,2                                           ' INC
    !brne   Commandinput_k03
    !call   Inputregister
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k02_1
    !ret
  Commandinput_k02_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !ldi    r24,&h0a
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k03:
    !cpi    r24,3                                           ' DEC
    !brne   Commandinput_k04
    !call   Inputregister
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k03_1
    !ret
  Commandinput_k03_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !ldi    r24,&h0b
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k04:                                         ' ADD
    !cpi    r24,4
    !brne   Commandinput_k05
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k04_1
    !ret
  Commandinput_k04_1:
    !lds    r24,{Carry}
    !ori    r24,&h0f
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k05:                                         ' SUB
    !cpi    r24,5
    !brne   Commandinput_k06
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k05_1
    !ret
  Commandinput_k05_1:
    !lds    r24,{Carry}
    !ori    r24,&h10
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k06:                                         ' AND
    !cpi    r24,6
    !brne   Commandinput_k07
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k06_1
    !ret
  Commandinput_k06_1:
    !lds    r24,{Carry}
    !ori    r24,&h11
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k07:                                         ' OR
    !cpi    r24,7
    !brne   Commandinput_k08
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k07_1
    !ret
  Commandinput_k07_1:
    !lds    r24,{Carry}
    !ori    r24,&h12
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k08:                                         ' JUMP
    !cpi    r24,8
    !brne   Commandinput_k09
    !call   Inputflags
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k08_1
    !ret
  Commandinput_k08_1:
    !lds    r24,{Carry}
    !cpi    r24,0
    !breq   Commandinput_k08_2
  $end Asm
  Lcd ","
  $asm
    !call   Inputadr
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k08_2
    !ret
  Commandinput_k08_2:
    !lds    r24,{Hlpwordl}
    !sts    {Var1},r24
    !lds    r24,{Hlpwordh}
    !sts    {Var2},r24
    !lds    r24,{Carry}
    !ori    r24,&h03
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k09:                                         ' CALL
    !cpi    r24,9
    !brne   Commandinput_k10
    !call   Inputflags
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k09_1
    !ret
  Commandinput_k09_1:
    !lds    r24,{Carry}
    !cpi    r24,0
    !breq   Commandinput_k09_2
  $end Asm
  Lcd ","
  $asm
    !call   Inputadr
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k09_2
    !ret
  Commandinput_k09_2:
    !lds    r24,{Hlpwordl}
    !sts    {Var1},r24
    !lds    r24,{Hlpwordh}
    !sts    {Var2},r24
    !lds    r24,{Carry}
    !ori    r24,&h04
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k10:                                         ' RET
    !cpi    r24,10
    !brne   Commandinput_k11
    !ldi    r24,&h02
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k11:                                         ' COMP
    !cpi    r24,11
    !brne   Commandinput_k12
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k11_1
    !ret
  Commandinput_k11_1:
    !lds    r24,{Carry}
    !ori    r24,&h13
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k12:                                         ' ROTL
    !cpi    r24,12
    !brne   Commandinput_k13
    !call   Inputregister
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k12_1
    !ret
  Commandinput_k12_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !ori    r24,&h08
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k13:                                         ' ROTR
    !cpi    r24,13
    !brne   Commandinput_k14
    !call   Inputregister
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k13_1
    !ret
  Commandinput_k13_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !ori    r24,&h09
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k14:                                         ' SWAP
    !cpi    r24,14
    !brne   Commandinput_k15
    !call   Inputregister
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k14_1
    !ret
  Commandinput_k14_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !ori    r24,&h07
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k15:                                         ' XOR
    !cpi    r24,15
    !brne   Commandinput_k16
    !call   Paramregreg
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k15_1
    !ret
  Commandinput_k15_1:
    !lds    r24,{Carry}
    !ori    r24,&h0d
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k16:                                         ' CLR
    !cpi    r24,16
    !brne   Commandinput_k17
    !call   Inputregflags
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k16_1
    !ret
  Commandinput_k16_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !lds    r24,{Carry}
    !ori    r24,&h05
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k17:                                         ' NEG
    !cpi    r24,17
    !brne   Commandinput_k18
    !call   Inputregflags
    !lds    r24,{Zero}
    !cpi    r24,1
    !brne   Commandinput_k17_1
    !ret
  Commandinput_k17_1:
    !lds    r24,{Key}
    !inc    r24
    !sts    {Var1},r24
    !lds    r24,{Carry}
    !ori    r24,&h06
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k18:                                         ' HALT
    !cpi    r24,18
    !brne   Commandinput_k19
    !ldi    r24,&h01
    !sts    {Hlpbyte},r24
    !jmp    Commandinput_end
  Commandinput_k19:                                         ' NOP
    !cpi    r24,19
    !brne   Commandinput_end
    !ldi    r24,&h00
    !sts    {Hlpbyte},r24
  Commandinput_end:
    !call   Inputkey
    !lds    r24,{Key}
    !cpi    r24,22
    !brne   Commandinput_end
    Loadadr Prg(pgpos) , X
    !lds    r24,{Hlpbyte}
    !st     X,r24
    Loadadr Parm1(pgpos) , X
    !lds    r24,{Var1}
    !st     X,r24
    Loadadr Parm2(pgpos) , X
    !lds    r24,{Var2}
    !st     X,r24
    !lds    r24,{Pgpos+0}
    !lds    r25,{Pgpos+1}
    !adiw   r24:r25,1
    !cpi    r25,Progsize/256
    !brne   Commandinput_a01
    !ldi    r24,0
  Commandinput_a01:
    !sts    {Pgpos+0},r24
    !sts    {Pgpos+1},r25
    !ret
  $end Asm

Dies ist ein Ausschnitt aus dem Betriebssystem eines Lehrcomputers den ich mal in Planung hatte. Oben der auskommentierte Original-Quellcode und dann die 'neue' Assemblerroutine. Soweit ich es noch weiss, ist der Assemblercode fast 40% kleiner und zudem noch einiges schneller.

Zum DATA-READ-RESTORE: Die Version des BasicBeetle sind mit der Bascom-Version kompatibel. Es ist, für den BasicBeetle 2, auch eine erweiterte Version des Lookup-Befehls von Bascom in Arbeit.

Chef :D
Wenn es die Elektronik nicht gäbe, müsste man sie erfinden.
Benutzeravatar
Chef
Site Admin
 
Beiträge: 2941
Registriert: 04.11.2008, 17:56
Wohnort: Hamburg

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Anse » 27.09.2011, 17:10

Mir haben die 4Kb der Demoversion bisher immer gereicht. Wenn mal nicht wurde halt der Code etwas gekürzt.
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon topas » 28.09.2011, 12:28

Also für 40% "Platzersparnis" wär mir Assembler als alleiniges Programmiertool auch zu umständlich (bei den heutigen µC muss man ja nicht mehr so sparsam sein). Für kleine Routinen, die zeitkritisch sind, ist Assembler optimal. Wer natürlich das Letzte aus seinem Tiny rauskitzeln will....
topas
 
Beiträge: 3796
Registriert: 16.08.2010, 12:47

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Chef » 28.09.2011, 12:37

Kommt darauf an. Mein BB wäre nie so umfangreich, wenn ich das System z.B. in C geschrieben hätte. Aber für den Alltag spielt Assembler natürlich eine untergeordnete Rolle. Möchte man z.B. eine Wetterstation basteln, so würde ich auch Bascom empfehlen. Da sind schnell die kleinen Grafiken und Ausgaben erstellt.

Chef :D
Wenn es die Elektronik nicht gäbe, müsste man sie erfinden.
Benutzeravatar
Chef
Site Admin
 
Beiträge: 2941
Registriert: 04.11.2008, 17:56
Wohnort: Hamburg

Re: Abfragen in Welcher Position sich ein Servo befindet?

Beitragvon Anse » 28.09.2011, 18:21

Zum DATA-READ-RESTORE

Jetzt hab ichs auch verstanden. Die Stichworte sind Bascom und Tabelle gewesen. Da eröffne sich echt neue Möglichkeiten :)
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Vorherige

Zurück zu Elektronik-Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast