Forum: Mikrocontroller und Digitale Elektronik Temperatur Messung Assembler


von Christan K. (rumpi)


Angehängte Dateien:

Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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)

von Purzel H. (hacky)


Lesenswert?

Bei Controllern sollte man die Moeglichkeit das Programm abzubrechen 
vergessen. Soll er sich schlafen legen ? Fuer immer ?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Christan K. (rumpi)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

von Christan K. (rumpi)


Angehängte Dateien:

Lesenswert?

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

von Tom M. (tomm) Benutzerseite


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Christan K. (rumpi)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Christan K. (rumpi)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Christan K. (rumpi)


Lesenswert?

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

von Christan K. (rumpi)


Angehängte Dateien:

Lesenswert?

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

von MaWin (Gast)


Lesenswert?

> 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.

von Christan K. (rumpi)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.)

von Christan K. (rumpi)


Lesenswert?

> 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?

von MaWin (Gast)


Lesenswert?

> 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.

von Christan K. (rumpi)


Lesenswert?

> Aber das übersteigt den Level in Mädchentechnologie.

Glaub dein Level übersteigt es eine kompetente Antwort zu geben.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

von Christan K. (rumpi)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

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

von Christan K. (rumpi)


Lesenswert?

@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:)

von Christan K. (rumpi)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Holger P. (Gast)


Lesenswert?

Schau mal hier: Beitrag "ADC Werte berechnen, nur wie?"

Da sind es auch keine 5,00Volt.

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
Noch kein Account? Hier anmelden.