Forum: Mikrocontroller und Digitale Elektronik ARM Cortex gegen AVR


von Martin B. (gonative)


Lesenswert?

Ich beschäftige mich mit dem ARM Cortex M4, aber auch mir AVR-Mega und 
-Tiny um einen Einstieg in die Welt der Mikrocontroller zu meistern. PIC 
hat mich eher abgeschreckt, fand ich alles ziemlich undurchsichtig.

Wo seht ihr Bereiche in denen ARMs den AVRs den Rang ablaufen könnte?

Wo haben die AVRs klare Vorteile zu den ARMs?

von Fox Mulder (Gast)


Lesenswert?

Oje, als ob dies Frage zum ersten Mal hier gestellt würde. Du sitzt 
immer noch an den Grundlagen, oder? Versuch es doch auch mal mit einer 
Suche im Forum.

Beitrag "Re: Arduino - bringt's das ?"

von Mike (Gast)


Lesenswert?

ARM Cortex:
+ 32Bit,
+ Speed/Rechenleistung
+ Memory,
+ Peripherie/Schnittstellen
o freie Compiler Toolchain (am ehsten brauchbar CooCox)
- Komplex (nicht für Einsteiger)

AVR (8Bit):
+ Einfach (für Einsteiger)
+ freie Compiler Toolchain (AVR-GCC: Eclipse mit Plugin oder AVR-Studio)
o Peripherie/Schnitstellen
- Speed/Rechenleistung (falls das wichtig ist)

von F. F. (foldi)


Lesenswert?

Martin Bauer schrieb:
> Ich beschäftige mich mit dem ARM Cortex M4, aber auch mir AVR-Mega und
> -Tiny um einen Einstieg in die Welt der Mikrocontroller zu meistern. PIC
> hat mich eher abgeschreckt, fand ich alles ziemlich undurchsichtig.
>
> Wo seht ihr Bereiche in denen ARMs den AVRs den Rang ablaufen könnte?
>
> Wo haben die AVRs klare Vorteile zu den ARMs?

Zum Einstieg mit nem Cortex M4? Uff! Das ist aber ne harte Droge.
Bin selbst Anfänger und wenn ich die 176 Seiten Datenblatt des ATTiny 
sehe, dann denke ich mir, "Na ja!" Der ATmega328 hat dann schon über 500 
Seiten Datenblatt.
Ich bin gespannt und werde diesen Thread sehr gerne lesen.

Etwas kann ich dazu schon sagen. Das Preis/Leistungsverhältnis ist beim 
Cortex wohl besser. Ich hab so ein kleines Board von ST (16 Euro), da 
ist ist zwar nur ein kleiner M drauf, damit (soll) man schon irre viel 
machen können.

von Kaj (Gast)


Lesenswert?

Hi Martin,

meiner Meinung nach, ist zum Einstig ein AVR besser, da du nicht 
gleich bis zum Hals mit dingen zugeschüttet wirst.
Die AVRs haben von allem etwas weniger als die ARM, weniger Timer, 
weniger Register, usw.
Fang mit nem ATmega8 an, wenn du verstanden hast wie da die Timer, SPI, 
U(S)ART, usw. funktioniert, dann kannst du auch mit nem ATmega2560 
umgehen, und dann ist der Sprung zum ARM nicht mehr soweit.
Erstmal mit nem Polo anfangen, dann in den Audi und zum Schluss der 
Porsche ;)

Soweit meine Meinung.

Grüße

von F. F. (foldi)


Lesenswert?

Kaj schrieb:
> Fang mit nem ATmega8 an

Dass hier alle immer noch den ATmega 8 anführen. Der ist mittlerweile 
teurer als ein ATm238 (bei guloshop für 2 Euro) und 88,168,328 sind ja 
die Nachfolger. Also warum nicht mit einem aktuellen anfangen.
Gibts auch billig als Arduino.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Wenn ich heute nochmal anfangen würde, würde ich direkt auf ARM setzen.

Natürlich sind bspw. die STM32F4 sehr komplex (die Referenz nur für die 
Peripherie hat schon über 1300 Seiten) - deutlich komplexer als AVRs.

Aber: Niemand zwingt einen, direkt alles verwenden.

Man fängt also auch dort einfach mit einer blinkenden Leuchtdiode an. 
Die Initialisierung der Ports ist aufgrund der Möglichkeiten natürlich 
umfangreicher, aber z.B. mit der ST-Bibliothek nicht so viel schwerer, 
zumal hier im Forum viele Beispiele und auch Tutorien zu finden sind.

Von da aus hangelt man sich dann vielleicht zu den ersten Timern weiter 
und macht sich mit den Interrupts vertraut usw.

Wenn man sich anfangs die Doku ansieht, denkt man natürlich: "Ach Du 
Sch...." :-)

Preislich sind die 32-Bitter mittlerweile in denselben Regionen wie AVRs 
- bei ganz anderen Möglichkeiten!

Passende Entwicklungsboards bekommt man hinterhergeschmissen, ansonsten 
gibt es sehr preiswerte Adapterplatinen für die SMD-Bausteine und sogar 
schon einige ARMs im DIL-Gehäuse.

