Forum: Mikrocontroller und Digitale Elektronik Vorteile dsPIC


von Patrick W. (seennoob)


Lesenswert?

Hallo
Worin liegen eigentlich die Vortteile des dsPIC ?
Für was sind die DSP Befehle gut ?

MFG Patrick

von Peter Diener (Gast)


Lesenswert?

Hallo Patrick,

es ist immer die Frage, was man mit einem Prozessor machen will. DSP 
Befehle sind leistungsfähige mathematische Methoden zur digitalen 
Sighnalverarbeitung und meistens Befehle, die - wenn sie nicht vorhanden 
wären - durch andere Befehle nur aufwändig zu ersetzen wären. Wenn man 
keine aufwändigen mathematischen Berechnungen machen möchte, ist man mit 
einem DSP auch nicht unbedingt gut beraten. Wenn man aber z.B. eine FFT 
oder Korrelation oder Faltung auf dem Prozessor rechnen muss, hat es 
enorme Vorteile, wenn man dazu mächtige DSP Befehle hat.

Ein wichtiger solcher Befehl ist z.B. MultiplyAccumulate, der eine 
Multiplikation und anschließende Addition in einem Befehl ausführt. Es 
gibt aber noch viele andere und vor allem dann bei leistungsfähigeren 
(nicht mehr dsPIC) Prozessoren noch erheblich mächtigere Befehle.

Der dsPIC hat - im Vergleich zu anderen DSPs - den Vorteil, dass er 
relativ schlank und somit leicht zu erlernen ist. Außerdem gibt es 
dsPICs die noch mit 5 Volt laufen, was das "Hobbybasteln" etwas 
erleichtert, wenn man keine 1,8V braucht. Der dsPIC ist ein 
Mikrocontroller, hat alo sämtliche Peripherie, die man üblicherweise 
braucht, damit der Prozessor läuft, schon eingebaut und kann deshalb 
praktisch standalone laufen, was mit großen DSPs oft nicht möglich ist.

Wenn es dich speziell interessiert, was genau an einem dsPIC 
leistungsfähig ist, dann steht das im jeweiligen Datenblatt.

Viele Grüße,

Peter

von Patrick W. (seennoob)


Lesenswert?

Und wie sind dann die DSP bei der Programmierung ? Optimmiert der 
Compiler von allein den Code für die DSP-FUnktionen ? Oder gibt es extra 
Befehle für C die für die optimale nutzung der Funktionen vorhanden 
sind?

MFG Patrick

von Benedikt K. (benedikt)


Lesenswert?

Patrick Weinberger wrote:
> Optimmiert der
> Compiler von allein den Code für die DSP-FUnktionen ?

Nein.

> Oder gibt es extra
> Befehle für C die für die optimale nutzung der Funktionen vorhanden
> sind?

