Hallo, beschäftige mich seit kurzer Zeit mit allgemeiner Assambler Programmierung und bin im Moment auf ein Problem gestossen, dass ich nicht ganz alleine lösen kann. Deshalb wende ich mich an Euch. Und zwar möchte ich 3 verschiedene Sensoren, mit unterschiedlichen Abtastfrequenzen mit einem internen A/D Wandler eines MC in digitale Werte wandeln. Habe schon gelesen wie das funktioniert und welche Ports und Register man dazu benutzen muss (bei nur einem analogen Eingang). Habe auch gelesen das man mit Hilfe eines Multiplexer zwischen den analogen Eingengen switchen kann. Mein Problem ist das ich nicht weiss wie ich das mit unterschiedlichen Abtastfrequenzen der Sensoren regeln soll. Einfach wäre es ja wenn alle Sensoren die selbe Abtastfrequenzen hätten dann würde man immer nacheinander die input Ports abrufen aber wie macht man das mit untersciedlichen Abtastfrequenzen? hatte schon jemand das Problem und kann mir paar Tips geben, denke das es irgendwie mit Timern geregelt werden muss aber habe keine Erfahrung wie man das am besten anstellen soll. Frank
Hallo Frank, wenn dein AVR genug Time besitzt, kannst du jeden Timer anders einstellen, und somit in jeder Overflowroutine eine andere Frequenz erhalten. Du kannst - für "krumme" Frequenzen - das Timer-Counter-Register auch direkt nach dem Aufruf der Overflowroutine mit einem negativen Wert initialisieren. Dann Zählt der Timer nur bis null und nicht bis 256! Dadurch lässt sich z.B. aus einem 4Mhz-Quarz eine 125-Hz-Frequenz erzeugen: 4000000 / 256 (prescaler) / 125 = 125 Der Code müsste etwa wie folgt aussehen: Ovfx: in r0, SREG ldi r16, -125 out TCNTx, r16 ;behandlung ... out SREG, r0 reti Natürlich musst du entsprechend die Register sichern! Schöne Grüße, Clemens
Nabend. Ich habe jetzt noch nicht praktisch mit dem Problem auseinandergesetzt. Ich würde eine Zeitsteuerung mit einem Timer realisieren. Dazu würde ich einen Timer reglemässig überlaufen lassen. In der ISR würde ich dann für jeden Sensor eine Variable herunterzählen lassen.Im Hauptprogramm wird dann überprüft, ob eine Variable = 0 ist und dann entsprechend den AD-Wandler anschmeissen. Natürlich muß auch die Variable auf den Anfangswert gesetzt werden. Halt so als Idee... Gruß Rahul
Hallo, also mit den Timern realisieren. Leider verstehe ich den Code von Clemens nicht, vielleicht paar kommentare was da wirklich passiert, wie gesagt habe bis jetzt nicht mit Assambler programmiert und habe mir die standart Befehle angeschaut wie movlw,..............usw. Das mit den Variablen ist eine gute Idee, was mache ich den wenn ich 2 gleiche Abtastfrequenzen habe und noch 2 unterschiedliche, z.B.: Sensor 1: f=8 kHz Sensor 2: f=8 kHz Sensor 3: f=1 kHz Sensor 4: f=60 Hz Dann würde sich doch der timer für Sensor 1 und 2 gleichzeitig melden und was macht man dann? ruft den einen ab und die anderen Daten gehen verloren? Kann ja auch gut sein das die anderen Sensoren sich auch noch irgendwann genau bei der selben Zeit melden wie die anderen und dann?????? HILFEEEEEEEEEEE
Setz den Interrupt für Sensor 1 und Sensor 2 auf 4 KHz und toggel ein Bit. Wenn das Bit 0 ist aktiviere Sensor 1 auslesen und setzte es dann auf 1. Nach dem nächsten 4KHz Interrupt wird Sensor 2 ausgelesen, setze das Bit auf 0 ... MW
OK, das ist eine gute Idee, aber komme ich dann nicht irgendwann mit den den anderen Sensoren in die quere? Möchte ein System das ich vorher Konfigurieren kann, d.h. die Sensoren werden von Fall zu Fall anders gewählt je nach Applikation. Bei 2 gleichen Abtastfrequenzen würde das so funktionieren wie der Michael Wilhelm sagte, aber wie wäre es jetzt mit 3 gleichen Sensoren und einem unterschiedlichen, da kann man ja nicht mehr die doppelte bzw. dreifache frequenz dann nehmen da ich nur 2 unterschiedliche Kontroll Bits (0 und 1) zur Unterscheidung zwischen Sensor 1 und 2 habe und so bleibt Sensor 3 auf der strecke. oder?
Wenn du einen Timer so konfigurierst, daß er 32000 mal in der Sekunde überläuft, kannst du verschiedene Vorteiler einsetzen, um die Aktion zu erzwingen, die du möchtest. Z.B. Vorteiler 2. um Sensor 1 und 2 zu bedienen, einen Vorteiler von 32 um sensor 3 zu bedienen,... Du mußt die Vorteiler nur so konfigurieren, daß pro Überlauf nur ein Sensor gemessen wird. Wobei, so ganz genau erschließt sich mir der Sinn nicht, daß, wenn ich die Rechenzeit habe, ich einen Sensor relativ selten abfrage. Ich würde es so machen: Timerüberlauf auf 32KHz, eine Laufvariable inkrementieren, wenn 1-Sensor 1, wenn 2-Sensor 2, wenn 3-Sensor 3, wenn 4-Sensor 4 und Variable auf 1. Was spricht dagegen? Die Analogspannungen liegen doch eh am Controller an. MW
Hallo, verstehe das nicht ganz. 1. >Wenn du einen Timer so konfigurierst, daß er 32000 mal in der Sekunde >überläuft, kannst du verschiedene Vorteiler einsetzen, um die Aktion >zu erzwingen, die du möchtest. Z.B. Vorteiler 2. um Sensor 1 und 2 zu >bedienen, einen Vorteiler von 32 um sensor 3 zu bedienen,... Du mußt >die Vorteiler nur so konfigurieren, daß pro Überlauf nur ein Sensor >gemessen wird. das mit den Vorteiler, der generiert mir doch nur ein anderen Takt und ich kann mir mit Hilfe dessen ein Timer bauen, richtig? 2. >Ich würde es so machen: Timerüberlauf auf 32KHz, eine >Laufvariable inkrementieren, wenn 1-Sensor 1, wenn 2-Sensor 2, wenn >3-Sensor 3, wenn 4-Sensor 4 und Variable auf 1. Was spricht dagegen? verstehe diesen Ansatz nicht. bitte um verständnis mfg Fraank
Hallo, wenn mehrere Sensoren die gleiche Abtastrate haben, lässt man alle AD-Wandlungen direkt hintereinander ablaufen. Ich verstehe diese Klimmzüge mit 16 und 32 kHz Timern nicht. Dann ist der Haupttakt hier 8kHz und beim ersten Aufruf werden alle Werte gewandelt. Somit habe ich eine Zeitreferenz und kann über Zähler/Timer die anderen Sensoren abfragen. Arno
Hallo, also habe nochmal die Postings von Michael gelesen und die Idee und ablaufweise habe ich jetzt auch verstanden also bei 3 gleichen Sensoren den timer quasi immer so stellen das er in einem Takt von 3* die Abtastfrequenz des Sensors ausgelöst wird. dann eine Variable (Sensor NR.) die immer inkrementiert wird und so die drei Eingänge immer abfragt.. wie ich es jetzt in assambler umsetze weiss ich noch nicht ganz genau aber denke das wird schon. Leider stört mich da noch was und zwar das mit den anderen kleineren Abtastfrequenzen. Habe keine Erfahrung mit MC deshalb denke ich das die möglichkeit doch irgendwann besteht, das die Timer für die schnellen Abtastraten und kleineren Abtastraten irgendwann zusammen ausgelöst werden, was passiert dann?? Störzt der MC ab oder macht ihm das nichts? was ist mit den Daten die von den anderen Eingängen gleichzeitig kommen müssten?? mfg Frank gehen diese verloren??
Das hängt alles davon ab wie gut (intelligent) Du das programmieren wirst. Man muß auch noch bedenken, das der ADC-Teil eine gewisse Zeit für ein ADC-Sample benötigt also muß quasi ein Status-Bit abgefragt werden. Bisher hast Du uns noch nicht verraten, mit welchem µC Du das ganze machen möchtest. movlw kenn ich nicht. Ist das PIC? MfG Andi
Möchte das so intelligent programmieren, dass keine Daten verloren gehen und das mit den wandeln alles hinhaut. Richtig erkannt, habe über PICs gelesen und diese erschienen mir für mein Vorhaben ideal. Weiss aber noch nicht welchen PIC genau ich benutzen soll, deshalb auch nur allgemeine Fragen. Das mit der Erholungszeit nach der Wandlund ist mir auch gewiss, deshalb die frage, was passiert wenn die Timer sich mal beide melden usw...........siehe oben. Frank
So wie ich das aus den bisherigen Vorschlägen sehe sind das nicht mehrere (Hardware-) Timer sondern nur einer. Das ganze mußt Du in dem einen Timer (16KHz?) dann alles mit Variablen (Werte in Speicherzellen) abhandeln wann auf welchen Sensor umgeschaltet wird und wohin ein ADC-Wert geschrieben wird. Allerdings wünsche ich Dir viiiiel Spaß mit den PIC´s. Die Dinger haben schon einen sehr eigenwilligen ASM-Diallekt mit dem ich selber nie was zu tun haben möchte. MfG Andi
Tip am Rande: Versuche auch, vorausschauend zu programmieren. Also die ADC-Quelle (Eingangsmultiplexer) nicht erst umschalten, wenn du das Ergebnis brauchst, sondern schon nach der vorhergehenden Messung. Das spart Zeit. ...
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.