PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerprogramm - Tipps für Programmierung



Hardy65
19.12.2005, 11:09
Hallo ihr

Habe mir jetzt Bascom-Demo runtergeladen, ISP-Adapter gebaut und am
Exp.-Board einen AT90S2313 aufgebaut.
Habe vorher noch nie mit uC-Programmierung und Basic zutun.
Nach ein paar tests mit Led an- aus bzw. Taster ein -aus ,usw,
habe ich folgendes programm geschrieben,
$regfile = "2313def.dat"
$crystal = 4000000


Config Portb.3 = Output
Enable Interrupts
Config Servos = 1 , Servo1 = Portb.3 , Reload = 10
Dim A As Byte
A = 75
Servo(1) = A

Plus Alias Pind.4
Leer Alias Pind.5
Minus Alias Pind.6

Do


If Plus = 0 Then
Waitms 25
Incr A
Servo(1) = A
If A = 110 Then
A = 109
End If
End If


If Leer = 0 Then
Waitms 25
A = 75
Servo(1) = A
End If


If Minus = 0 Then
Waitms 25
Decr A
Servo(1) = A
If A = 40 Then
A = 41
End If
End If

Loop
End
Es funktioniert soweit , aber gibt es eine andere möglichkeit den Endausschlag zu begrenzen als die ,die ich programmiert habe ?
Ich verwende eine If ..then schleife , für den max. und min. Wert.
Sprich- ich sage zb. max. Wert ist max. Wert - 1.
wenn ich auf der Taste bleibe zählte der uC sich zu tote 8-[ ,
kann man das anders lösen?

Komme ansonst mit Bascom gut zurecht, muss aber mein Englisch und Techn. Begriffe auffrischen.
Danke im vorraus Richard

Vitis
19.12.2005, 11:32
das a=109 kannste
durch

decr a

ersetzen

If A = 40 Then
A = 41
End If

durch

If A = 40 Then
incr a
End If

Torsten_G
19.12.2005, 11:33
Hallo Richard,

versuchs doch mal mit

If Plus=0 and A<110 then
Waitms 25
incr A
Servo(1) = A
end if

Und schau Dir doch mal den Case-Befehl an, damit kann man auch so manche IF-Then-Schleife umgehen...

Viele Grüße

Torsten

Vitis
19.12.2005, 11:36
stimmt, den case hab ich glatt übersehen,
der kann nochmal was bringen

der while ist auch ganz nett ... sauber .... besser so

Marco78
19.12.2005, 11:40
wenn ich auf der Taste bleibe zählte der uC sich zu tote ,
kann man das anders lösen?
Z.B. die Zeit erhöhen. Wie soll es denn am Ende aussehen?
Es gibt sicherlich noch eine andere Lösung, aber die sollte dir auch gefallen.


If A = 110 Then
A = 109
End If
Wenn du If A = 110 Then A = 109 schreibst, kannst du dir ein End If sparen. Somit wird es evtl übersichtlicher. Aber das ist auch immer Geschmackssache.


Servo(1) = A
Könnte auch vor dem Loop stehen. In der Schleife wird ja nicht weiter gemacht als zu prüfen, welcher Taster gedrückt wurde und den Servo zu stellen.
Wenn das stellen am Ende der Schleife steht, sparst du dir etwas Code.
Genau wie das Waitms. Pro Durchlauf kann ja nur ein Taster gedrückt werden.


Do

If Plus = 0 Then Incr A 'erst alle Möglichkeiten abfragen
If Leer = 0 Then A = 75
If Minus = 0 Then Decr A

If A = 110 Then A = 109 'dann Werte begrenzen
If A = 40 Then A = 41

Servo(1) = A 'am besten erst die Aktion und dann die Pause
Waitms 25 'sonst hat der Benutzer ggf das Gefühl es passiert ja garnichts

Loop

So könnte man es auch machen. Das spart noch mehr Code.

Marco78
19.12.2005, 11:43
Als ich angefangen habe zu schreiben, gab es noch keine Antworten. Und jetzt schon so viele.



das a=109 kannste
durch

decr a

ersetzen

Ist es nicht einfacher und vom Programmablauf schneller A einen Wert zu geben als eine Rechenoperation auszuführen?

Hardy65
19.12.2005, 12:52
@ all

Ja das mit den Befehlen , habe sie noch nicht durch gearbeitet.
Sinn des Programmes ist lernen, einfach mal probieren, für die Programmstrukturierung -dafür habe ich noch kein gefühl wann
bzw. wo ich es platziere. Aber es ist ja schon ermutigend gewesen
das es fast auf anhieb funkt. hat.
Den Case -Befehl werde ich mir jetzt vornehmen und ein kleines Versuchsprogramm schreiben.
Die nächste grössere Sache für mich ist die Ansteuerung eines Schrittmotors, auch wieder mit Taster (Plus, Leer , Minus).

@ Marco78

Wie meinst Du das mit A einen Wert geben, wollte mit den Tastern erreichen das das Servo bei einem Tastendruck um einen Schritt weiter-
dreht. Habe es auch erreicht aber das an der Endlage schien mir noch nicht so 100%. Hoffe ich habe deine Frage richtig verstanden?

Danke an alle für die Tipps und Vorschläge.
Richard

Marco78
19.12.2005, 14:11
Wie meinst Du das mit A einen Wert geben,
Damit meinte ich Vitis.

Wie sich ein Servo am µC verhält weiss ich nicht. Ich weiss auch nicht, ob es so günstig ist, den Wert jedesmal in der Schleife zu übergeben, auch wenn er sich nicht geändert hat.
Aber zumindest kann man das Prinzip wie ich es nochmal geschrieben habe auf andere Situationen anwenden.

Das mit der Endlage kann ich so nicht nachvollziehen. Aber hier gibt es bestimmt einige die sich mit Servos auskennen.