www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechtecksignal am AIN1 zählen bzw. verändern / C-Funktion im Keil


Autor: Sven Warnke (damn-86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: mischa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch nie gehört, sry

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sven Warnke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Sven Warnke (damn-86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer ?!?!?

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal hier:
http://www.keil.com/support/man/docs/uv3/uv3_df_di...
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. :)

Autor: Sven Warnke (damn-86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.