Chris D.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank O. schrieb:
> Dass hier alle immer noch den ATmega 8 anführen. Der ist mittlerweile
> teurer als ein ATm238 (bei guloshop für 2 Euro) und 88,168,328 sind ja
> die Nachfolger. Also warum nicht mit einem aktuellen anfangen.

Ja bitte :-) Der Mega328 ist bei Segor sogar billiger als der 168. Und 
die haben so viele schöne Sachen, die der olle Mega8 nicht vorweisen 
kann: Pinchange Interrupt, 3 PWM fähige Timer, bis zu 32k Flash....

von Kaj (Gast)


Lesenswert?

Argh, Asche auf mein Haupt für das Anführen des ATmega8  ;)

von Ingo (Gast)


Lesenswert?

Also ich habe mit den Tiny/Mega angefangen, über XMega zum Cortex F4. 
Das Ding ist schon hart, aber auch echt cool!

Trotzdem, fürs Hobby bleibe ich bei den Tiny/ Mega AVRs.
Sind doch etwas umgänglicher...

Grundsätzlich sollte man mit dem Controller ein Problem lösen, nicht
den Controller zum Problem machen ;)


Ingo

von F. F. (foldi)


Lesenswert?

Matthias Sch. schrieb:
> Frank O. schrieb:
>> Dass hier alle immer noch den ATmega 8 anführen. Der ist mittlerweile
>> teurer als ein ATm238 (bei guloshop für 2 Euro) und 88,168,328 sind ja
>> die Nachfolger. Also warum nicht mit einem aktuellen anfangen.
>
> Ja bitte :-) Der Mega328 ist bei Segor sogar billiger als der 168. Und
> die haben so viele schöne Sachen, die der olle Mega8 nicht vorweisen
> kann: Pinchange Interrupt, 3 PWM fähige Timer, bis zu 32k Flash....

Eben! Genau das meine ich. Wenn jemand nun ein Buch liest oder ein 
Tutorial liest, dann denkt er zunächst, dass er unbedingt einen Atm8 
nehmen muss, weil er ja die Beispiele nachbauen will. Erst das Wissen 
über die Nachfolger (und das kommt leider viel später) bringt ihn mit 
alten Büchern (da könnten die in den neuen Auflagen im Titel auf die 
neueren µC verweisen) auf heutigem Stand.

@Chris:
Danke für deine Sichtweise! Ich überlege auch ziemlich schnell auf 
Cortex umzusteigen. Mich schreckt nur dieses SMD Gefummel ab.
Bei Giga (ehemals Siemens) hatte ich vor einigen Monaten in der 
Reparaturabteilung mal sehen wollen wie die Frauen das da löten (war 
früher so), aber selbst da machen die das mittlerweile nur noch mit 
Automaten.
Die Platine die ich dort in der Hand hatte, da waren schon Bauteile 
drauf und die sind so winzig gewesen, dass ich sie kaum noch erkennen 
konnte.
Verlockend ist natürlich das man nichts mehr bohren muss und man wird 
auf Dauer nicht an SMD vorbei kommen, weshalb dann so ein Cortex wieder 
deutlicher denkbar wird. Und es ist jetzt schon die Gegenwart und in 
Zukunft sind die Dinger überall drin.
Mich schreckt nur der Umfang und da ich selbst noch nicht so lange damit 
beschäftigt bin ist das für mich als sollte ich ne Herzoperation beim 
Säugling durchführen und das ohne Arzt zu sein.

von Martin B. (gonative)


Lesenswert?

Ja, da habt ihr recht. Da der Cortex M4 doch ne ganze Menge zu bieten 
hat, wird man regelrecht erschlagen. Ich habe mir deswegen auch einfach 
ein paar ATMega8 und ATTiny geholt um die mit diskreten Bauelementen 
selbst zu beschalten. Zum Programmieren habe ich mir einen ganz 
einfachen AVR-USB-Programmer besorgt.

Wie sieht es mit der Leistungsaufnahme von Cortex vs AVR raus. Gibt es 
da Vergleichstabellen?

von Kaj (Gast)


Lesenswert?

Ingo schrieb:
>>Grundsätzlich sollte man mit dem Controller ein Problem lösen, nicht
>>den Controller zum Problem machen ;)

Auf den Scheiterhaufen mit dir :D
Wenn du den Controller zum Problem machst, hast du aber viel länger was 
davon ;)

von F. F. (foldi)


Lesenswert?

Ingo schrieb:
> Also ich habe mit den Tiny/Mega angefangen, über XMega zum Cortex F4.
> Das Ding ist schon hart, aber auch echt cool!
>
> Trotzdem, fürs Hobby bleibe ich bei den Tiny/ Mega AVRs.
> Sind doch etwas umgänglicher...
>
> Grundsätzlich sollte man mit dem Controller ein Problem lösen, nicht
> den Controller zum Problem machen ;)
>
>
> Ingo

Danke Ingo!

