Hey, die gefunden Sachen im Forum haben mir leider nicht weitergeholfen, also probier ich es einmal direkt: Ich arbeite mit Keil und simuliere den SAB80C535. Über ein C-Programm lass ich nun an AIN1 ein Rechtecksignal erzeugen (ständiger Wechsel zwischen 0 und 1) Nun habe ich 2 unterschiedliche Fragen dazu und eine weitere Allgemeine: 1: Wie kann ich nun die Impulse, die an AIN1 erzeugt werden zählen? Hintergrund ist, dass dies die Drehscheibe eines Schrittmotors simulieren soll. Ich hab absolut keine Idee wie ich das verwirklichen soll. 2: Wie kann ich in dem besagten INI-File mit dem C-Programm eine Speicheradresse aus dem Mikroprozessor lesen? Denn die "schrittmotorgeschwindigkeit" soll einstellbar sein. 3:Ebenso simuliere ich eine E-Funktion über C-Code. Diese E-Funktion soll aber nicht sofort am Anfang sondern erst an einem bestimmten Punkt im Assembler-Programm gestartet werden. Wie realisiere ich das? Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt g Danke schon mal im Vorraus
Also das Zählen der Impulse an einem Pin des Controllers kannst du auf verschiedene Weise realisieren. Aber erst mal die Frage, ob du über die Drehscheibe die Drehgeschwindigkeit des Motors oder die relative Positionsänderung bestimmen willst? Zu 1: Denn je nach Anwendungsfall willst du ja "nur" einzelne Impulse oder Impulse innerhalb einer definierten Zeitspanne zählen. Um einzelne Impulse zu zählen könntest du es von Hand machen oder eleganter über den Zähleingang eines Timers. Wenn du die Frequenz bestimmen willst kannst du das durch Zählen der Impulse (von Hand oder mit Timer) innerhalb eines Zeitintervals (Timer) machen. Zu 2: Ich habe bisher selber nur C-Programme geschrieben, die unabhängig vom Controller gelaufen sind. Wie man auf Speicherbereiche des Controllers zugreift müsste ich erst mal nachlesen. ;) Zu 3: Ich erinnere mich dunkel dadran, daß man C-Funktionen die im INI File definiert sind durch Bedingungen starten kann. Müsste ich aber ebenfalls erst mal wieder nachlesen, da ich das bisher auch noch nicht benutzt habe. Ciao, Rainer
Rainer, du bist meine Rettung. Das hört sich alles schon mal ziemlich gut an. Das heißt, dass mein Projekt so zumindest mal theoretisch realisierbar ist :D zu 1: die Positionsänderung würde mir reichen. Ich muss nur wissen, wie weit mein Objekt schon "gefahren" ist. Dass ich die Impulse zählen muss ist mir ja klar...aber wie? Wie erkenne ich, dass mein AIN1 wechselt? Hast du da ein kleines Beispiel für mich? zu 2 und 3: Wenn du mir sagst, wo das steht, könnte ich es auch selbst nachlesen. Ansonsten wärs nett, wenn du da mal nachlesen könntest. THX A LOT!
Nur keine Hektik. :) Also ich habe mal in einem Buch nachgeschlagen was so zu Signalfunktionen drinsteht. Leider ist das weniger als ich gehofft hatte. Zu 1: Zum zählen der Impulse würde ich dir empfehlen das mit Hilfe eines Timers zu machen. Timer0 und Timer1 haben beide einen externen Zähleingang an den Pins T0 und T1. Beim Start setzt du den Timer auf 0 zurück und aktivierst dann den Zähleingang. Nun kannst du im Zählregister des Timers die Anzahl der Schritte direkt rauslesen. Dabei mußt du natürlich berücksichtigen, daß bei einem Überlauf der Timer wieder bei 0 anfängt. Oder du setzt den Zähler nach jedem Auslesen wieder auf 0 zurück. Das bleibt deiner Kreativität überlassen. ;) Zu 2: Grundsätzlich kann man in einer Signalfunktion beliebige Ports beschreiben und lesen. Da Ports aber nichts anderes als SFR sind müsste man theoretisch auch jedes andere SFR in einer Signalfunktion auslesen können. Hast du das einfach mal ausprobiert, ob das funktioniert? Zu 3: Zu einem bestimmten Punkt die Signalfunktion erst auszuführen kannst du entweder mit einer Zeitverzögerung (twatch/swatch) oder durch einen lesenden (rwatch) oder schreibenden (wwatch) Zugriff auf eine frei wählbare Speicherzelle starten lassen. Ciao, Rainer
Schau mal hier: http://www.keil.com/support/man/docs/uv3/uv3_df_diffbtwuv2a_ds.htm http://www.keil.com/support/man/docs/uv3/uv3_wwatch.htm http://www.keil.com/support/man/docs/uv3/uv3_rwatch.htm Dort wird von Funktionen (_RBYTE, _WBYTE, ...) geredet, mit welchen man den Speicherinhalt des Controllers auslesen oder verändern kann. :)
hey, vielen Dank für deine Tipps. Mit dem einlesen bzw schreiben habe ich es nur auf die Ports hinbekommen. Aber das tuts auch. Ich häng nun allerdings noch beim wwatch. Irgendwie will es noch nicht so ganz funktionieren. Entweder ich bekomm von der C-Datei her einen read/write permission-Fehler oder die Funktion wird gar nicht gestartet. Mit den Ports klappt es leider auch nicht. Angenommen ich möchte mit der Speicheradresse 9000h arbeiten. Dann schreib ich im Assembler doch zum Beispiel: mov 9000h, #01h Aber was gebe ich bei wwatch ein? wwatch(0x9000) funktioniert nicht. Kannst du mir vielleicht einfach mal die Assembler-Zeile schicken und die dazugehörige wwatch-Funktion? P.S.: Die Zählerei funktioniert auch soweit. DANKE
Also du kannst mit dem mov Befehl nur auf die internen Speicherbereiche bis 0x7F zugreifen. Zwischen 0x7F und 0xFF kannst du nur indirekt adressieren, da du ansonsten die SFR beschreiben würdest. Wenn du auf den xdata Bereich zugreifen willst geht das nur mit dem movx Befehl. Ich weiß auch nicht, ob die wwatch Funktion nur den internen Ram Bereich abdeckt oder auch den externen Bereich. Das müsste man erst mal testen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.