Ich habe folgendes Problem. Ich soll einen MC68HC11 mit Assembler programmieren. -Das Programm soll eine Temperatur zw 0° & 100°C im Abstand von 250ms einlesen -aus 4 Werten soll ein Mittelwert gebildet werden -diesen Wert soll ich nur irgendwo speichern Meine Idee wäre einen RTI mit einer Zeitbasis von 4,096ms einzustellen und den dann 61x mit einem Inkrementierungs Befehl durchlaufen lassen. Somit würde ich eine Zeit von 249,86ms erreichen. Diesen Wert würde ich im PACTL Register einstellen. Nach dieser Zeit würde ich versuchen ob eine Abfrage machen ob die zu messende Temperatur zw. 0°C & 100°C liegt. Je nach dem würde ich den Wert laden und speichern oder das Programm abbrechen. Danach würde ich eine Abfrage machen ob 4 Werte im Register gespeichert sind...vielleicht wieder mit eine Laufvariable die 4x inkrementiert wird??? Falls ja, würde ich den Mittelwert über 2 mal logisches rechts verschieben (= Division durch 2) errechnen. Und dann den Wert dann speichern. In der Anlage habe ich mit Powerpoint einen Programmablaufplan erstellt. Wäre meine Überlegung prinzipiell richtig? Desweiteren würde mich interessieren welche Register Flags ich noch einstellen müsste. Das ist für mich noch ziemliches Neuland. Mit freundlichen Grüßen Christian
:
Verschoben durch Admin
Mit ist bei deinem Flussdiagramm nicht klar, wie da jetzt die RTI ins Spiel kommt. Aber egal welche Variante ich jetzt annehme, immer ergeben sich Unlogikkeiten. (Und 'das Programm abbrechen': Ein µC bricht sein Programm niemals ab. Wohin soll er auch abbrechen? Er kann höchstens einen Messwert als ungültigen Messfehler deklarieren und den Wert nicht in die Verarbeitung gehen lassen, aber abgebrochen wird ein µC-Programm niemals)
Bei Controllern sollte man die Moeglichkeit das Programm abzubrechen vergessen. Soll er sich schlafen legen ? Fuer immer ?
Sollte 'RTI' für Real Time Interrupt stehen: In einem Interrupt wird nicht gewartet, auch nicht 61 mal oder auf 4 Messwerte. Einen Interrupt musst du dir eher so vrostellen: Du kommst in einen Rum hinein, siehst dich um was es zu tun gibt. Dann machst du das was es jetzt gerade im Moment zu tun gibt und verlässt den Raum wieder. Nach einiger Zeit (bei dir eben 4 Millisekunden) gehts wieder in den Raum hinein und auch dann wird wieder nur dann das getan was es zu tun gibt. In dem Moment, in dem du da in deinem Interrupt irgendwelche Warteschleifen hast, die auf Zählerwerte warten, hast du schon verloren und liegst falsch. Du kannst dir natürlich in diesem Raum auf ein Blatt Papier eine Zahl notieren, die du jedesmal beim Betreten des Raumes um 1 erhöhst. Und wenn sich dann nach dieser Erhöhung die Zahl 61 wiederfindet, dann machst du irgendetwas noch zusätzliches bei diesem einen Besuch im Raum.
Hallo, ersteinmal vielen Dank für die schnelle Antwort. Also muss ich einen Zähler bauen, der nach 250ms ein Interrupt auslöst. Bei dem Realtime Interrupt würde ich dann schauen ob ein Messwert vorhande ist, wenn nicht zurück ins Hauptprogramm.(Und nicht abbrechen wie ich vorher dachte). Dann schauen ob der Wert zw 0 & 100° (wenn ja speichern, wenn nicht zurück ins hauptprogramm und wieder zählen) aber wie stelle ich die 250 ms ein? ist mein denkansatz mit den 4,096ms überhaupt richtig? nach einer recherche habe ich erfahren das ein input capture funktion als ereigniszähler fungieren könnte. wäre es möglich mit dieser funktion zu zählen wie oft ein wert im register gespeichert wird? also ich muss ja aus 4 werten den mittelwert bilden. das ganze programm würde ich dann in einer endlosschleife programmieren. viele grüße Christian
Christan K. schrieb: > aber wie stelle ich die 250 ms ein? ist mein denkansatz mit den 4,096ms > überhaupt richtig? Ich kenne zwar den Prozessor nicht, aber prinzipiell: Ja, das ist schon grundsätzlich richtig. Nur in deinem Diagramm ist es falsch umgesetzt. Du willst dort eben nicht 'warten' bis du bei den 61 bist, sondern du zählst einfach die Aufrufe in einem Register/Speicherstelle mit. Beim 61. Aufruf kommt der Messvorgang bzw. die Auswertung der Messung in Gang. > Bei dem Realtime Interrupt würde ich dann schauen ob ein Messwert > vorhande ist, Du wirst immer einen Messwert haben. Selbst wenn er ungültig ist. Aber vorhanden wird der immer sein. > nach einer recherche habe ich erfahren das ein input capture funktion > als ereigniszähler fungieren könnte. wäre es möglich mit dieser funktion > zu zählen wie oft ein wert im register gespeichert wird? also ich muss > ja aus 4 werten den mittelwert bilden. Machs nicht so kompliziert. Reservier dir ein Register oder eine Speicherzelle in dem/der du mitzählst, der wievielte Messwert das ist. Und wenn es dann 4 sind, dann berechnest du den Mittelwert und stellst den Wert dem Hauptprogramm zur Verfügung. > das ganze programm würde ich dann in einer endlosschleife programmieren. Das Hauptprogramm. Ja das ist auch normal so. Aber hier geht es ja nicht um das Hauptprogramm, sondern darum, was in der Interrupt Routine passieren soll.
Hallo, lies Dir das mal durch. Das verschafft Dir erstmal einen Überblick und der Real Time Interrupt ist hier auch beschrieben. http://www.virtualuniversity.ch/elektronik/digital/mikrocomputer/25.html Bernd_Stein
Also das mit den 250ms is für mich echt ne harte Nuss. Ich hab einen neuen PAP im Anhang. Ich glaub so meintest du das oder? Mit freundlichen Grüßen
Schau dir doch mal den Link an, den Bernd erwähnt hat. Scheint mir, als wäre der Timer Overflow als Interrupt-Quelle prima geeignet, alle 250ms zu feuern. Wie misst du die Temperatur? (Ich kenne den 68er MCU nicht.) Wieviel Zeit benötigt er für eine Messung? Kann man einen Interrupt auslösen, wenn die Messung fertig ist? Hast du dir das Datenblatt zum 68HC11 mal durchgelesen oder aufmerksam durchgesehen?
Nein. Was ist da für dich eine harte Nuss. Wenn ich dir alle 4 Sekunden eine Tachtel gebe, wieviele Tachteln musst du für dich im Geheimen mitzählen, damit du nach 250 Sekunden 'AUA' schreist. Und genau das machst du hier auch
1 | Interrupt Start // wird alle 4 und ein paar Zerquetschte ms aufgerufen |
2 | | |
3 | | |
4 | v |
5 | Zähler = Zähler + 1 |
6 | | |
7 | | |
8 | v |
9 | wen zähler == 61 ja --------------------+ |
10 | | |
11 | Nein // 250 ms sind vergangen, seitdem |
12 | | // dieser Pfad das letzte mal |
13 | | // betreten wurde |
14 | | // |
15 | v // mach was immer es alle 250 ms |
16 | // zu tun gibt |
17 | // sind noch keine 250 ms |
18 | // raus aus der ISR | |
19 | | | |
20 | | v |
21 | | Zähler = 0 |
22 | | | |
23 | |<-------------------------------------+ |
24 | | |
25 | v |
26 | Ende der Interrupt Service Routine |
Du denkst bei der Interrupt Service Routine immer noch viel zu sehr in Schleifen. Du musst denken: Ooops, schon wieder 4ms vergangen. Was gibt es JETZT, nachdem schon wieder 4ms vergangen sind, alles zu tun. Nun, was es zu tun gibt: Mitzählen, der wievielte Aufruf das war und bei der enstprechenden Anzahl an Aufrufen eine weiterführende Aktion auslösen. Dein Hauptprogramm weiß von alle dem nichts! Das kriegt das gar nicht mit, dass da zwischendurch alle paar Millisekunden eine ISR aufgerufen wird. Nicht das Hauptprogramm ruft die Interrupt Service Routine auf, sondern die Hardware sorgt dafür. Daher kann es so gesehen auch nicht die von dir skizzierten Zusammenhänge geben.
Ok verstanden. in der Praxis würde das dann glaub ich so aussehen: ldaa Zähler ;lade Zähler in Akku A inca ;Zähler=Zähler+1 staa Zähler ;Zähler in Akku A speichern cmpa #61 ;Vergleich ob Zählerstand in Akku A 61 erreicht hat bne Ende ;Wenn nicht 61 springe zu Ende (rti) bsr Messung ;Aufruf Unterprogramm Messwert laden, speichern usw clr Zähler ;Zähler zurücksetzen Ende rti ;Rückkehr ins Hauptprogramm Messung ... usw Bei deiner Zeichnung fängt er am Ende der ISR wieder an zu inkrementieren um die 250ms zu erreichen oder? Befehle MC68HC11: LDAA = laden in Akku A STAA = speichern in Akku A INCA = Erhöht Inhalt Akku A um 1 BNE = Verzweige bei gelöschtem Z Bit BSR = Verzweige in Unterprogramm CMPA = Vergleicht Inhalt von Akku A mit Inhalt einer Speicherstelle CLR = Lösche Akku @Tom, mir wurde eine theoretische Aufgabe gestellt, das heißt ich muss nur wissen von wo ich meine Messwerte bekommen würde. Also von welcher Schnittstelle.
Christan K. schrieb: > Ok verstanden. > > in der Praxis würde das dann glaub ich so aussehen: > > ldaa Zähler ;lade Zähler in Akku A > inca ;Zähler=Zähler+1 > staa Zähler ;Zähler in Akku A speichern > cmpa #61 ;Vergleich ob Zählerstand in Akku A 61 erreicht hat > bne Ende ;Wenn nicht 61 springe zu Ende (rti) > bsr Messung ;Aufruf Unterprogramm Messwert laden, speichern usw > clr Zähler ;Zähler zurücksetzen > Ende rti ;Rückkehr ins Hauptprogramm > > Messung ... usw du musst den 0-gesetzten Zähler aber auch wieder zurückschreiben nach 'Zähler'. Denn beim nächsten Interrupt Aufruf willst du dann ja da wieder 1 dazuzählen. > Bei deiner Zeichnung fängt er am Ende der ISR wieder an zu > inkrementieren um die 250ms zu erreichen oder? Nein. Im rechten Zweig, in dem der 250ms Fall behandelt wird, da wird der Zähler wieder auf 0 gesetzt. Beim nächsten ISR AUfruf (4ms später) wird der Zähler dann zu 1, nichts passiert weiter. Im darauffolgenden ISR-Aufruf dann zu 2, wieder passiert nichts weiter. Dann 3, dann 4, dann .... 59, nichts passiert weiter, 60, immer noch nicht, 61. Bing0. Beim 61 Aufruf der ISR schlägt der Vergleich zu und die Behandlung des rechten Teils im Diagramm beginnt. Es sind also 60 Aufrufe vergangen, in denen nichts passiert ist und jetzt im 61 gehts los. Und wie es der "Zufall" so habe will, bedeutet dass, dass 60 mal 4.irgendwas Millisekunde (in Summe also 250 Millisekunden) nichts weiter in der ISR gemacht wurde, und dieses eine mal schon. Und dann gehts mit dem Zähler wieder von vorne los. 0, 1, 2, 3 .... Wie bei einer Uhr ohne Zeiger von der du nur das Ticken hörst. Bei jedem Tick streckst du einen Finger mehr aus (um zu zählen) und wenn dir deine Finger sagen, dass du 60 Ticks abgezählt hast, dann weißt du, dass 1 Minute vergangen ist, seit du zu zählen angefangen hast. Und weil das 'automatisiert' passiert, kannst du in deiner Hauptbeschäftigung ein Buch lesen, bei jedem Tick streckst du automatisch einen Finger mehr aus und siehst kurz nach, ob du schon bei 60 angelangt bist. Wenn ja, hat der Tee genau 1 Minute gezogen und du hast in der Hauptbeschäftigung trotzdem ein Buch gelesen und bist nicht ständig an der Uhr gehangen um nur ja nicht die 1 Minute zu übersehen. PS: Und mit deinen 4 Messwerten aus denen sich der Mittelwert zusammensetzen soll, machst du es genau gleich. Nur halt mit einem anderen Zähler. Daher ist vielleicht der Name 'Zähler' kein so glücklicher Name dafür, weil du ja 2 verschiedene Zähler hast. Der eine zählt die 4.ms Aufrufe, der andere die Anzahl der bisher gemachten Messungen.
Hallo Karl, aber wie würde denn mein Hauptprogramm aussehen? also das zählen beginnt ja schon im interrupt laut deiner skizze. Interrupt Start // wird alle 4 und ein paar Zerquetschte ms aufgerufen | | v Zähler = Zähler + 1 | | v wen zähler == 61 ja --------------------+ Viele Grüße p.s. also im Hauptprogramm könnte man ja ein "Taster in einer Endlosschleife befragen" ob der Interrupt auslöst. Das würde ich jetzt denken.
Christan K. schrieb: > Ich habe folgendes Problem. Ich soll einen MC68HC11 mit Assembler > programmieren. Warum eigentlich? Im Moment hab ich nicht mehr das Gefühl, die Aufgabe ist deinen Kentnissen angemessen. Hast du eigentlich schon füher irgendwas anderes mit Interrupts gemacht oder wie ist dir die Idee gekommen, das mit Interrupts zu lösen? Ich habe eher das Gefühl du bist heillos überfordert und die bessere Antwort wäre ganz am Anfang schon gewesen "machs ohne RTI wenn du Interrups noch nicht im Griff hast" und es tut mir jetzt eigentlich schon leid, dass ich diese Idee aufgegriffen und weiterverfolgt habe. > aber wie würde denn mein Hauptprogramm aussehen? Alles initialisieren, die Real Time Clock einschalten, den RTI konfigurieren, alle Zähler auf 0 setzen etc. Ist alles fertig eingestellt, dann ab in die Hauptschleife in der: der Mittelwert abgeholt wird und zb ausgegeben wird. Ich sagte doch schon: Die Hauptschleife hat mit der Messung nichts mehr zu tun. Die passiert im Hintergrund. Das ist nichts, worum sich die Hauptschleife noch kümmern müsste. Die holt sich einfach nur den Mittelwert ab.
hallo karl, ich muss diese Aufgabe lösen weil sie entscheidet ob ich mein Studium abschließen kann oder exmatrikuliert werde. Daher ist der Schwierigkeitsgrad dementsprechend. ja für mich ist programmierung ein schwieriges thema jedoch denke ich das ich der aufgabe gewachsen bin obwohl ich nich grad die besten voraussetzungen habe. ich muss das also irgendwie hinbekommen, sitze am tag ungefähr 10 stunden dran, hab mir bücher von michael rose und ludwig orgler ausgeborgt usw. und nutze das board. deswegen ist für mich jeder noch so kleine hinweis absolut wichtig, auch wenn jetzt erfahrene denken würden...mensch der hat ja garkeine ahnung. Viele Grüße
Hallo, ich hab einen ersten groben Programmentwurf erstellt. Mein Problem ist jetzt die Messwerterfassung und die Mittelwertbildung. Könnte mir da jemand helfen? Also hab de Befehle so verwendet um das Prinzip zu schildern. Desweiteren wüsste ich jetzt nich wie ich die Vorgabe zw 0° und 100° unterbringe. Viele Grüße
> Wäre meine Überlegung prinzipiell richtig?
Keine Ahnung, denn du hast an keiner Stelle erwähnt, mit welcher
Taktfrequenz der 68HC11 läuft.
Wenn das Programm nichts anderes zu tun hat,
braucht man keinen Interrupt, man kann auch einfach so viele
)NOP-) Befehle in einer Schleife durchlaufen, bis 250ms rum
sind.
Ist man sich nicht sicher wie lange der Code braucht, kann man
auch alle Nase lang den Zeitgebe(TIMER) abfrage der mit einem
bekannten Takt läuft, bei Überlauf einen zusätzlichen Zähler
inkrementieren, und wenn man erkennt, daß der aktuelle Timerwert
250ms jünger ist als der bei dem man zuletzt die Aktion ausgelöst
hat, nun diesemal die Aktion (A/D-Wert einlesen) vornehmen.
Es gibt immer mehrere Möglichkeiten.
Letztlich ist diejenige die beste, die zum Schluss den
kürzesten Code ergibt (Geschwindigkeit spielt in diesem Fall
ja keine Rolle).
Und letztlich spielt die Codelänge auch keine Rolle, wenn
die 512 Bytes des 68HC11A1 EEPROM-Programmspeicher ausreichen,
also ob 100 oder 120 Bytes ist auch egal.
MaWin schrieb: > Keine Ahnung, denn du hast an keiner Stelle erwähnt, mit welcher > Taktfrequenz der 68HC11 läuft. Der Prozessor hat ein Takt von 2MHz > Wenn das Programm nichts anderes zu tun hat, > braucht man keinen Interrupt, man kann auch einfach so viele > )NOP-) Befehle in einer Schleife durchlaufen, bis 250ms rum > sind. Also ich hab mein Prüfer gefragt, er meinte der Weg über den Interrupt is der richtige Viele Grüße
Christan K. schrieb: > Also ich hab mein Prüfer gefragt, er meinte der Weg über den Interrupt > is der richtige Grundsätzlich ja. ALlerdings ist das die falsche Frage. Die richtige Frage lautet nämlich: Welcher Weg ist für DEINE Fähigkeiten der Richtige. Und da kann es dann plötzlich sein, dass ein theoretisch suboptimaler Weg einfach deswegen der richige sein kann, weil du ihn implementieren kannst und ihn beherrscht. Im Zweifelsfall ist immer dasjenige 'optimal' und 'richtig', was man realisieren kann.
Christan K. schrieb: > hallo karl, > > ich muss diese Aufgabe lösen weil sie entscheidet ob ich mein Studium > abschließen kann oder exmatrikuliert werde. Daher ist der > Schwierigkeitsgrad dementsprechend. Was studierst du eigentlich? (Wenn du Informatik studieren würdest, muss ich dich enttäuschen. Das ist Schwierigkeitsgrad Einsteigerlevel. Von einem 'dementsprechend' mit bedeutsamen Augenrollen sind wir weit entfernt. Inwieweit das jetzt bei dir auch so ist, hängt natürlich von deiner Studienrichtung ab. Für einen Theologen ist das zugegebenermassen schon ganz schön schwer.)
> Was studierst du eigentlich?
ich studiere Medientechnik. Also habe ehr was mit A/V Technik und
Medienproduktionstechniken und IT/KT Infrastrukturen zu tun.
Viele Grüße
@ Karl, was hälst du von meinem Programm Code?
> Also ich hab mein Prüfer gefragt, > er meinte der Weg über den Interrupt is der richtige Tja, das ist dann Gottes Wille (war aber die falsche Antwort). Es gibt halt viele Lösungen, richtig sind wohl alle die ein richtiges Ergebnis ergeben, die beste ist die, die letztendlich das kürzeste Programm ergibt. Aber das übersteigt den Level in Mädchentechnologie.
> Aber das übersteigt den Level in Mädchentechnologie.
Glaub dein Level übersteigt es eine kompetente Antwort zu geben.
Christan K. schrieb: > hallo..., > > ich muss diese Aufgabe lösen weil sie entscheidet ob ich mein Studium > abschließen kann oder exmatrikuliert werde. Daher ist der > Schwierigkeitsgrad dementsprechend. > > ja für mich ist programmierung ein schwieriges thema jedoch denke ich > das ich der aufgabe gewachsen bin obwohl ich nich grad die besten > voraussetzungen habe. > > ich muss das also irgendwie hinbekommen, sitze am tag ungefähr 10 > stunden dran, hab mir bücher von michael rose und ludwig orgler > ausgeborgt usw. und nutze das board. > > Michael Rose Mikroprozessor 68HC11 ? Ich hatte es mal überflogen, irgenwie nichts für Anfänger, dafür sind mir die Erklärungen nicht ausführlich genung z.B. der Analog/Digital-Wandler, der für Dich ja wichtig ist. Oder Interrupts. Dort steht z.B. nichts davon das es zwei unterschiedliche arten gibt, nämlich die maskierbaren wie z.B. den RTI und die nicht maskierbaren wie z.B. den Reset und die im Buch erwähnten IRQ und XIRQ. Sofwarebeispiele befinden sich wahrscheinlich auf der Diskette und da vermute ich wird man sofort mit den Beispielapplikationen erschlagen. Ludwig Orgler MC68HC11 Mikrocontroller Hat da schon ein besseres Konzept. Leider war es für mich auch immer etwas zu Hoch, also schwierig zu vestehen. Ganz gut kam ich mit Arnulf Wallrabes Buch Mikrocontroller-Praxis Einstieg mit dem MC68HC11 zurecht. Nur leider ist es meistens so, das in jedem Buch etwas anderes verständlicher oder ausführlicher beschrieben ist. Meistens kommt man also nicht mit einem Buch aus. Noch erwähnen möchte ich folgendes Buch das ich mal als Standardwerk für Mikrocontroller bezeichnen möchte, da es allgemein Mikrocontroller ausführlich beschreibt und sogar den HC11 im speziellen. Für mich die beste Empfehlung für alle die sich mit Mikorcontrollern auseinander setzen müssen oder wollen. Mikrocontroller Aufbau, Anwendung und Programmierung von Dieter Schossig aus dem te-wi Verlag ISBN 3-89362-258-6. Für dein Projekt müsstest Du dich mit Interrupts bzw. der Interruptprogrammierung und dem AD-Wandler und dessen Programmierung intensiv beschäftigen. Das heißt sämtliche Quellen die Dir zur Verfügung stehen in Bezug auf die beiden erwähnten Sachen studieren. > > > deswegen ist für mich jeder noch so kleine hinweis absolut wichtig, auch > wenn jetzt erfahrene denken würden...mensch der hat ja garkeine ahnung. > > Viele Grüße Bernd_Stein
Christan K. schrieb: >> Was studierst du eigentlich? > > ich studiere Medientechnik. Also habe ehr was mit A/V Technik und > Medienproduktionstechniken und IT/KT Infrastrukturen zu tun. > > Viele Grüße > > @ Karl, was hälst du von meinem Programm Code? Hallo, immer diese Abkürzungen A/V Technik... IT/KT Infrastrukturen... Egal, selbst mit Medientechnik kann ich wenig anfangen, weil ich einfach nicht weiß was da im Detail gefordert wird. Eigentlich für mich alles Informations Technologie ( IT ), eben das Internet, Fernsehen und Radio. Zielt dies nun wie führer der Radio und Fernsehtechniker rein auf die Hardware ab oder wie hab ich den studienzweig Medientechnik zu vestehen ? > > > @ Karl, was hälst du von meinem Programm Code? > > Entschuldige das ich mich ungefragt da einmische, aber für einen Anfänger finde ich schreibst Du schon sehr übersichtlich und ausführlich Komentiert deine Programme, also schon mal ein guter Programmierstil. Ich selbst habe den MC68HC11 Mikrocontroller in einem Lehrgang an der Volkshochschule VHS kennengelernt. Der war gar nicht teuer, unter 50 D-Mark bestimmt. Da war ich zu Anfang komplett bzw. Hoffungslos überfordert, verstand nur Bahnhof und dann mußte man auch noch einen PC bedienen, wo von ich auch keine Ahnung hatte. Aber immerhin hatte ich danach eine Grundlage auf die ich Aufbauen konnte. Aber viel erreicht habe ich bisher nicht. Eigentlich wollte ich hier mal für dich das Programm schreiben, aber da merkte ich das ich genau wie Du - mich erstmal speziell auf den HC11 einschiessen muß. Seine Register, seine Syntax, die Interruptprogrammierung, die internen komponenten wie den AD-Wandler und vieles mehr. Sorry, das wurde mir zu Zeitintensiv, so das ich davon ab bin. Außerdem, tu ich mich mit der µC-Programmierung immer noch sehr schwer, so das ich Dir gegenüber nicht als Lehrmeister auftreten kann. Aber es freut mich vom guten alten HC11 zu lesen, da er für mich wirklich schön zu programmieren ist. Da kommt das EVA-Prinzip ( einlesen, verarbeiten, ausgeben ) schön heraus, also die Grundlage der EDV ( Elektronische Datenverarbeitung ). ldaa ;Lade AkkumulatorA => einlesen oraa ;Oder Verknüpfen => verarbeiten staa ;Schreibe AkkumulatorA => ausgeben Bis dann Bernd_Stein
Christan K. schrieb: > Hallo, > > ich hab einen ersten groben Programmentwurf erstellt. Mein Problem ist > jetzt die Messwerterfassung und die Mittelwertbildung. Könnte mir da > jemand helfen?... > > Desweiteren wüsste ich jetzt nich wie ich die Vorgabe zw 0° und 100° > unterbringe. > > Viele Grüße > > Nun zu deinem Problem. Schwerpunkt ist der AD-Wandler. Also in deinen Dir zur Verfügung stehenden Quellen alles über den AD-Wandler nachlesen und gucken wie z.B. Ludwig Orgler auf den Seiten 35 ff dies Softwaremäßig umsetzt. Oder halt Arnulf Wallrabe. Danach hier nochmal posten, wo im Detail dein Problem liegt - falls Du es dann nicht schon selbst gelöst hast. Bis dann Bernd_Stein
Hallo, also bin grad dabei das Programm zu überarbeiten, da sind hier und da einige Fehler drin, dich ich beheben muss. Konzentriere mich auch grad auf die interruptverarbeitung und den wandler. Zwei Dinge bereiten mit Kopfzerbrechen. Und zwar findet ja die Messwertaufnahme am A/D Wandler statt. Der vorgegebene Messbereich ist 0..100°C (entspricht -100mV...100mV) ;(gehört zur Aufgabe) Hab mir ja gedacht das ich den aktuellen Messwert validieren muss, bevor ein speichern statt findet. Meine Lösung mit Compare und dann größer und kleiner usw. ABER... es handelt sich um eine negative Zahl und um eine Kommazahl die ich darstellen muss. zur Behandlung der negativen Zahl würde ich einfach "100" binär einlesen, dann all Bits mit einer "Negation" invertieren und dann eine "1" dazu addieren. das mit der "1" hab ich aus einem Skript, das steht glaub ich fürs vorzeichen. Aber wie geh ich mit den "mV" um? hab im Orgler ein Code gefunden der nich ganz ohne is und lang, Hoffe ich kann die "mV" also Division durch 1000 irgendwie komfortabler ausdrücken kann?? Viele Grüße p.s. Medientechniker können als Planungsingenieure für Konferenz, Medienproduktionstechnik, Audio&Videotechnik eingesetzt werden oder z.b. in der Entwicklung im Bereich Optik, Akustik Spanne is eigentlich breit gefächert
Hallo, dein A/D-Wandler gibt dir doch weder 0..100 (°C) noch -100 .. +100 (mV) aus, sonderen einen Wert zwischen 0..1023 (10-Bit A/D) oder einen Wert von -512..+511 (wenn der auch negative Spannungen messen kann). An der Stelle kannst du ja schon ansetzen den Messwert zu validieren (Grenzwertüberwachung, mehrere Messungen machen). Danach kommt die Umrechnung in *°C* und/oder mV. Die Kommastellen kannst du vermeiden indem du den Wert fest mit 10 oder 100 multiplizierst. Sascha
Christan K. schrieb: > Hallo, > > ... > > Zwei Dinge bereiten mit Kopfzerbrechen. Und zwar findet ja die > Messwertaufnahme am A/D Wandler statt. Der vorgegebene Messbereich ist > 0..100°C (entspricht -100mV...100mV) ;(gehört zur Aufgabe) > > Der HC11 hat einen 8-Bit ADC ( Analog-Digital-Converter )auf deutsch Analog/Digital Wandler. Somit ist seine kleinste Auflösung ca. 20mV ( 5Volt / 255 oder 256 ). Wie man dies nun macht das 0mV bis 100mV dem ADC-Wert 0-127 (positiver Bereich) entspricht oder -100mV bis 0mV dem ADC-Wert 255-128 (negativer Bereich) entspricht weiß ich leider nicht. Ich denke so etwas muß gemacht werden, das sonst der Meßwertbereich 0-5 bzw. 255-250 mit 5 Werten ziemlich klein ist. Kann aber auch sein das dies gar nicht erforderlich ist. Aber irgendwie muß doch 2,5Volt, also die halbe Betriebsspannung als 0 Volt gewertet werden. Oder wie macht man es negative (-100mV) zu messen, wenn dem µC nur eine unipolare Betriebsspannung von 5Volt zur verfügung steht ? > > > zur Behandlung der negativen Zahl würde ich einfach "100" binär > einlesen, dann all Bits mit einer "Negation" invertieren und dann eine > "1" dazu addieren. das mit der "1" hab ich aus einem Skript, das steht > glaub ich fürs vorzeichen. > > Ja, genau so werden negative Zahlen dargestellt ( das sogenannte Zweierkomplement ). > > > Aber wie geh ich mit den "mV" um? > > Ich weiß nicht wie Du das meinst. Ein Wert von 1 vom ADC bedeutet 20mV, ein Wert von 2 vom ADC bedeutet 40mV usw. > > > Viele Grüße > Bernd_Stein
@Bernd hab mich bei Orgler ab S.35 ff belesen. s.39 steht das negative Spannungen am ADC Eingang mit Kondensator und Widerstand ferngehalten werden sollen, weil sie das Messergebnis verfälschen. Darunter steht das mit dem 20mV ok..dadurch hab ich zwar Vorstellungen wie das gemeint ist, aber wirklich schlauer bin ich dadurch nicht. also meine Grenzen von -100mV bis 100mV (0°...100°C) entsprechen bei meinem 8 bit ad wandler 10000000 .... 01111111 (-128...127). Sollte ich nach der Mittelwertbildung einfach prüfen ob sich der Wert dazwischen befindet..? z.b. mittelwert in akku a laden; grenzwerte in anderen akku und dann entscheiden? Den Zusammenhang zwischen mV Bereich und dem Grenzbereich versteh ich noch nich weil z.b. von einem messbereich von -101mV bis 101mV wären ja die Grenzen auch 10000000...01111111 oder seh ich das falsch? Der Zusammenhang zwischen Temperatur und Spannung wäre ja: Tempwert [C]: = (Umess + 100mV) / 2mV Das wäre dann meine Umrechnung oh man...alles nich so einfach:)
Also ich hab jetzt eine theoretische Lösung gefunden. Vorweg: was bedeutet k & d? / wie heißt die Formel? Hab den Ansatz aus dem Thema "ADC: Umrechnung von ADC-Werten in Temperatur - Denkblockade." verwendet. -100mV = -128*k + d 100mV = 127*k + d =>k = 7,84*10^-4 d = 3.92*10^-4 Ergibt für die Spannung U[mV] = ADC * k +d Dann die Temperaturumrechnung: Temperatur[°C] = (errechnete Spannung + 100mV) / 2mV Ich weiß jetzt bloß nicht wie ich mit den Kommazahlen bei dem 68hc11 umgehe. Hätte da jemand eine Idee?
Christan K. schrieb: > Also ich hab jetzt eine theoretische Lösung gefunden. > > Vorweg: was bedeutet k & d? / wie heißt die Formel? lineare Gleichung. Und das ist Stoff für 14-jährige in Mathe > > Hab den Ansatz aus dem Thema "ADC: Umrechnung von ADC-Werten in > Temperatur - Denkblockade." verwendet. > > -100mV = -128*k + d > 100mV = 127*k + d > > =>k = 7,84*10^-4 > d = 3.92*10^-4 > > Ergibt für die Spannung U[mV] = ADC * k +d > > Dann die Temperaturumrechnung: > > Temperatur[°C] = (errechnete Spannung + 100mV) / 2mV Brauchst du doch gar nicht in 2 Schritten machen. Setz dir eine lineare Gleichung auf, die dir direkt vom ADC Wetr auf die Temperatur umrechnet. Entweder du rechnest dir die Werte entsprechend aus oder du bestimmst sie empirisch: Bei 0°C misst du welchen ADC Wert (Eiswasser) Bei 100°C misst du welchen ADC Wert (näherungsweise der Wasserdampf über kochendem Wasser) damit hast du wieder 2 ADC Werte und die zugehörigen Temperaturen. Temp = ADC_Wert * k + d k und d bestimmen und du hast deine Umrechnung. Kein Mensch muss dazu erst die Spannung ausrechnen. > > Ich weiß jetzt bloß nicht wie ich mit den Kommazahlen bei dem 68hc11 > umgehe. Indem du Vielfache nimmst. Anstalle von 2 Euro 70 plus 3 Euro 80, also 2,70 + 3,80 ------ 6,50 kannst du auch alles in Cent rechnen. 2,70€ sind 270 Cent, 3,80€ sind 380 Cent 270 380 ----- 650 Das Ergebnis lautet also 650 Cent. Oder aber (da wir wissen, dass 1 Euro 100 Cent hat): 6,50€ Voila: ohne Kommastellen gerechnet.
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.