Ich schwanke sehr für die zukünftige Entwicklung. Die Cortexe haben ja 
auch noch Vorteile bei der Programmierung. Ist einer zu klein geworden, 
so kann man einfach einen größeren nehmen (soll man können; hab das so 
gelesen) und mit dem Programm so weiter nutzen können. Das macht die 
Sache wieder interessant.
Der Satz,
> Grundsätzlich sollte man mit dem Controller ein Problem lösen, nicht
> den Controller zum Problem machen ;)
ist wohl wahr und bringt es auf den Punkt.
Ne Led leuchten lassen mit nem M4 ist ein bisschen auf die 
"Schwanzlänge" verweisen.
Wenn man sich mal die ganzen Videos zum Tiny13 auf youtube anschaut, was 
die da alles mit machen und der kostet gerade mal 60 cent, da denke ich 
reicht ein 328 für viele Anwendungen.

von Lothar (Gast)


Lesenswert?

Martin Bauer schrieb:
> Wo haben die AVRs klare Vorteile zu den ARMs?

Die AVRs haben (noch) Vorteile bei extrem kleinen und stromsparenden 
Anwendungen, der vergleichbare CortexM0+ wird aber grade verfügbar z.B. 
LPC8xx. Zudem gibt es für Bastler nur wenige Cortex als DIP (hier muss 
man dann auf DIP-Headerboards ausweichen).

Vorteile Cortex:
- einfacher zu programmieren für Einsteiger (Assembler und C)
- bessere Codedichte (trotz 32-bit)
- Bibliotheken für alles (CMSIS, USBLib, TCP/IP)
- kompatibel (Code für M0 läuft auf M3 läuft auf M4)
- wie schon erwähnt grosse Auswahl an (neuer) Peripherie (z.B. SPIFI, 
QEI)

Wer das einfacher zu programmieren nicht glaubt :-) hier mal das Blinken 
einer LED an einem M4 am Pin 1_25 in Assembler (ok in C sind es nur 4 
Zeilen):

        MOV R0, #1
        LSL R0, R0, #25         ; R0=bit_25

        ADR R1, FIO1DIR
        LDR R1, [R1]            ; R1=&FIO1DIR
        STR R0, [R1]            ; FIO1DIR_bit.P1_25 = 1 (output)

        ADR R1, FIO1PIN
        LDR R1, [R1]            ; R1=&FIO1PIN
loop
        LDR R2, [R1]            ; read FIO1PIN
        EOR R2, R2, R0          ; FIO1PIN_bit.P1_25 ^= 1 (LED toggle)
        STR R2, [R1]            ; write FIO1PIN

        BL delay

        B loop

von Peter D. (peda)


Lesenswert?

Fürs schnelle Basteln sind die AVRs erheblich angenehmer.

Man kann einfach auf ne Uniplatine einen DIP-Sockel setzen und den AVR 
reinstecken.

Gerade beim Basteln passieren oft Unfälle (magischer Rausch entweicht) 
und nen TQFP-144 abzulöten, ohne daß sich Leiterzüge abheben, ist doch 
wesentlich umständlicher, als einen neuen AVR in den Sockel zu stecken.

Auch braucht er nicht mehrere eng stabilisierte Spannungen, es reicht 
ihm eine Spannung irgendwo zwischen 1,8V ... 5,5V.
Z.B. ne 5V USB Wandwarze oder 2 * 1,5V oder ähnliches.

von Martin B. (gonative)


Lesenswert?

Das mit der Bauform ändert sich auch gerade ein bisschen oder? Ich habe 
da was von einem M0 im DIL-Gehäuse gehört.

Ist echt schwer als Anfänger sich da auf irgendwas erst mal 
einzuschießen.

von Lothar (Gast)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:
> Man kann einfach auf ne Uniplatine einen DIP-Sockel setzen und den AVR
> reinstecken.

Stimmt, für Tests gibt es (bislang) nur einen M0 im DIP (siehe Bild). 
Das hat zumindest den Vorteil dass der M0 Code später auf M3 oder M4 
praktisch ohne Änderungen läuft.

Ansonsten sind DIP-Headerboards günstig zu bekommen z.B.

http://www.embeddedartists.com/products/boards/lpc1343_qsb.php

https://www.olimex.com/Products/ARM/NXP/LPC-H1343

von Peter D. (peda)


Lesenswert?

Lothar schrieb:
> hier mal das Blinken
> einer LED an einem M4 am Pin 1_25 in Assembler

Wow, doch so viel Code.
Beim AVR (ATtiny13) sind es dagegen nur 4 Befehle.

Du hast den Code für das Delay vergessen.
Braucht man sonst noch irgendwelchen Startup Code?

von Martin B. (gonative)


Lesenswert?

Es wird immer schwerer gegen die Cortexe was zu sagen, jedenfalls für so 
Hobbyprojekte.

von F. F. (foldi)


Lesenswert?

Lothar schrieb:
> Stimmt, für Tests gibt es (bislang) nur einen M0 im DIP (siehe Bild).

Gibt es den so mit Beschriftung drauf? Wenn, dann wo?

