mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADW mit 80C537 (timer interrupt)


Autor: Christian M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich suche Hilfe bei einem Programm das ich für die Schule entwickeln 
muss.
Es soll mittels eines Timer-Interrupts die interrupt-service-routine 
alle 1µs aufrufen, und dann das Signal vom ADW einlesen.

Würde mich sehr über eure Hilfe und Ideen freuen, danke schonmal im 
Voraus!

mfg Chris

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>alle 1µs aufrufen, und dann das Signal vom ADW einlesen.
1µs ist aber sehr kurz, da der 80c537 ja maximal mit 16MHz arbeitet.

>Ich suche Hilfe bei einem Programm das ich für die Schule
>entwickeln muss.
Wobei brauchst du den Hilfe? Beim Timer oder beim AD-Wandler?

Autor: Christian M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was wäre dann die niedrigste Zeit die mit dem 80C537 möglich ist?

Hilfe bräuchte ich möglichst für beides, allerdings bin ich auch schon 
froh wenn mir jemand beim Timer helfen kann.

Beim AD-Wandler muss ich die Signale von 2 Sensoren einlesen, welche 
0-24V liefern. Laut Datenblatt ist aber nur 0-5V möglich, deshalb 
schalte ich noch einen Spannungsteiler vor die Ports.
Hier bitte ich auch um eure Hilfe, hab sowas noch nie gemacht, und weiß 
nicht wie ich die Ports des ADW's anspreche bzw. auslese.

Danke im Voraus, Chris

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gut kennst du dich denn mit den Timern aus?

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist die Frequenz deines quarzes?
Dann rechnest du aus, wie lange es dauert z.B. den 16bit timer 
überlaufen zu lassen.
Die Zahl multipliziert mit den überläufen, die du für 1us brauchst!

Dann schreibst du dir ne interrupt routine, die bei jedem überlauf eine 
variable erhöht. Wenn du z.b. 5 überläufe für 1us brauchst, schreibst du 
dann noch in die ISR:
if(ueberlauf==5)
{
AD Wandlung starten...
}

so könnte man das machen.
Gibt aber natürlich mehrere möglichkeiten.

gruß
oliver D.

Autor: Chris_R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

wieso soll der AD-Wandler per Timer-Interrupt abgefragt werden ? Er hat 
doch ein Busy-Flag, das anzeigt, wann er seine Wandlung abgeschlossen 
hat. Das Flag kann auch einen Interrupt auslösen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian M. wrote:
> Ich suche Hilfe bei einem Programm das ich für die Schule entwickeln
> muss.

Hilfe wird hier in der Regel so verstanden:
Du zeigst her, was Du bisher schon geschafft hast und fragst konkret, wo 
es jetzt bei Dir klemmt.

Dir jedoch das fertige Programm auf nem Silbertablett zu servieren, 
herrscht hier eine ziemliche Abneigung.

Wenn Du aber schon Probleme mit dem Urschleim der Programmierung hast, 
solltest Du Dir erstmal ein Lehrbuch (z.B. 8051 Cookbook) schnappen oder 
nach Tutorials googlen. Es wird aber gewiß keine Sache von nur 14 Tagen, 
die absoluten minimalen Grundlagen zu lernen.


> Es soll mittels eines Timer-Interrupts die interrupt-service-routine
> alle 1µs aufrufen, und dann das Signal vom ADW einlesen.

Kannste voll vergessen, die 1µs lasten selbst einen 100MIPS Silabs 8051 
gut aus.
Für nen Standard-8051 ist 1ms ne gute Zeit (100µs für nen erfahrenen 
Programmierer).


Peter

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaub, dass der interne AD-Wandler eine maximale Abtastfrequenz von 
ca. 40kHz hat. Außerdem ist 1µs wirklich sehr kurz. Waren dass 
vielleicht doch 1ms. Oder 1s? Ich kenne keine Größe, die 1Millionen mal 
pro Sekunde überprüft werden muss.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 80C537 benötigt für 1 Maschinenzyklus 12 Oszillatorperioden. Bei 
16MHz schafft der in 1µs noch nicht mal 2 Befehle.

Autor: Peter O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte auch eine Frage zu dem Thema, bezüglich der Berechnung der 
Tickrate des Timers.

Wenn mein Oszillator eine Frequenz von 12MHz hat, so beträgt die 
Zählrate laut Manual 1/12 der Oszillator Frequenz.

Und wie finde ich nun heraus, wieviele Überläufe ich brauche um alle 1ms 
einen Interrupt auszulösen?

Danke für eure Hilfe

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und wie finde ich nun heraus, wieviele Überläufe ich brauche um
> alle 1ms einen Interrupt auszulösen?

mit dem Taschenrechner :-)

Spass bei Seite bei 1ms und 12MHz gibt es gar keine Überläufe.
Einfach T2 im AutoReload Modus benutzen und T2 mit -1000
imitialiesiern, dann bekommst du einmal pro ms einen Interrupt.

Die Rechnung ist eigendlich ganz einfach:
12 MHz Takt ergibt einen timertick von 1µs. nach 1000 ticks ist
eine ms erreicht. Da die Timer 16 bit gross sind gäbe es erst nach
65 ms einen Überlauf.

Thomas

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.