PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD-Wert addieren, PWM ausgeben



HoStAn
19.10.2006, 08:26
Ich habe am PIC 2 analoge Werte anliegen, die ich im internen AD-Wandler umwandle. Diese 2 AD-Werte gebe ich an den PWM Ausgängen des PIC’s aus.

Das Programm sieht ungefähr so aus:

ad_holen1
pwm_ausgabe1

ad_holen2
pwm_ausgabe2

Nun möchte ich die 2 AD-Werte addieren und an dem PWM-Ausgang1 ausgeben. Ich kann ja diese 2 Werte nicht einfach addieren, da ich dann wahrscheinlich Probleme mit der Größe des Registers habe. Die Größe eines AD-Wertes ist 8-Bit.

Habt Ihr einen Vorschlag, wie man das am besten machen kann?

Hessibaby
19.10.2006, 08:55
Wenn Du zwei 8 bit Werte addierst, kann das Ergebnis maximal 9 bit groß sein, das neunte bit ist bei den meisten CPU´s das carry- (übertrag) bzw. overflowbit, das man über eine Interruptserviceroutine abfangen kann. Im Klartext wenn 1 & 2 =512 dann PWM maximal.
Eine andere Möglichkeit ist es Nibbles zu bilden d.h. Du nimmst von beiden Werten erst die unteren 4 bit, addierst diese, dann die oberen 4 bit, und den eventuellen Übertrag aus der ersten Operation, addieren.
Ob Deine Hochsprachen das Unterstützen weiß ich nicht, in Assembler geht das aber, nicht easy, aber dennoch.
Gruß Hartmut

Mobius
19.10.2006, 19:01
Hum, wieso sollte das nicht einfach gehen? Das einzige was dir passieren kann ist, dass du bei der Addition das Carry-Bit gesetzt bekommst, mehr aber auch nicht.


movfw ADRESL ;lade die 2. Messung in W
addwf ADC_OLDL, ; Addiere diese in die 1. Messung
sknc (oder btfsc STATUS,C) ; overflow in den 9. bit testen
incf ADC_OLDH,f ; ja, dann den H-Register um 1 erhöhen

movfw ADRESH ; High-Register laden
addwf ADC_OLDH,f ; hinzuaddieren, speichern in GPR

Und in den Registern ADC_OLDL+H sind die Werte der Addition enthalten. Einen Überlauf im High-Byte kann es nicht geben, da der ADC vom PIC maximal 10Bit beträgt, also hat man noch 6 bit Buffer in den high-Register.

Die Frage, ob du dann bei einem überlauf in den 11. Bit den Wert (was ja für einen 10-Bit ADC als 0 erscheint) in den ADC schreiben kannst ist einfach mit einem "btfsc ADC_OLDH,3" abfrage gelöst werden.

Ach, ja, nehme an, dass du dich für die besagten Operationen oben in den richtigen Bank angewählt hast, bevor du mit der Addition beginnst ;).
Bei Fragen, melden :)
MfG
Mobius

HoStAn
21.10.2006, 16:18
Danke Mobius für deine Antwort. Die werde ich mal dieses Wochenende ausprobieren


@Hessibaby

deinen ersten Vorschlag habe ich schon simuliert, und es funktioniert. Danke für deine Hilfe