von Lothar (Gast)


Angehängte Dateien:

Lesenswert?

Frank O. schrieb:
> Gibt es den so mit Beschriftung drauf? Wenn, dann wo?

Musst Du liebevoll selbst machen :-) Ist hier aber Normalpapier aus dem 
Tintendrucker mit Klebestift drauf gemacht (wird ja nicht heiss).

von F. F. (foldi)


Lesenswert?

Lothar schrieb:
> Frank O. schrieb:
>> Gibt es den so mit Beschriftung drauf? Wenn, dann wo?
>
> Musst Du liebevoll selbst machen :-) Ist hier aber Normalpapier aus dem
> Tintendrucker mit Klebestift drauf gemacht (wird ja nicht heiss).

Wow! Auf dem Bild sieht es aus als wäre das aus Kunststoff.
Sieht gut aus!

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Lothar schrieb:
> Peter Dannegger schrieb:
>> Man kann einfach auf ne Uniplatine einen DIP-Sockel setzen und den AVR
>> reinstecken.
>
> Stimmt, für Tests gibt es (bislang) nur einen M0 im DIP (siehe Bild).
> Das hat zumindest den Vorteil dass der M0 Code später auf M3 oder M4
> praktisch ohne Änderungen läuft.
>
> Ansonsten sind DIP-Headerboards günstig zu bekommen z.B.

Sehr günstig für reine Adapterboards (auch vom Versand her!) ist dieser 
hier:

http://shop.anvilex.de/

Da lohnt das Runterlöten nicht mehr ;-)

Chris D.

von Lothar (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Wow, doch so viel Code.
> Beim AVR (ATtiny13) sind es dagegen nur 4 Befehle.

Auf dem 8051 auch :-) Trotzdem finde ich den ARM Assembler einfacher 
(und logischer). Zudem funktioniert alle Peripherie so, weil die 
Register von PWM, CAN usw. einfach in den 4GB Speicherraum eingeblendet 
sind.

Alle (ausser mir) machen es auch in C :-)

int main (void)
{
  FIO1DIR_bit.P1_25 = 1;        // output

  while(1)
  {
    FIO1PIN_bit.P1_25 ^= 1;   // toggle
    Delay();
  }
  return 0;
}

> Du hast den Code für das Delay vergessen.

delay
        PUSH {R0}
        MOV R0, #1
        LSL R0, R0, #18         ; 2^18=262144 (was auch immer)
count
        SUBS R0, R0, #1
        BNE count               ; <>0
        POP {R0}
        MOV R15, R14            ; PC=LR (return)

> Braucht man sonst noch irgendwelchen Startup Code?

Das läuft ohne Startup Code mit dem internen Oszillator (beim M4 meist 
4MHz) und ohne Stromsparfunktionen. Beim externen Oszillator (100MHz 
oder mehr) nimmt man besser die CMSIS Funktion (PLL-Monster).

von Martin B. (gonative)


Lesenswert?

Hab gerade gesehen, dass so ein ARM Cortex M3 bei Reichelt auch gerade 
mal ab 3,55 EUR losgeht. Also auch vom Preis her nicht zu heftig. 
Zusammen mit so einer Adapterplatine auf DIL ist das auch gut zu 
gebrauchen auch ohne SMD gefummle.

Nicht desto trotz werde ich auch mit den AVRs noch rumprobieren. Auch 
wenn die in Zukunft vielleicht weniger verwendet werden, so hat man sie 
jedenfalls mal kennengelernt. Und sie haben auch bestimmt noch ihre 
Daseinsberechtigung, kann ich mir jedenfalls vorstellen.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Lothar schrieb:
> Peter Dannegger schrieb:
>> Wow, doch so viel Code.
>> Beim AVR (ATtiny13) sind es dagegen nur 4 Befehle.
>
> Auf dem 8051 auch :-) Trotzdem finde ich den ARM Assembler einfacher
> (und logischer). Zudem funktioniert alle Peripherie so, weil die
> Register von PWM, CAN usw. einfach in den 4GB Speicherraum eingeblendet
> sind.

Ja, das finde ich auch sehr positiv.
Von "PROGMEM" etc. fange ich gar nicht erst an.
Ist wohl schon zu lange her, dass ich mich darüber geärgert habe ;-)

> Alle (ausser mir) machen es auch in C :-)

Stimmt zumindest für mich :-)
Ich hatte in den letzten 13 Jahren geschwindigkeitsmäßig noch nie so 
einen Flaschenhals, dass ich wirklich Assembler einsetzen musste.

>> Du hast den Code für das Delay vergessen.
>
> delay
>         PUSH {R0}
>         MOV R0, #1
>         LSL R0, R0, #18         ; 2^18=262144 (was auch immer)
> count
>         SUBS R0, R0, #1
>         BNE count               ; <>0
>         POP {R0}
>         MOV R15, R14            ; PC=LR (return)
>
>> Braucht man sonst noch irgendwelchen Startup Code?
>
> Das läuft ohne Startup Code mit dem internen Oszillator (beim M4 meist
> 4MHz) und ohne Stromsparfunktionen. Beim externen Oszillator (100MHz
> oder mehr) nimmt man besser die CMSIS Funktion (PLL-Monster).

