Hallo!!
Ich muss bei folgendem Projekt noch die AD-Werte High und Low im Duty
der PWM als Grenzen definieren. Zumindest hat es mir mein Professor so
erklärt. Die AD-Messung und die PWM habe ich bereits fertig. Nun meine
Frage: Wie kann ich die Werte High und Low als obere und untere Grenze
definieren?
Ich hoffe wirklich, dass mir schnell jemand helfen kann, da ich das
Projekt bis spätestens nächste Woche Freitag abgeben muss.
Die Aufgabenstellung:
# Projekt µController:
Schreiben sie ein Programm, welches die Helligkeit der roten Led mittels
Poti einstellen kann.
Der AD-Wert des Poti wird ausgelesen und modifiziert am Display
ausgegeben.
z.B AD=0 --> Anzeige „-00-„ AD=255 --> Anzeige „-99-„ (Anzeige der
Helligkeit in Prozent)
Der AD-Wert des Poti wird auch zur Ansteuerung der roten Led verwendet,
die Helligkeit lässt sich
am besten mit einer einfachen PWM (Pulsweitenmodulation) realisieren.
Hinweis: Da die rote Led nicht am PWM-Pin des PICs angeschlossen ist,
kann nicht die Standard PWM
des Controllers genommen werden. Die PWM Realisierung muss daher mittels
Software (richtiges ein/ausschalten)
realisiert werden.
Mein Programm:
Lisa schrieb:> Ich muss bei folgendem Projekt noch die AD-Werte High und Low im Duty> der PWM als Grenzen definieren.
?
Ich sehe jetzt nichts in der geposteten Aufgabenstellung, die etwas mit
High und Low zu tun hätte.
Statt dessen sehe ich aber den Punkt
> Der AD-Wert des Poti wird ausgelesen und modifiziert am Display> ausgegeben.> z.B AD=0 --> Anzeige „-00-„ AD=255 --> Anzeige „-99-„ (Anzeige der> Helligkeit in Prozent)
Und wie hier schon steht, ist das nichts anderes als eine
Prozentrechnung.
Wenn du monatlich 255 SMS verschicken kannst und 43 schon verschickt
hast, wieviele Prozent deines monatlichen Vorrats hast du dann schon
aufgebraucht?
Also habe ich folgenden Punkt der Aufgabenstellung eigentlich schon
realisiert:
Der AD-Wert des Poti wird auch zur Ansteuerung der roten Led verwendet,
die Helligkeit lässt sich
am besten mit einer einfachen PWM (Pulsweitenmodulation) realisieren.
Ich weiß nur nicht genau, was der Professor dann damit gemeint hat, dass
ich die Low- und High-Werte als Grenzen für die PWM verwenden soll.
Und die LED flackert immer wieder ein bisschen, er meinte, dass es sich
um ein Timeing-Problem handelt, wo könnte da mein Fehler im obigen
Programm liegen?
LG Lisa
Korrigier mich, wenn ich falsch liege.
Aber irgendwie kann ich in deinem Code überhaupt keine Wertausgabe der
gemessenen ADC Werte entdecken. Weder den direkt gemessenen Wert noch
entsprechend in Prozent umgerechnet.
Eiegentlich hätte ich im Umfeld von
1
start00 call adc_8bit
2
movf ad_low,w
3
movwf duty
irgendeinen CALL erwartet, der den 'duty' (oder w) als Zahl auf der
7-Segment zur Anzeige bringt. Der Teil fehlt mir komplett, inklusive
entsprechendem Code, der eine Zahl im Bereich 0 bis 255 in die
Hunderter, Einer und Zehner zerlegt und in zahl_0 bis zahl_3 ablegt.
Lisa schrieb:> Das ist richtig, die Ausgabe der Werte fehlt mir auch noch, aber ich> weiß nicht genau, wie ich diese realsieren könnte.
Dann hätte ich vorgschlagen, du kümmerst dich erst mal darum.
So wie das aussieht, reicht es, wenn du eine Zahl im Bereich 0 bis 255
in Hunderter, Zehner und Einer zerlegst und die jeweiligen Ziffern in
zahl_0 bis zahl_3 ablegst. Den Rest macht dann schon die vorhandene
7-Segment Ausgaberoutine.
Ist dein duty zb 187, dann muss 7 nach zahl_0, 8 nach zahl_1, 1 nach
zahl_2 und 0 nach zahl_3. Den Rest machen dann schon die vorhandenen
7-Segment Routinen.
Du bist drann.
Und wie realisiere ich dann die Prozentausgabe?? Ich muss die Zahlen von
0-255 ja in Prozent ausgeben, also wären 255 meine 100%, aber wie sage
ich das dem Programm? Und Zahlen festlegen kann ich, aber wie gebe ich
dann die Werte aus, die aus dem Verstellen des Poti resultieren?
Lisa schrieb:> Und wie realisiere ich dann die Prozentausgabe?? Ich muss die Zahlen von> 0-255 ja in Prozent ausgeben, also wären 255 meine 100%, aber wie sage> ich das dem Programm?
Wie wärs mit .... Multiplizieren und Dividieren?
> Wenn du monatlich 255 SMS verschicken kannst und 43 schon verschickt> hast, wieviele Prozent deines monatlichen Vorrats hast du dann schon> aufgebraucht?
Wie rechnest du höchstpersönlich mit Papier und Bleistift das aus?
> Und Zahlen festlegen kann ich, aber wie gebe ich dann die Werte> aus, die aus dem Verstellen des Poti resultieren?
Wieviele Hunderter gibt es denn in 187? Warum? Wie hast du das
ausgerechent?
Wieiele Zehner? Wie hast du das ausgerechnet? Und wieviele Einer?
Hallo,
Zu den High-, und Low-Werten als Grenzen für die PWM fielen mir spontan
2 Deutungsmöglichkeiten ein, über deren Wahrscheinlichkeit und Sinn mal
nebensächlich sein.
1. Mit "low" und "high" war das low-, und das high-Byte des AD-Wertes
gemeint. Zusammen ergeben das low-, und high-Byte ja deinen aktuellen
AD-Wert, der dann als grenzwert in einer timerroutine die led schalten
könnte.
2. Wenn du das Poti auf "null" drehst, muss der AD-Wert nicht exakt 0
sein, genau so muss das auf anschlag gedrehte Poti bei der AD-Wandlung
nicht den maximalwert des AD-Wandlers ausgeben. Möglichkeit 2 wäre also,
dass dein Prof will, dass du die AD-Werte bei völlig zu- und
aufgedrehtem Poti als Grenzen benutzt, und nicht die möglichen minimal
und maximal Werte des AD-Wandlers..
Freundliche Grüße!
Karl Heinz schrieb:> Und Zahlen festlegen kann ich, aber wie gebe ich dann die Werte>> aus, die aus dem Verstellen des Poti resultieren?
Wie ich das am Papier aufspalte ist mir natürlich klar, aber ich weiß
trotzdem immer noch nicht, wie ich das dann quasi für Zufallszahlen im
Programm realisieren kann.
Lisa schrieb:> Könnte das irgendwie im Zusammenhang mit dem von auch vom Prof genannten> Timingproblem und dem dadurch ausgelösten flackern der LED stehen?
gant klares Nein.
Wie man etwas rechnet (bzw. noch nicht rechnet) hat noch nichts damit zu
tun, dass du mit dem Timing nicht hinkommst.
Lisa schrieb:> Karl Heinz schrieb:>> Und Zahlen festlegen kann ich, aber wie gebe ich dann die Werte>>> aus, die aus dem Verstellen des Poti resultieren?>> Wie ich das am Papier aufspalte ist mir natürlich klar, aber ich weiß> trotzdem immer noch nicht, wie ich das dann quasi für Zufallszahlen im> Programm realisieren kann.
Dann musst du dich mal schlau machen, wie man mit dem PIC multipliziert
und dividiert.
Da du die ganze Zeit von Professor sprichst, gehe ich davon aus, dass du
auf einer Uni oder FH bist. Und im Regelfall kriegt man da in einer
Vorlesung Unterlagen.
Karl Heinz schrieb:> Wieviele Hunderter gibt es denn in 187? Warum? Wie hast du das> ausgerechent?> Wieiele Zehner? Wie hast du das ausgerechnet? Und wieviele Einer?
1
;Wert festlegen
2
movlw .0
3
movwf zahl_3
4
movlw .8
5
movwf zahl_2
6
movlw .1
7
movwf zahl_1
8
movlw .5
9
movwf zahl_0
Da habe ich schon mal eine Zahl aufgespalten, damals war das die Ausgabe
für meine Matrikelnummer. Die Werte sind fixe Zahlen, die sich nicht
verändern, aber wenn ich das Poti verdrehe bekomme ich Zufallswerte. Wie
kann ich dann die Zufallswerte ausgeben bzw. zerlegen und in Prozent
ausgeben?
Lisa schrieb:> Karl Heinz schrieb:>> Wieviele Hunderter gibt es denn in 187? Warum? Wie hast du das>> ausgerechent?>> Wieiele Zehner? Wie hast du das ausgerechnet? Und wieviele Einer?>>>
1
;Wert festlegen
2
> movlw .0
3
> movwf zahl_3
4
> movlw .8
5
> movwf zahl_2
6
> movlw .1
7
> movwf zahl_1
8
> movlw .5
9
> movwf zahl_0
10
>
>> Da habe ich schon mal eine Zahl aufgespalten,
Nein hast du nicht.
Du hast Zahlenkonstante hingeschrieben. Das hat nichts damit zu tun,
dass dein Computer rechnen muss.
> verändern, aber wenn ich das Poti verdrehe bekomme ich Zufallswerte. Wie> kann ich dann die Zufallswerte ausgeben bzw. zerlegen und in Prozent> ausgeben?
Ja und?
Glaubst du im Ernst, ein Computer könne nicht rechnen?
Die Zahl, die du vom ADC kriegst sei x.
Wieviele Hunderter stecken in x? Wie rechnest du das aus?
Wenn du 255 SMS pro Monat zur Verfügung hast und x SMS davon schon
aufgebraucht hast, wieviele Prozent sind das? Wie errechnet sich diese
Prozenzahl, wenn x gegeben und einen beliebigen Zahlenwert (im Bereich 0
bis 255) hat?
Und noch was: Die Lösung "Gelöst durch Hinsehen" gilt nicht. Natürlich
ist mir klar, dass du durch Hinsehen erkennst, dass in 187 genau 1
Hunderter, 8 Zehner und 7 Einer stecken. Aber darum gehts nicht. Es geht
darum ein allgemeines Schema zu haben, eine Rechenvorschrift, wie man
die Zahl der Hunderter, Zehner und Einer in x (beliebig aber fix und
innerhalb der Grenzen) ermittelt.
1
sei x eine Zahl, beliebig aber fix und im Bereich 0 bis 255
2
3
x / 100 -> Anzahl der Hunderter
4
sei tmp gleich x - (Anzahl der Hunderter * 100)
5
tmp / 10 -> Anzahl der Zehner
6
sei tmp gleich tmp - (Anzahl der Zehner * 10)
7
tmp -> Anzahl der Einer
während man sich hier noch um die Multiplikation / Division drücken
könnte, führt bei der Prozentrechnung kein Weg daran vorbei (ausser
einer Tabellenlösung)
Ganz abgesehen davon, dass du auf längere Sicht sowieso nicht drum rum
kommst, etwas Arithmetik mit dem µC zu betreiben.
Karl Heinz schrieb:> sei tmp gleich x - (Anzahl der Hunderter * 100)
Das ist im übrigen nichts anderes als der Rest, der sich bei der
vorhergehenden (ganzzahligen) Division durch 100 ergeben hat. Je nachdem
magst du eine Divisionsroutine zur Verfügung haben, bei der sich dieser
Rest bereits fertig ergibt und du ihn nicht getrennt ausrechnen musst.
-> Beitrag "Hilfe bei Programmierung in Mplab"
Lisa Zwiletitsch schrieb im Beitrag #3913758 am 06.12.2014:
> Hallo!> Ich bin neu hier und brauche dringend Hilfe. Ich muss für mein Studium> ziemlich bald ein Projekt abgeben, habe jedoch keine Ahnung, wie ich> überhaupt beginne.
War wohl doch nicht so dringend ;-)
Ich denke deinem Prof geht es in erster Linie um das effiziente
umrechnen der zahlen.
Divisionen durch 10 sind auf einem µC umständlich und sollten vermieden
werden.
Ich würde die Aufgabenstellung nochmal genau lesen. Es wird nicht 0-100
verlangt, sondern nur bis 99... Und die zahlen 0x00-ff zu 00-99 zu
wandeln ist nicht schwer. Mehr verrate ich aber nicht, das musst du dir
selbst erarbeiten.
Volker SchK schrieb:> -> Beitrag "Hilfe bei Programmierung in Mplab"> Lisa Zwiletitsch schrieb im Beitrag #3913758 am 06.12.2014:>> Hallo!>> Ich bin neu hier und brauche dringend Hilfe. Ich muss für mein Studium>> ziemlich bald ein Projekt abgeben, habe jedoch keine Ahnung, wie ich>> überhaupt beginne.>> War wohl doch nicht so dringend ;-)
Der überaus nette Professor hat mir mehr Zeit gegeben ;) dafür bin ich
auch schon ein Stückchen weitergekommen und habe nun zusätzliche
Probleme ;)
robin schrieb:> Ich denke deinem Prof geht es in erster Linie um das effiziente> umrechnen der zahlen.
Ich denke, hier geht es konkret darum, überhaupt erst mal irgendwie
umzurechnen. Effizient kommt später.
Lieber eine Lösung, die etwas langsamer ist als gar keine Lösung.
Karl Heinz schrieb:> Ich denke, hier geht es konkret darum, überhaupt erst mal irgendwie> umzurechnen.
D.h. wenn der überaus nette Professor nicht überhaupt die
Aufgabenstellung soweit vereinfacht hat, dass der Teil 'Anzeige in
Prozentform' überhaupt gefallen ist und durch etwas Einfacheres ersetzt
wurde.
Stichwort 'auf Maximum und Minimum beschränken'.
Ich denke nämlich genau so ist es zu ...
> Ich muss bei folgendem Projekt noch die AD-Werte High und Low> im Duty der PWM als Grenzen definieren. Zumindest hat es mir> mein Professor so erklärt.
... gekommen.
Also Lisa: Ich denke es wird Zeit, Farbe zu bekennen.
Und ganz ehrlich, wenn du nicht mal dieses hinkriegst, dann solltest du
dir ernsthaft überlegen, das Studium zu wechseln. Und das sage ich
nicht, weil ich bösartig bin.
Karl Heinz schrieb:> Also Lisa: Ich denke es wird Zeit, Farbe zu bekennen.> Und ganz ehrlich, wenn du nicht mal dieses hinkriegst, dann solltest du> dir ernsthaft überlegen, das Studium zu wechseln. Und das sage ich> nicht, weil ich bösartig bin.
Heisst das, du bist zwar bösartig aber das ist nicht der Grund für deine
Aussage ? ;-)
@Lisa
Ich fürchte er könnte recht haben. Dein Programm ist überaus schlecht
kommentiert. Es ist viel zu mühsam heraus zu finden was das gnze soll.
Beschreib doch mal in Worten, was das macht ...
Baut ihr echt noch Programme zusammen indem ihr Assembler Dateien mit
#include einbindet ?
goto $-x sollte man auch nicht unbedingt verwenden. Ein Label ist
sicherer.
Karl Heinz schrieb:> Also Lisa: Ich denke es wird Zeit, Farbe zu bekennen.> Und ganz ehrlich, wenn du nicht mal dieses hinkriegst, dann solltest du> dir ernsthaft überlegen, das Studium zu wechseln. Und das sage ich> nicht, weil ich bösartig bin.
Solche "Ratschläge" benötige ich nun wirklich NICHT!! Ich bin im 5.
Semester meines Studiums und bereits im Berufspraktikum, das ich OHNE
Hilfe von irgendjemandem bekommen habe!! Jeder hat ein Fach, das ihm
überhaupt nicht liegt!!
Volker SchK schrieb:> Baut ihr echt noch Programme zusammen indem ihr Assembler Dateien mit> #include einbindet ?> goto $-x sollte man auch nicht unbedingt verwenden. Ein Label ist> sicherer.
Ja, ich habe nur die Interrupt-Routinen, die AD-Messung und das Main
geschrieben, den Rest bekommen wir vorgegeben!
Volker SchK schrieb:> Ich fürchte er könnte recht haben. Dein Programm ist überaus schlecht> kommentiert. Es ist viel zu mühsam heraus zu finden was das gnze soll.> Beschreib doch mal in Worten, was das macht ...
Nur weil ich nicht die komplett kommentierte Version reinkopiert habe
soll ich also mein Studium wechseln?! Alles klar!!
Trotzdem danke für die teilweise nette Hilfe!
LG
Lisa schrieb:> Karl Heinz schrieb:>> Also Lisa: Ich denke es wird Zeit, Farbe zu bekennen.>> Und ganz ehrlich, wenn du nicht mal dieses hinkriegst, dann solltest du>> dir ernsthaft überlegen, das Studium zu wechseln. Und das sage ich>> nicht, weil ich bösartig bin.>> Solche "Ratschläge" benötige ich nun wirklich NICHT!! Ich bin im 5.> Semester meines Studiums und bereits im Berufspraktikum, das ich OHNE> Hilfe von irgendjemandem bekommen habe!! Jeder hat ein Fach, das ihm> überhaupt nicht liegt!!
Wenn du bei der bereits vereinfachten Aufgabenstellung nicht auf die
Idee kommst, dass dein Prof gemeint hat
1
start00 call adc_8bit
2
movf ad_low,w
3
4
5
wenn w kleiner als ein Minimumwert
6
dann setze w auf diesen Minimumwert
7
8
wenn w grosser als ein Maximumwert
9
dann setze w auf diesen Maximumwert
10
11
movwf duty
12
...
dann ist 'liegt mir nicht' eine höfliche Umschreibung.
(Ob man diese Werte Modifikation am w macht oder gleich direkt am ad_low
ist Geschmackssache und hängt auch noch von anderen Nebenbedingungen ab.
Aber genau das ist das Prinzip, um das es geht und das du wahrscheinlich
hättest rausfinden sollen.)
Anfang und Ende von Potis sind ja immer bissel doof. Manchmal kommt man
nit ganz an die Endwerte.
Der ADC von deinem Pic hat 10 bit, entsprechend 0..1023.
Min und Max sollen auch bei einem etwas schlechteren Poti erkannt
werden.
Aufgrund dessen wäre auf meiner Werkbank die Struktur so:
ADC-Wandeln 10 bit
Min-Merker rücksetzen
Max-Merker rücksetzen
Wert-12<0?
Wert2=0
Min-Merker setzen
sonst
Wert2=Wert/10
Wert2>99?
Wert2=99
Max-Merker setzen
**Wandlung und Fehlerbehandlung fertig**
Dann braucht es noch eine Funktion binär->Einzelziffern. Die läßt sich
bestimmt irgendwo im Netz finden. Suche nach "pic binary-to-BCD".