Hallo Z'men,
anhang eines AD-Wandlers von AT89C51CC03 habe das Programm unten
geschrieben geschrieben. Aber ich weiss nicht genau, wo die For-Schleife
einzubringen ist, wenn ich die Messwerte im Bereich 150MicroS und
4200MicroS auch mit jedem Potis P16 und P17 einlesen moechte, denn ich
die Werte mit beiden Potis im Bereich von 1ms - 256ms.
Lange Rede kurzer Sinn, hier das Programm:
Ist ja furchtbar. Fang das am Besten nochmal von vorne an.
Es ist wesentlich besser, die Speicherung des AD-Wandlungsergebnises und
die Umstellung des Kanals in einer Interrupt-Routine zu erledigen.
Dann, wenn das funktioniert, stellst Du in (ich würde mal sagen in der
selben Interrupt-Routine) das Timerregister für die PWM um.
Die Hauptschleife ist im wesentlichen leer (falls Du die Ausgabe nicht
wirklich brauchst).
Eine For-Schleife kommt da überhaupt nicht vor.
Ach, und noch ein Hinweis:
Die Bits in den Steuerregistern haben Namen, die auch in at89c51cc03.h
definiert sind. Verwende die und nicht irgendwelche Literale, die Du
dann in Kommentaren lang und breit erklären musst.
Für den Anfang kann man die Interrupts (die das Ganze nicht einfacher
machen) auch weglassen und Alles in der Hauptschleife machen. Nur für
die PWM muss eben ein Hardwaretimer herhalten. Aber genau dafür sind die
ja auch im uC eingebaut...
Wo hast Du den Code her?
Er funktioniert nicht, die printf dauern ja schon >1ms je Zeichen.
Für 150 .. 4200µs mußt Du den Timer T2 nehmen und in dessen Interrupt
das RCAP2 entsprechend umladen.
Danke erstmal fuer die schnelle Antwort ;)
@Bitfluesterer
Heuuu, leider haben wir noch nicht den Interrupt-Kapitel behandelt. es
gilt auch fuer die PMW...
Zur Aufgabe habe ich als Hinweise, die For-Loop zu benutzen, um den
Zeitbereich zw 150ms und 4200ms darzustellen.
@Lothar
damit die Werte im Bereich 150microS und 4200microS auch mit dem
Oszilloskop geprueft/dargestellt werden koennen, gaben sie mir als
Hinweis eine For-Loop zu benutzen. ich habe folgendes z.B direkt nachdem
wait_ms()-Funktion probiert und natuerlich als Datentyp "float"
deklariert:
@Peter,
ich habe das Programm selber geschrieben ;) und es laeuft(Halleluja)
Es ist wahr, dass ich printf mit 1ms schon laeuft, aber waehrend ich an
den Potis drehe, wird die Impulsbreite immer groesser(max 510ms).
Hauptsache ist es, dass ich kein NULL im meiner wait_ms()funktion habe,
um den Abstuerz des Programms zu vermeiden(deshalb die if-loop).
Danke nochmal fuer die Hilfe.
b) wie soll "for(wert_p17==0.150; wert_p17<=4.2; (wert_p17++*0.001))"
denn compilieren?
"wert_p17==0.150" ist ein Vergleich.
Vermutlich wolltest du "wert_p17=0.150" hier schreiben.
Was soll "(wert_p17++*0.001)" machen?
Ich nehme mal an, es soll "(wert_p17+=0.001)" heissen?
Und was genau soll diese Schleife jetzt hilfreiches machen, ausser dass
sie dir 4050 Float-Werte zwischen 0.15 und 4.2 auf den Schirm
printet????
Mit viel Phantasie und einigen runden Glasgegenständen lese ich heraus,
dass es dir eigentlich darum geht, deine Potiwerte von 0-255 in
Delay-Werte zwischen 150us und 4200us umrechnen möchtest.
Für das eigentliche Delay nützt dir dann allerdings die Funktion
"_wait_ms()" wenig.
Weiter sagt mir die Glaskugel, dass du statt "_wait_ms()" eine
For-Schleife verwenden willst, um Delays im us-Bereich zu bekommen.
Ich sehe in deinem Programm allerdings auch keine Anweisungen, die einen
Output-Port toggeln würden, damit du deine PWM mit einem Oszilloskop
sichtbar machen könntest.
Offenbar reicht dir bisher die printf Ausgabe auf deinem Schirm, dass
die Delay-Werte überhaupt berechnet wurden?
Rätsel,....
Hi Easylife,
das sind sehr wertvolle Hinweise von dir, die ich NIE dazugekommen
waere.
Du hast eine sehr gute Glaskugel!
Ich folge diese Hinweise und poste meine Ergnisse erneuert.
VG
und ich frage mich schon seit mindestens 10 Minuten warum oben von
Leitwerten anstatt von Widerständen die Rede ist. An falsch geschriebene
Sekunden hätte ich nicht gedacht...
Francis Chaleu schrieb:> (deshalb die if-loop)
if-schleifen gibt es nicht, hat es noch nie gegeben und wird es auch nie
geben...
Daniel F. schrieb:> if-schleifen gibt es nicht, hat es noch nie gegeben und wird es auch nie> geben...
Das ist bei Programmiersprachen wie bei idiotensicheren Systemen auch:
Hat man erstmal was idiotensicher bekommen, erfinden sie einen besseren
Idioten ...
Soooli...
Oh je!!
Ihr habt mir eine richtige Lektion erteilt (Nie Wieder schreiben oder
denken, dass "if" eine Schleife ist, auch wenn man es nicht so gemeint
hat ;) )
Auf jeden Fall bin ich ein Stueck weiser geworden. Danke!!!
Weiser bin ich auch in sofern geworden, da ich anhang die guten Hinweise
von Easylife das Programm verbessert habe (um ehrlich zu sein, habe
ich eigentlich die mir gestellte Aufgabe besser verstanden).
Anbei, wie versprochen, das bearbeitete Programm. Ich muss zugeben, dass
ich mir noch etwa schwer tue, was die for-Schleife (am Ende des
Programms) anbelangt.
Also mit der For-Schleife soll es moeglich sein, die werte zw.
150microSekunden und 4200microSekunden darzustellen. Hiermit danke ich
euch im Voraus fuer die Inputs...
Leider hast du die Aufgabe eben gar nicht verstanden.
Deine printf() Aufrufe musst du rausnehmen. Die brauchen viel zu viel
Zeit.
Ich versuche dir mal die Aufgabe zu erklären:
Du sollst ein Programm schreiben, das auf einem I/O Pin eine PWM macht,
die du mit einem Oszilloskop messen kannst.
D.h. du hast dann sowas wie
1
while(1)
2
{
3
dIn_out=1;// output pin auf high setzen
4
wait(t_on);// eine gewisse Zeit warten
5
dIn_out=0;// output pin auf low setzen
6
wait(t_off);// wieder eine gewisse Zeit warten
7
}
Da deine Wartezeiten im Bereich von 150us bis 4200us (=4.2ms) sein
sollen, kannst du für "wait()" nicht die Funktion "_wait_ms()" nehmen.
Stattdessen wurde dir empfohlen das Delay über eine For-Schleife zu
machen, und das sieht dann so aus:
1
voidwait(unsignedt)
2
{
3
unsignedi;
4
for(i=0;i<t;i++)
5
;
6
}
D.h. du benutzt einfach eine leere for-schleife, die nichts anderes tut
als i von 0 bis t zählen zu lassen.
Dafür braucht der Microcontroller eine gewisse Zeit, dadurch entsteht
ein Delay.
Wie viel Zeit in Abhängigkeit von t vergeht, musst du mit dem
Oszilloskop messen, und dann t mit einem entsprechenden Faktor
multiplizieren um auf eine genau definierte Zeit zu kommen.
Es kann auch sein, dass die Schleife so schnell durchläuft, dass du
damit keine 4200us mehr hinbekommst, in dem Fall musst wait()
entsprechend mehrmals aufrufen, bzw. 2 Schleifen ineinander schachteln.
Am besten testest du erstmal mal folgendes aus:
1
unsignedi;
2
unsignedt=10000;
3
4
while(1)
5
{
6
dIn_out=1;// output pin auf high setzen
7
8
for(i=0;i<t;i++)
9
;
10
11
dIn_out=0;// output pin auf low setzen
12
13
for(i=0;i<t;i++)
14
;
15
}
und misst mal die Frequenz auf dem Output pin.
Dann kann man dir weiterhelfen einen entsprechenden Faktor zu berechnen.
Am Ende musst du auch noch berücksichtigen, dass ja dein Potentiometer
abgefragt werden soll, daher wäre es auch wichtig zu prüfen, ob eine A/D
Wandlung innerhalb der 150us überhaupt zu machen ist.
Hoi Zämen,
Vielen Vielen Dank Easylife!
Ich bin nur überrascht, wie du mein Anliegen besser als mich kennst.
Obwohl ich es zigmal gelesen habe, bin ich auf diese Lösung nie
gekommen.
Aber so gut erklaert und ganz besonders sehr gut detailliert.
Phenomenal und sensationell, wenn man sich sehr gut auskennt ;-)
Danke fuer die investierte Zeit(!), denn es ist nicht immer
selbsverstaendlich.
Deine Hinweise werde ich im Programm einsetzen und natuerlich sofort
Posten!!!!
VG
Moin,
ich möchte dieses Beispiel gern aufgreifen, da ich selber gerade damit
beschäftigt bin und mir sich dieses Beispiel eines Delay in Form einer
For-Schleife zwar in der Theorie erschließt, praktisch aber nicht
funktioniert.
Bei dem von Easylife genannten Wert für t=10000, ergibt sich an Portpin
1.0 eine Frequenz von 3,55 Hz, was einer Periodendauer T = 282 ms
entspricht. Bei einem symmetrischen Rechtecksignal wäre tp und tn somit
T/2 bzw. 141ms.
Um nun die Impulsbreite (tp) und die Impulspause (tn) mit beiden Poti´s
von 0,150 ms bis 4,2 ms einstellen zu können ist genau welcher Faktor zu
verwenden?