Unfassbar - der macht das wirklich! ;-)

Chris D.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mike schrieb:

> AVR (8Bit):
> + Einfach (für Einsteiger)
> + freie Compiler Toolchain (AVR-GCC: Eclipse mit Plugin oder AVR-Studio)
> o Peripherie/Schnitstellen
> - Speed/Rechenleistung (falls das wichtig ist)

Nur, weil's noch keiner erwähnt hat:

+ 5-V-fähig (außer Xmega)

Lothar schrieb:
> - kompatibel (Code für M0 läuft auf M3 läuft auf M4)

Hast du innerhalb der AVR-Linie auch, interessiert aber im Zeitalter
von Compilern kein Schwein.

von F. F. (foldi)


Lesenswert?

Chris D. schrieb:
> Sehr günstig für reine Adapterboards (auch vom Versand her!) ist dieser
> hier:
>
> http://shop.anvilex.de/
>
> Da lohnt das Runterlöten nicht mehr ;-)
>
> Chris D.

Boah! Das ist günstig. In die Favoriten damit.:-)
Danke Chris!

von Artjomka (Gast)


Lesenswert?

ADR R1, FIO1DIR
LDR R1, [R1]
STR R0, [R1]

Sicher, dass das LDR da so rein gehört?

von Peter D. (peda)


Lesenswert?

Lothar schrieb:
> Trotzdem finde ich den ARM Assembler einfacher
> (und logischer).

Wie schafft es der ADR-Befehl, eine 32Bit-Adresse mit nur einem 
32Bit-Befehl in ein Register zu schreiben. Was ist der Trick?

FIO1DIR und FIO1PIN müßten doch nahebei sein. Könnte man nicht ein 
Displacement beim LDR angeben, anstatt die Adresse neu zu laden?