Auch nicht, da die DSP Funktionen spezielle Register verwenden.
Microchip bietet aber fertige Libs mit allem möglichen aus der Bereich 
der Signalverarbeitung. Das sind z.B. FFT, PID Regler, Vektoroperationen 
und sehr vieles mehr.
Falls es mal nichts passendes gibt, muss man eben die entsprechende 
Routine in Assembler schreiben (was erstaunlicherweise recht einfach und 
kompakt ist, da es viele sehr mächtige Befehle gibt, die man ansonsten 
nur bei einem CISC findet.
Aber auch von den DSP Befehlen abgesehen sind die dsPICs ordentlich 
schnell, da sie nahezu alle Befehle in einem Takt abarbeiten.

von Peter Diener (Gast)


Lesenswert?

In der Regel ist es so, dass der Compiler die DSP Befehle schon 
einsetzt, aber nur, wenn er versteht, wie der Quellcode zu einem Befehl 
zusammengefasst werden kann.

Nimm an, du multiplizierst zwei Vektoren
         2
1;3;5 *  5
         7

Da kommt natürlich 52 raus. Aber wie rechnet man das in C?

Entweder so:

int a1, a2, a3, b1, b2, b3, c, d, e, ergebnis;

a1=1;
b2=3;
c3=5;
b1=2;
b1=5;
b1=7;

c=a1*b1;
d=a2*b2;
e=a3*b3:

ergebnis = c + d + e;

Hier wird zuerst normal multipliziert und dann die Ergebnisse 
aufaddiert. Hier ist dann die Frage, ob der Compiler versteht, dass die 
Zwischenergebnise nicht benötigt werden, besonders, wenn man deren 
Variablen an anderer Stelle wiederverwendet.

Besser ist es so:

ergebnis = a1 * b1;
ergebnis += a2 * b2;
ergebnis += a3 * b3;

Das wird mit Sicherheit in optimierten DSP Code umgesetzt, also 
multiplyAccumulate genutzt.

Wie stark der Compiler optimiert, kommt immer darauf an, ob er was taugt 
und ob der Programmierer weiß, wie er den code optimal hinschreiben 
muss, so dass der Compiler versteht, wie optimiert werden kann.

Bei guten Compilern sind etliche hochoptimierte Mathematikbibliotheken 
dabei, die man aus dem C-Code heraus aufruft, die dann auch die 
entsprechend optimalen DSP-Befehle nutzen. Der Sprachumfang von C wird 
dabei in der Regel nicht erweitert, man ruft halt eine Funktion auf, die 
in einer Bibliothek definiert ist.

Ich verwende für die Pics und dsPics den Compiler von CCS, der optimiert 
in der Regel sehr gut. Der Compiler von Microchip hat bei einer direkten 
Gegenüberstellung damals schlechter abgeschnitten und war auch in der 
Handhabung schwieriger.

www.ccsinfo.com

Peter

von Peter Diener (Gast)


Lesenswert?

b1=2;
b2=5;
b3=7;
muss es heißen

von Benedikt K. (benedikt)


Lesenswert?

Peter Diener wrote:

> Ich verwende für die Pics und dsPics den Compiler von CCS, der optimiert
> in der Regel sehr gut. Der Compiler von Microchip hat bei einer direkten
> Gegenüberstellung damals schlechter abgeschnitten und war auch in der
> Handhabung schwieriger.

Ich habe noch nie mit dem CCS gearbeitet, sondern nur mit dem C30 von 
Microchip, der meist sehr gut optimiert, auch wenn er keine DSP Befehle 
verwendet.
Der CCS ist dagegen diesem Thread nach eine Katastrophe:
Beitrag "PIC24 @ 80MHz und Timer1 zu langsam?"

von Peter Diener (Gast)


Lesenswert?

Hab mir den Thread grad mal durchgelesen, da sind aber einige 
Optimierungen nicht an bei dem CCS. Es gibts da Compileranweisungen, 
dass er nicht immer die TRIS Register setzt, wenn man die Ports setzt 
und nicht alle Register sichert im Interrupt, sondern nur die 
gebrauchten. Dann sieht das schon gleich ganz anders aus.

Peter

von chris (Gast)


Lesenswert?

Nachteile dsPIC
Im vergleich zu anderen DSP´s läuft die DSP Logik nicht parallel zum
normalen Prozessor, sondern die DSP-Funktionen sind erweiterungen des
Befehlssatzes des Prozessors. Also der dsPic ist kein richtiger DSP,
sondern ein PIC, der um DSP Funktionen erweitert wurde. Trotzdem,
die Libs, welche von Microchip zur Verfügung gestellt werden, sind 
beeindruckend, angefangen von PID, ... bis hin zur Spracherkennung und
darüber hinaus.

von Patrick W. (seennoob)


Lesenswert?

Also würden diese "Erweiterungen" zB beim Berechnen von Sinuswerten eine 
enormen Performance Vorteil bringen gegenüber einem normalen µCs ?

von (prx) A. K. (prx)


Lesenswert?

Bei der Berechnung von Sinuswerten würde dir vor allem ein DSP mit 
Fliesskommarechnung einen enormen Vorteil bringen.

von Patrick W. (seennoob)


Lesenswert?

Da kommt mir noch eine Frage wie rechnet man mit Fixkomma DSP ? Was 
bedeutet eigentlich das Fixkomma ?

MFG Patrick

von Benedikt K. (benedikt)


Lesenswert?

A. K. wrote:
> Bei der Berechnung von Sinuswerten würde dir vor allem ein DSP mit
> Fliesskommarechnung einen enormen Vorteil bringen.

Fließkommaberechnungen auf einem dsPIC sind meiner Meinung nach auch in 
Software erstaunlich schnell (was vermutlich u.a. an den vielen, 
Arbeitsregistern liegt). Es wurde sogar mal ein programmierter dsPIC als 
mathematischer CoProzessor verkauft: http://www.awce.com/pak1.htm
Eine Berechnung von 256 Sinuswerten inkl. Skalierung auf 16bit Festkomma 
benötigt etwa 32ms bei rund 25MIPS.
Zum Vergleich: Eine FFT mit den 256 Werten benötigt bei 25MIPS rund 
0,8ms.

Patrick Weinberger wrote:
> Da kommt mir noch eine Frage wie rechnet man mit Fixkomma DSP ? Was
> bedeutet eigentlich das Fixkomma ?

Festkomma ist nichts anderes als das Rechnen mit Ganzzahlen und eine 
entsprechenden Skalierung.
Man verwendet dazu z.B. 16bit signed integer mit dem Bereich -32768 bis 
32767 und definiert -32768=1. So erhält man den Bereich -1 bis 0.99997. 
-0,5 sind daher -16384 usw.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Worin liegen eigentlich die Vortteile des dsPIC ?
Gegenüber was? Verglichen mit wem?
Verglichen mit einem LKW ist er bedeutend leichter zu verstauen, er 
braucht weniger Treibstoff als ein A380, das sind die wirklichen 
Vorteile.

@  Patrick Weinberger (seennoob)
Im Ernst:
deine Frage ist nicht vollständig ausformuliert  ;-)

