PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren ohne "Waitms"



Brantiko
09.02.2007, 22:21
Moin,
In Beispielprogrammen zu Lauflichtern, Schleifen etc. wird immer Waitms Verwendet.
Da ich nun ein Lauflicht als "Unterprogramm" schreibe möchte will ich waitms vermeiden da der uC in dieser Zeit ja nichts tut außer warten.

Hat jemand eine Ahnung unter diesen Bedieungen ein 4 Kanal Lauflicht programmieren kann?

Gruss

Alex

franzl
09.02.2007, 23:03
hallo alex,
nimm doch einen timer und zähle bei jedem überlauf eine variable um 1hoch bis sie einen bestimten wert erreicht hat. dann setzt du sie wieder auf 0. dann kannst du je nach lust und laune bei z.B 100 timerüberläufen einen ausgang schalten und wieder löschen. ich hoffe ich konnte es so halbwegs erklären.
mfg franz

Hanni
10.02.2007, 12:40
Ich falle fast vom Glauben ab ... ein Bascom Programmierer der es ohne waitms versuchen will :D

Um soetwas zu realisieren benötigt man: einen Timer
eine oder mehrere Zustandsvariablen
eine oder mehrere Zählvariablen

Mit dem Timer legt man das minimale Zeitfenster fest, welches zur Verfügung stehen soll.

Im Hauptprogramm werden nur die Zustandsvariablen abgefragt und gegebenfalls die passenden Aktionen gestartet.

In der Interupt Routine des Timers zählt man nun seine Zählvariablen runter. Ist eine auf 0 wird eine entsprechende Info in die Zustandsvariablen geschrieben, und die Zählvariable neu gesetzt.

Vom Prinzip her ist es recht einfacher Code ... zumindest in Assembler.

Grüße, Hanni

gpo
10.02.2007, 13:01
Hi,

einen WAIT-Befehl verwende ich höchstens zum initialisieren irgendwelcher Hardware, sonst wird alles über Timer-ISRs gelöst!

Gruß
Günter

1hdsquad
10.02.2007, 14:18
Ja, wait ist ***, weil es z.B. bei einem Interrupt weiter wartet, bis die Zeit um ist... :(
MFG

robby-fant
10.02.2007, 17:29
nimm winavr-c, dort gibt es genug beispiele, wunderbar.

mit bascom ...lol....

mfg

Hanni
10.02.2007, 18:25
nimm winavr-c

Hier gehts aber nicht um Bascom, Assembler oder C ....
Hier geht es darum, wie man es in Bascom realisieren könnte !!

Grüße,
Hanni

1hdsquad
10.02.2007, 18:51
Lol, der Sprachenkonflikt ;-)

izaseba
10.02.2007, 18:55
Ja, wait ist ***, weil es z.B. bei einem Interrupt weiter wartet, bis die Zeit um ist..

:shock: Wie das ? wird da vor wait... ein cli gemacht und die Interrupts auf Eis gelegt ?

1hdsquad
10.02.2007, 18:58
Ich habe das mal ausprobiert, vor dem Interrupt hat er zuende gewartet. Der Tastendruck war dann eine halbe Sekunde verzögert...

izaseba
10.02.2007, 19:10
Naja, wenn man näher darüber nachdenkt, wäre es auch irgendwie logisch, wenn er z.B. eine Sekunde warten soll, dann darf da auch kein Interrupt zwischenfunken, sonst könnte aus 1 Sekunde 1,0001 werden ...

Gruß Sebastian

1hdsquad
10.02.2007, 19:16
Tja, und dann wundert man sich wieder. Aber ist der Wait-Befehl nicht sowieso ungenau? Steht so in der Hilfe...

Brantiko
11.02.2007, 13:38
Ähm ja,
Danke schon mal.
Mit dem Timer habe ich auch so gemacht.
Ich lasse VAriablen bis zu nem gewissen Wert raufzählen.
Wenn er erreicht ist soll irgendetwas passieren.
Allerdings nimmt das viel Speicherplatz,oder?

gruss

Alex

Vitis
11.02.2007, 14:09
braucht ziemlich genau so viel Speicherplatz. Ob nun Schleifen zählen
oder Sprungvektor schenkt sich nix denk ich. und n paar Bytes hin oder
her sollten kaum ins Gewicht fallen.

Hanni
11.02.2007, 16:20
braucht ziemlich genau so viel Speicherplatz. Ob nun Schleifen zählen
oder Sprungvektor schenkt sich nix denk ich. und n paar Bytes hin oder
her sollten kaum ins Gewicht fallen.

Nur ist es die elegantere Lösung das ganze via Timer zu lösen.

dremler
11.02.2007, 17:05
ich würde auch ne schleife nehmen....allerdings isses da schwerer auf genau eine sekunde zu kommen...

Brantiko
11.02.2007, 17:14
Moin,
Es gibt ja diese bekannten For Schleifen mit nem Waitms 20 am ende.
Wie ersetze ich sowas mit nem Timer?

Gruss

Alex

Hanni
11.02.2007, 17:24
Wofür brauch in nach einer Schleife eine 20ms Warteschleife ?

*dummfrag*

1hdsquad
12.02.2007, 17:40
Wenn du z.BN. dem PC etwas senden willst, dann reicht es doch, dass alle paar ms bis Sekunden zu tun. Oder wenn man auf ein Bauteil etc. warten muß.
MFG