von Lothar (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Hast du innerhalb der AVR-Linie auch

mega <> xmega <> mega32 kompatibel ??

von gewagt (Gast)


Lesenswert?

> Wo seht ihr Bereiche in denen ARMs den AVRs den Rang ablaufen könnte?

Überrall. AVRs wird es bald nur noch im Museum oder als Restbestände 
geben.

von Lothar (Gast)


Lesenswert?

Artjomka schrieb:
> ADR R1, FIO1DIR
> LDR R1, [R1]
> STR R0, [R1]
>
> Sicher, dass das LDR da so rein gehört?

FIO1DIR ist die Speicherstelle in der die Addresse vom FIO1DIR als 
Integer definiert ist. Man könnte die Adresse auch direkt in R1 
schreiben, die ist aber 32-bit und müsste als zwei Halbwörter geladen 
werden. Ausserdem muss der geneigte Leser dann erst im Manual nachsehen, 
was diese Addresse sein soll.

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:
> Wie schafft es der ADR-Befehl, eine 32Bit-Adresse mit nur einem
> 32Bit-Befehl in ein Register zu schreiben. Was ist der Trick?

Mit ADR kann man m.W. nur Code-Adressen laden, keine I/O-Adressen. Hier 
angebracht wäre beispielsweise
  LDR R1,=FIO1DIR
um die Adresse des I/O-Registers aus dem constant pool PC-relativ zu 
laden. In Thumb2 kann man auch 32-Bit Konstanten inline laden, benötigt 
dafür aber 2 32-Bit Befehle, die der Assembler aus dem Pseudobefehl 
MOV32 generiert.

> FIO1DIR und FIO1PIN müßten doch nahebei sein. Könnte man nicht ein
> Displacement beim LDR angeben, anstatt die Adresse neu zu laden?

Kann man. Man läd einmal den Anfang vom I/O-Modul und arbeitet dann 
relativ dazu.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lothar schrieb:
> Jörg Wunsch schrieb:
>> Hast du innerhalb der AVR-Linie auch
>
> mega <> xmega <> mega32 kompatibel ??

Was soll "mega32" dabei sein?  Ein AVR32?  Nein, das ist was komplett
anderes, aber in jeglicher Hinsicht.  Um den ging's aber in der
ganzen Diskussion auch nicht (und ich würde ihn da auch nicht ins
Spiel bringen).

tinyAVR -> megaAVR -> Xmega sind aufwärtskompatibel, das entspricht
ungefähr deiner Argumentation mit CM0 -> CM3 -> CM4.

Wie schon geschrieben, interessiert das alles in der Praxis keine
Sau.

Bezüglich der Peripherie unterscheiden sich die ARMs verschwiedener
Hersteller extrem, da ist man ohnehin nur jeweils (einigermaßen)
kompatibel, solange man bei einem Hersteller bleibt. (*)  In dieser
Hinsicht ist dann beim AVR(8) auch ein Bruch von megaAVR nach Xmega.

(*) Lediglich die systemnahen Basisblöcke sind beim Cortex-Mx nun
(endlich) einigermaßen genormt, also SYSCLK, Interruptcontroller
und dergleichen.  Vor Cortex-M gab's auch hier riesige Unterschiede
zwischen den einzelnen ARM-Herstellern.

von Lothar (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Wie schafft es der ADR-Befehl, eine 32Bit-Adresse mit nur einem
> 32Bit-Befehl in ein Register zu schreiben. Was ist der Trick?

Gar nicht. FIO1DIR ist die Speicherstelle in der die Addresse vom 
FIO1DIR als Integer definiert ist. Ausserdem ist ADR kein Befehl, da 
macht der Assembler auch ein LDR draus.

> FIO1DIR und FIO1PIN müßten doch nahebei sein. Könnte man nicht ein
> Displacement beim LDR angeben, anstatt die Adresse neu zu laden?

Völlig richtig! An das Displacement könnte ich mich aber in 1 Jahr nicht 
mehr erinnern. Ausserdem kann beim Wechsel von einem M3 auf einen M4 das 
Displacement auch anders sein.

von (prx) A. K. (prx)


Lesenswert?

Lothar schrieb:
> Gar nicht. FIO1DIR ist die Speicherstelle in der die Addresse vom
> FIO1DIR als Integer definiert ist. Ausserdem ist ADR kein Befehl, da
> macht der Assembler auch ein LDR draus.

Steht das irgendwo? Alles was ich finde besagt, dass er ein ADD oder SUB 
basierend auf dem PC daraus macht. Weshalb der davon abgedeckte Bereich 
effektiv auf den umliegenden Code beschränkt ist.

von Martin B. (gonative)


Lesenswert?

Ist es richtig, dass ich mit meinem STM32F4 Discovery Board auch anderen 
einzelne CortexM4 programmieren kann und gar keine extra 
Programminghardware brauche?

von (prx) A. K. (prx)


Lesenswert?

Lothar schrieb:
> Völlig richtig! An das Displacement könnte ich mich aber in 1 Jahr nicht
> mehr erinnern. Ausserdem kann beim Wechsel von einem M3 auf einen M4 das
> Displacement auch anders sein.

Lass den Assembler das ausrechnen. Sinngemäss:
   LDR R0, =FIO1BASE
   ...
   LDR R1, [R0, #FIO1DIR-FIO1BASE]
   STR R2, [R0, #FIO1PIN-FIO1BASE]
Die I/O-Module sind üblicherweise <= 4K gross, so dass sie von ARM 
Displacements abgedeckt werden können.

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Martin Bauer schrieb:
> Ist es richtig, dass ich mit meinem STM32F4 Discovery Board auch anderen
> einzelne CortexM4 programmieren kann und gar keine extra
> Programminghardware brauche?

Ja, das geht - der ST-Link ist auf den Boards eigenständig mit 
herausgeführten Pins.

Übrigens kann man alle STM32 auch direkt über die seriellen 
Schnittstellen (CAN, USART, USB) programmieren. Dazu erhält jeder STM32 
während der Produktion entsprechenden Code mit auf den Weg, so dass man 
über das entsprechende Protokoll arbeiten kann.
Der Code liegt in einem geschützten Bereich und kann später nicht mehr 
gelöscht werden, so dass man auf jeden Fall einen STM32 reaktivieren 
kann (es ist also kein "Verfusen" mehr möglich).

Um diesen Code zu aktivieren, gibt es die BOOT0- und BOOT1-Pins.

Näheres dazu findet sich in der AN-2606 von ST:

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf

Das ist sicherlich später in der Produktion interessant, da eine dieser 
Schnittstellen wohl verwendet wird. Ansonsten reichen dann zur 
Programmierung drei Pins.

Ich muss aber gestehen, dass ich das noch nie gemacht habe - bisher 
arbeiten wir mit dem Discovery-Board zum F4 und der schönen Erweiterung 
von wvshare.com

Chris D.

von (prx) A. K. (prx)


Lesenswert?

Lothar schrieb:
> Man könnte die Adresse auch direkt in R1
> schreiben, die ist aber 32-bit und müsste als zwei Halbwörter geladen
> werden. Ausserdem muss der geneigte Leser dann erst im Manual nachsehen,
> was diese Addresse sein soll.

Auch das kann der Assembler selber:
   MOV32 R1, #FIO1BASE

von Martin B. (gonative)


Lesenswert?

@Chris D.:
Schon nicht schlecht und es wird immer besser.

von Gregor B. (Gast)


Lesenswert?

NXP macht das mit den Controllern mit USB LPC11U2x und LPC11U3x und bei 
den Controllern LPC1342/43 so, dass man die so konfigurieren kann, dass 
sie sich als Massenspeicher auf dem PC melden.
Datei auf den Controller draufschieben (wie bei einem Memory-Stick), 
Controller programmiert...

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Das ist natürlich auch eine feine Sache - ob und wie sich die STM32 
direkt per Massenspeicher ansprechen lassen, ist mir leider nicht 
bekannt.

von Sebastian W. (sebastian_w29)


Lesenswert?

Teensy 3.0 ist auch ein feines Cortex-Spielzeug fürs Breadboard -- und 
Paul ist sehr hilfsbereit.

Hab mal damit einen Logikanalysator zusammengefrickelt. Hab 13MHz 8-bit 
Samplingrate ins RAM (16kB) erreicht! Wollte die Daten dann per DMA 
sammeln, RLE-enkodieren und über USB streamen. Bin dann zwar erst in 
einen Freescale DMA bug und dann in Probleme mit dem Streamingmodus des 
Open Logic Sniffer Protokolls gelaufen. Ich habs dann sein gelassen aber 
doch dabei wieder einiges gelernt.

Das Fazit von Mike im dritten Artikel dieses Threads kann ich so auch 
unterschreiben.

LG, Sebastian

von hal9001 (Gast)


Lesenswert?

Frank O. schrieb:
> Zum Einstieg mit nem Cortex M4? Uff! Das ist aber ne harte Droge.

So schlimm ist das auch nicht. Ich würde heute niemanden Raten
sich nicht mit ARM zu beschäftigen. Die werden alles kanibalisieren.
Ich sehe das bei uns in der Firma, da wird nix mehr anderes eingesetzt.

von c-hater (Gast)


Lesenswert?

Lothar schrieb:

> Wer das einfacher zu programmieren nicht glaubt :-) hier mal das Blinken
> einer LED an einem M4 am Pin 1_25 in Assembler (ok in C sind es nur 4
> Zeilen):
>
>         MOV R0, #1
>         LSL R0, R0, #25         ; R0=bit_25

Was zum Teufel ist denn das für ein 32Bit-Prozessor, der nicht mal einen 
32Bit-Wert "immediate" laden kann? Oder stellt obige Codesequenz eine 
Optimierung dar?

Hmm. Operationen mit zwei Quellen und einem Ziel sind außerdem auch 
etwas gewöhnungsbedürftig. Nunja, wenn die wenigstens in jeder 
sinnvollen Kombination und bei jeder Operation mit zwei denkbaren 
Quellen möglich sind, könnte man sich daran sicher gewöhnen. Aber 
vermutlich trifft genau das nicht zu, wäre ja sonst zu einfach...

>         ADR R1, FIO1DIR
>         LDR R1, [R1]            ; R1=&FIO1DIR

Ah, ja. Scheint also doch zu geben, was ich oben vermißt habe. 
Allerdings bescheuertes Mnemnonik. ADR statt LD/LDI ist zumindest 
erkärungsbedürftig. Wahrscheinlich was ähnlich sinnvolles wie etwa 
"LEA", worauf nur Hochsprachenprogrammierer kommen würden, denen 
irgendwelches Flausen über die Besonderheiten von "pointern" im 
Hinterkopf rumgaukeln und die nicht begreifen, daß das letztlich auch 
einfach bloß Ganzzahlen sind...

>         STR R0, [R1]            ; FIO1DIR_bit.P1_25 = 1 (output)

Aha, damit wäre die Frage nach getrennten Adreßräumen für IO und 
Speicher auch beantwortet. Ham wa nich->memory mapped IO. Letzlich egal, 
muß man eben einfach nur wissen.

Ingesamt: Ich habe auch schon lange darüber nachgedacht, auf ARM zwar 
nicht vollständig zu wechseln, aber sie zumindest zusätzlich "ins 
Programm aufzunehmen" für die Sachen, wo die AVR wirklich nicht mehr 
reichen. An den Assembler könnte ich mich sicher gewöhnen, der 
Befehlssatz scheint einigermaßen orthogonal zu sein.

Aber es bleiben viele andere Hürden für schnelle Basteleien. 
Insbesondere Gehäusebauformen und Spannungsversorgung nerven. Einen AVR 
kaufe ich als DIL, löte ihn, eine Buchse für ISP und eine für ein 5V 
oder 3.3V-Standardnetzteil auf eine Streifenleiterplatte und kann dann 
sofort anfangen, was sinnvolles drumrum zu löten und zu programmieren. 
Das geht mit der ARM-Plattform alles längst nicht so einfach. Das hat 
mich bisher davon abgehalten, die angedachte "Programmerweiterung" auch 
tatsächlich zu vollziehen.

Das und die Tatsache, daß es bisher kein Projekt gab, wofür ein AVR 
(+ggf. CPLD) wirklich nicht gereicht hätten. Es wird allerdings 
zunehmend eng. Über kurz oder lang werde ich wohl müssen. Es sei denn, 
Atmel bringt AVR mit wesentlich mehr RAM und Takt auf den Markt. Damit 
ist allerdings wohl kaum zu rechnen...

von (prx) A. K. (prx)


Lesenswert?

c-hater schrieb:
> Was zum Teufel ist denn das für ein 32Bit-Prozessor, der nicht mal einen
> 32Bit-Wert "immediate" laden kann?

Erklär mir mal, wie ein Prozessor mit feste Befehlslänge von 32 Bits 
darin eine 32-Bit Konstante unterbringen soll.

Soll heissen: Das hat diese Art Prozessoren so an sich. Das gilt ebenso 
für PowerPC, SPARC und MIPS und ein diverse verblichene.

> Allerdings bescheuertes Mnemnonik. ADR statt LD/LDI ist zumindest
> erkärungsbedürftig.

Wenn es denn stimmen würde.

> Aha, damit wäre die Frage nach getrennten Adreßräumen für IO und
> Speicher auch beantwortet. Ham wa nich->memory mapped IO.

Ein separater I/O-Adressraum findet sich bei 32-Bittern allenfalls aus 
historischen Gründen.

> An den Assembler könnte ich mich sicher gewöhnen, der
> Befehlssatz scheint einigermaßen orthogonal zu sein.

Für gewöhnlich programmiert man die in C. Dann kanns ziemlich egal sein, 
wenn man nicht grad einen Compiler dafür schreibt.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

c-hater schrieb:
> Was zum Teufel ist denn das für ein 32Bit-Prozessor, der nicht mal einen
> 32Bit-Wert "immediate" laden kann? Oder stellt obige Codesequenz eine
> Optimierung dar?

Ähm, beim ARM is jeder Befehl (außer im Thumb Mode) 32 bit breit, wie 
willsten da nen 32bit immediate reinbekommen?
Nen Befehle und danach nen immediate im Flash macht das Befehldecodieren 
wieder komplex.

c-hater schrieb:
> Hmm. Operationen mit zwei Quellen und einem Ziel sind außerdem auch
> etwas gewöhnungsbedürftig. Nunja, wenn die wenigstens in jeder
> sinnvollen Kombination und bei jeder Operation mit zwei denkbaren
> Quellen möglich sind

Load and Store Architektur eben.
2 Register als Quelle, ab in die Alu und wieder zurück in ein Register.
ADD R0, R0, R0 ;)
Weis jetz aber auch nich was daran so gewöhnungsbedürftig is, ich würd 
eher an ner CPU mit accumulator ne Meise kriegen.

Und jetz mal der ARM Knallerbefehl für dich ;)
STMFD SP!, {R0-R12, LR}
Macht nix weiter als die Register aufn Stack zu kloppen.

von (prx) A. K. (prx)


Lesenswert?

c-hater schrieb:
> An den Assembler könnte ich mich sicher gewöhnen, der
> Befehlssatz scheint einigermaßen orthogonal zu sein.

Ist was für Knobler, weil man durch die ungewöhnliche Art, einen 
Barrel-Shifter in den Dataflow einzubauen, Dinge in einem Befehl machen 
kann, wofür andere 2 brauchen. Das gilt auch für die bedingte Ausführung 
aller Befehle.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> An den Assembler könnte ich mich sicher gewöhnen, der
> Befehlssatz scheint einigermaßen orthogonal zu sein.

Wenn du einen orthogonalen Befehlssatz suchst, dann programmier'
eine PDP-11.  Dort waren selbst Stackpointer und PC eigentlich nur
normale Register.  Damit man damit einen Stack aufbauen kann oder
Befehle lesen, brauchte man halt sowas wie @R7+ oder @-R6.  Damit
man die Vorteile derartiger Befehle auch in einer Hochsprache
nutzen kann, hat C die Operatoren ++ und -- erfunden, und aus
ebendiesem Grunde findest du in alten C-Quellen praktisch nur
die Varianten *p++ und *--p.  Die passten nämlich direkt auf die
Hardware.  Die Pendants *++p oder *p-- hätten deutlich mehr an
Assemblercode benötigt.

von Svenska (Gast)


Lesenswert?

> Von "PROGMEM" etc. fange ich gar nicht erst an.
> Ist wohl schon zu lange her, dass ich mich darüber geärgert habe ;-)