> Was bedeutet eigentlich das Fixkomma ?
Der ADSP2181 (2100-Familie) ist ein Festpunkt DSP. Das Handbuch zu 
diesem Prozessor beschreibt sehr schön die Berechnungen mit 
Festpunktzahlen.

Benedikt K. (benedikt) wrote:
> So erhält man den Bereich -1 bis 0.99997.
Und der Vorteil hier ist:
bei einer Multiplikation von zwischen -1 und +1
kommt immer auch eine Zahl zwischen -1 und +1 heraus.

von Patrick W. (seennoob)


Lesenswert?

Dann mal so formuliert welche Vorteile hat eine dsPIC gegenüber einem 
normalen PIC ?

Naja also ich versteh so halbwegs alles.

Danke an euch allen

MFG Patrick

von (prx) A. K. (prx)


Lesenswert?

Patrick Weinberger wrote:

> Dann mal so formuliert welche Vorteile hat eine dsPIC gegenüber einem
> normalen PIC ?

Wenn ich mir den Code ansehe, den ein C Compiler für 8bit PICs (16,18) 
produziert, dann kommt mir stets das kalte Grausen. Bei den PIC30 nicht. 
Was aber mit dem "ds" vorneweg nichts zu tun hat. PIC30(24,33) ist zwar 
eine etwas eigentümliche aber für C gut nutzbare Architektur.

Dass da auch DSP drin ist, das kann nützlich sein, kann man aber auch 
ignorieren wenn nicht nötig. Hat Microchip dann auch gemerkt und drum 
gibt's die PIC24 praktisch identisch ohne DSP (PIC24 = dsPIC33 ohne oder 
wohl eher mit abgeschaltetem DSP).

Wobei sich die in die Architektur integrierte Fähigkeit zum DSP 
allerdings bei Aufwand/Taktfrequenz/Stromverbrauch etwas in den Weg 
gestellt hat, denn Mem=>Mem in einem Zyklus gibt es nicht gratis. Und es 
ist auch nicht wirklich genial, den Multiplier zu verwenden um auf 
schnellstmögliche Art 2 Nullen in Register zu laden.

von Patrick W. (seennoob)


Lesenswert?

Ich hab mir grad mal das Datenblatt des PIC24 angesehen da steht was von 
FIFO beim SPI. Was ist den jetzt dieser FIFO genau ?

MFG Patrick

von Peter Diener (Gast)


Lesenswert?

Ein FIFO ist ein sog. Firtst In First Out Speicher. SPI hat ja eine 
bestimmte Bitrate, die oft geringer ist als der Prozessortakt. Nun gibt 
bei einem normalen SPI der Prozessor die zu sendenden Daten in das 
Senderegister, was normal 1 byte groß ist. Währen die Daten gesendet 
werden, kann er entweder warten, oder was anderes machen. Wenn das 
gesendet ist, kann er was neues in das Senderegister füllen. Um diesen 
Zeitpunkt zu melden, nimmt man normalerweise Interrupts, d.h. der 
Prozessor wird bei seiner Hintergrundtätigkeit unterbrochen, wenn er das 
Senderegister füllen kann. Wenn man jetzt z.B. einen FIFO mit 16 Byte 
vor dem Senderegister hat, kann man gleich 16 Byte auf einmal 
reinschreiben, die automatisch sequentiell in das Senderegister 
nachgeschoben werden und wird deswegen nicht so oft im Hauptprogramm 
unterbrochen.

Das gleiche gilt auch für den Empfang von Daten.
Richtig komfortabel wird es, wenn die FIFOs so groß sind, dass die ganze 
Nachricht, die man senden will, drin Platz hat, bei einem PC z.B. kann 
man Karten für serielle Schnittstellen einbauen, die 1kB FIFO haben.

von Benedikt K. (benedikt)


Lesenswert?

Peter Diener wrote:
> Richtig komfortabel wird es, wenn die FIFOs so groß sind, dass die ganze
> Nachricht, die man senden will, drin Platz hat

Bei einem dsPIC33 bietet sich dafür der DMA Controller an. Der Speicher 
dazu ist 1-2kByte groß und der DMA Controller kann im Hintergrund Daten 
von/zu beliebiger Peripherie übertragen.

von Patrick W. (seennoob)


Lesenswert?

Ist es auch möglich das DMA Controller nach einer Änderung an einem PIN 
daten auf einen Port legt ?

von Benedikt K. (benedikt)


Lesenswert?

Prinzipiell ja. Für einen DMA Transfer ist ein Interrupt notwendig. Dies 
kann z.B. der externe Interrupt oder auch ein Input Capture Interrupt 
sein.

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.