Nimm einen modernen GCC und deklariere die Variable als "__flash". Den 
Rest macht der Compiler für dich. Kein #include, kein pgm_read_xxx() 
mehr.

von Lothar (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Dort waren selbst Stackpointer und PC eigentlich nur
> normale Register.

Beim ARM sind Stackpointer und PC normale Register :-)

R13=SP
R14=LR (Rücksprungaddresse der letzten Prozedur)
R15=PC

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lothar schrieb:
> Jörg Wunsch schrieb:
>> Dort waren selbst Stackpointer und PC eigentlich nur
>> normale Register.
>
> Beim ARM sind Stackpointer und PC normale Register :-)

Bei der PDP-11 auch, R6 und R7.  Trotzdem ist der ARM nicht so extrem
orthogonal wie die PDP, was natürlich auch damit zusammenhängt, dass
die PDP insgesamt viel weniger konnte.  Das wenige konnte sie dafür
in allen möglichen Kombinationen gleichermaßen.

von (prx) A. K. (prx)


Lesenswert?

Lothar schrieb:
> Beim ARM sind Stackpointer und PC normale Register :-)

Vor ARMv3 war war sogar das Statusregister ein normales Register, 
nämlich ein Teil vom R15.

Auch beim MSP430 sind PC, SP und Statusregister normale Register. Wie 
überhaupt die MSP430 ISA grosse Ähnlichkeit mit der PDP-11 hat.

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.