Forum: Mikrocontroller und Digitale Elektronik alle möglichen Fragen zu µCs


von MC (Gast)


Lesenswert?

Tag an alle,
ich habe gerade etwas langeweile und durchstöber mal das Internet nach 
allem möglichen zu µCs.
Dabei sind mir einige Fragen gekommen:
- Welche heute gängigen 8Bit µC-Familien gibt es?
  Ich habe "nur" die 8051er, PICs und AVRs gefunden
- zu den PICs: Ist es möglich, externen Speicher anzuschließen?
- zu den AVRs: Ich programmiere gerne rekursiv und nutze dafür beim 8051
  auch gerne Pointer, die incrementiert bzw. drecrementiert werden.
  Das klappt auch ganz gut, da der 8051 ja mind. 9Pointer hat.
  Wie macht man sowas beim AVR mit "nur" drei Pointern oder beim PIC?
Im Netz hab ich trotz langer Suche nichts weiter gefunden.

Danke schonmal für eure Hilfe, meine Langeweile zu tilgen,
MC

von Walter (Gast)


Lesenswert?

>Wie macht man sowas beim AVR mit "nur" drei Pointern oder beim PIC?
man hat doch soviele Pointer wie ins RAM passen, also deutlich mehr als 
drei

von Simon S. (herrbert)


Lesenswert?

zur 2: Eigentlich kannst du an alles was frei programmierbar ist 
externen speicher anschließen.

zu 3: Was meinst du mit Pointern? imho so viel wie der speicher fasst? 
bei rekursiver programmierung ist doch ehr der Stack ausschlaggebend?? 
Genau weiß ichs net aber der fasst bestimmt 8 Adressen, ehr mehr.

EDIT2: Aus dem datenblatt:
During interrupts and subroutine calls, the return address Program 
Counter (PC) is stored on the
Stack. The Stack is effectively allocated in the general data SRAM, and 
consequently the Stack
size is only limited by the total SRAM size and the usage of the SRAM.

von MC (Gast)


Lesenswert?

>man hat doch soviele Pointer wie ins RAM passen
Ich kenn mich mit den AVRs zwar nicht so gut aus, aber ich dachte, der 
hat nur die drei Pointer X,Y,Z.

>bei rekursiver programmierung ist doch ehr der Stack ausschlaggebend??
Ich hab mich verschrieben. Ich meinte nicht rekursiv. Das wäre ja 
selbstaufrufend. Ich programmiere gerne in Schleifen, wo z.B. mehrere 
Speicehrstellen sortiert werden. Anstatt eine lange Abfrage aller 
Speicherstellen zu machen, lade ich mir zwei Pointer und frage diese in 
einer Schleife ab. Am Ende der Schleife wird jeder Pointer auf die 
nächsten Stellen gesetzt und die Schleife läuft aufs neue durch...

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

MC wrote:

> - zu den AVRs: Ich programmiere gerne rekursiv und nutze dafür beim 8051
>   auch gerne Pointer, die incrementiert bzw. drecrementiert werden.

Von rekursive Algorithmen auf Mikrocontrollern mit einem entsprechend 
kleinen Stack ist wohl eher abzuraten, vor allem wenn eine hohe 
Rekursionstiefe zu erwarten ist. Dann lieber den geschlossenen Ansatz 
waehlen.

von MC (Gast)


Lesenswert?

@Michael G.:
Danke für deinen Rat, ich hatte mich lediglich verschrieben. Ich meinte 
etwas anderes (siehe oben). Natürlich werde ich auf einem µC keine 
rekursiven Programme laufen lassen.

von Spess53 (Gast)


Lesenswert?

Hi

>Ich programmiere gerne in Schleifen, wo z.B. mehrere
>Speicehrstellen sortiert werden.

Und was machst du, wenn das in einem Programm überhaupt nicht notwendig 
ist?
Seit wann ist es relevant, was der Programmierer gern programmiert?

MfG Spess

von Andreas K. (a-k)


Lesenswert?

MC wrote:

> Ich kenn mich mit den AVRs zwar nicht so gut aus, aber ich dachte, der
> hat nur die drei Pointer X,Y,Z.

Klar, manchmal kann man mehr Pointer brauchen als die 3. Insgesamt ist 
das aber nicht schlecht. Man hat 32 Register, und einen Befehl, der 16 
Bit zwischen den Register transportiert.

Welche sind denn die 9 Pointer vom 8051? Für 8bit Adressen kommen mir 2 
in den Sinn (R0,R1), für 16bit Adressen regulär einer (2-3 in manchen 
Derivaten). Auf 9 komme ich da eigentlich nur, wenn ich die R0+R1 aller 
4 Registersätze zusammenaddiere, was sich IMHO nur für's Fälschen der 
Statistik eignet.

von Peter D. (peda)


Lesenswert?

MC wrote:
> Ich programmiere gerne in Schleifen, wo z.B. mehrere
> Speicehrstellen sortiert werden. Anstatt eine lange Abfrage aller
> Speicherstellen zu machen, lade ich mir zwei Pointer und frage diese in
> einer Schleife ab.

Du brauchst also nur 2 Pointer gleichzeitig, d.h. von den dreien ist 
sogar noch einer übrig.

Und mit MOVW kannst Du bequem ein anderes Registerpaar in die Pointer 
laden.


Peter

von MC (Gast)


Lesenswert?

Das war doch nur ein Beispiel. Wenn es nicht erforderlich ist, z.B. zig 
Werte zu sortieren, dann mach ich das doch auch nicht.

>Seit wann ist es relevant, was der Programmierer gern programmiert?
Ich finde, dass ein Hobby-Programmierer sich nicht nach irgendwelchen 
Richtlinien, Standards oder dergleichen zu richten hat. Er kann doch so 
programmieren, wie er will, oder nicht? Und dementsprechend kann er sich 
seine Plattform zum prgorammieren doch auch aussuchen/zurechtschustern.

von Andreas K. (a-k)


Lesenswert?

Eine Familie, die nicht ganz so gängig aber doch einigermassen verfügbar 
ist, und dir vielleicht gefallen könnte: Zilog Z8 Encore. Hat 256 
Pointer für kurze und 128 Pointer für lange Adressen.

Bei deiner Vorliebe für Pointer würde ich um die PICs in ihrer 8 Bit 
Ausprägung einen Bogen machen. Könnte ein Kulturschock werden ;-).

von MC (Gast)


Lesenswert?

>Du brauchst also nur 2 Pointer gleichzeitig, d.h. von den dreien ist
>sogar noch einer übrig.
In meinem Beispiel schon. Ich denke mal wieder zu viel. Ihr kennt 
natürlich nicht meine Programme. Also, ein Beispiel:
Ich habe einen 8Kanal Dimmer mit Fading und Soft-PWM. Für das Fading 
frage ich in einer Schleife über zwei Pointer den SOLL und den IST-Wert 
ab und gleiche diese stückweise aneinander an. In der gleichen Schleife 
frage ich ab, ob der momentane IST-Wert auf einem extra Stapelspeicher 
für den Soft-PWM schon vorhanden ist. Das geschiet wieder über zwei 
Pointer. Wenn dass alles fertig ist, sortiere ich die für den Soft-PWM 
abgelegten Werte noch der Größe nach. Das mache ich deshalb, weil dann 
der Soft-PWM sich den nächsten Auslösepunkt berechnen kann.

>Und mit MOVW kannst Du bequem ein anderes Registerpaar in die Pointer
>laden.
Das würde bedeuten, wenn ich ausschließlich mit Pointern in R0 bis R31 
arbeite, könnte ich 14 16Bit Pointer realiseren (X,Y,Z würden dann ja an 
sich wegfallen, da dort ja immer andere Pointer reingeladen werden).

von Andreas K. (a-k)


Lesenswert?

Externen Speicher kann man immer anschliessen, wenn die Pins reichen. 
Wenn du damit allerdings meinst, externes RAM so anschliessen zu können, 
dass er direkt als Datenspeicher adressiert werden kann: viele der PICs 
haben schon ziemliche Mühe, auch nur den internen Speicher halbwegs 
erträglich adressieren zu können.

von MC (Gast)


Lesenswert?

>Zilog Z8 Encore
Danke für den Tip. Werd ich mir mal ansehen.

>Könnte ein Kulturschock werden ;-)
Hab mir die mal grob in nem tutorial zu Gemüte geführt. Ich glaub die 
wären erst ab den dsPICs interessant. Aber das ist noch nicht mein 
Anforderungsbereich.

von Peter D. (peda)


Lesenswert?

Andreas Kaiser wrote:
> Welche sind denn die 9 Pointer vom 8051? Für 8bit Adressen kommen mir 2
> in den Sinn (R0,R1), für 16bit Adressen regulär einer (2-3 in manchen
> Derivaten). Auf 9 komme ich da eigentlich nur, wenn ich die R0+R1 aller
> 4 Registersätze zusammenaddiere, was sich IMHO nur für's Fälschen der
> Statistik eignet.

Nö, fälschen tut man da nichts.
Die 8051 haben oft nur 256 Byte internes SRAM, da reichen 8Bit-Pointer 
aus. Z.B. habe ich mal dem I2C-Interrupt und dem UART-Interrupt eigene 
Registerbänke zugewiesen und damit hatten sie ihre eigenen FIFO-Pointer 
ohne Register umladen zu müssen. Ich hatte also 6 Datenpointer benutzt.

Die 8051 mit zusätzlichen XRAM haben 2..8 XRAM-Pointer, was aber nicht 
so der Brüller ist, da sie alle als DPTR benutzt werden müssen. Man muß 
also mit DPTR-Select dazwischen umschalten.


Nützlich sind beim 8051 auch die 2 Codepointer. In Interrupts ist der 
Tabellenzugriff mit PC als Basisadresse schön codesparend.


Peter

von Andreas K. (a-k)


Lesenswert?

Peter Dannegger wrote:

> aus. Z.B. habe ich mal dem I2C-Interrupt und dem UART-Interrupt eigene
> Registerbänke zugewiesen und damit hatten sie ihre eigenen FIFO-Pointer
> ohne Register umladen zu müssen. Ich hatte also 6 Datenpointer benutzt.

Ok, wenn man Interrupts mitrechnet, dann akzeptiere ich diese 
Kalkulation. Das ist definitiv ein Schwachpunkt der bisherigen AVRs. 
Allerdings hatte ich den Eindruck, dass der Fragesteller die alle im 
Hauptprogramm verwenden will. Und da kommt mir diese Rechnung etwas 
seltsam vor.

Umschaltbare DPTRs sind freilich nicht viel einfacher als hin- und 
hertransportierte AVR Register.

von MC (Gast)


Lesenswert?

>dass der Fragesteller die alle im
>Hauptprogramm verwenden will
Nein, eben nicht. Da habe ich mich falsch ausgedrückt. Ich benutze im 
Hauptprogramm momentan einen Pointer (könnten auch zwei o. Drei sein, 
bin mir da im momment nicht ganz sicher). In der ISR des INT0 benutze 
ich vier Pointer und in der ISR des Timer0 nochmal einen Pointer.
Die will ich nicht alle durch push und pop sichern, also wechsle ich 
immer die Registerbänke.
Und weil mir mal langweilig war, wollte ich mal wissen, wie das anderswo 
abläuft.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

MC wrote:
>>dass der Fragesteller die alle im
>>Hauptprogramm verwenden will
> Nein, eben nicht. Da habe ich mich falsch ausgedrückt.

Drueck Dich mal richtig aus... ;)

von MC (Gast)


Lesenswert?

Wird gemacht, CHEF!-]

von Andreas K. (a-k)


Lesenswert?

MC wrote:

> Die will ich nicht alle durch push und pop sichern, also wechsle ich
> immer die Registerbänke.

Dann wird dir Z8e liegen. Soviel Registerbänke à 16 Register wie RAM 
vorhanden ist, und ein priorisierter Interrupt Controller.

von MC (Gast)


Lesenswert?

Hab mir bei Zilog den Z8e mal angesehen. Das ist ja doch gar nicht so 
schlecht, Herr Specht! Aber ich glaube, ich würde nur die "großen" 
Z86x4... nehmen, da die auch externen Speicher adressieren können (auch 
über die vieeelen internen Pointer;-).
Aber weiß jemand, wo ich die bekommen kann? Angelika hat nur die 
kleineren Varianten.

von Andreas K. (a-k)


Lesenswert?

rscomponents

Wusste garnicht, dass R überhaupt welche hat. Die paar die dort unter 
Zilog als Z8 drinstehen sind die alten Z8 und OTP, d.h. kein Flash-ROM.

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich glaub hier stimmt so einiges nicht. Nur weil der AVR 3 Indexregister 
hat,  heißt das nicht, dass man unter C nur 3 Variablen mit Pointern 
anlegen kann. Pointer sind ganz normale Variablen, die im Falle des AVRs 
16 Bit breit sind. Sie können genau so im RAM liegen, wie Integer oder 
Floats. Die Indexregister sind nur wichtig, wenn man auf Arrays 
zugreifen will. Und wenn du nur ein Array von A nach B kopieren willst, 
reichen 2 Indexregister völlig aus.

von Simon K. (simon) Benutzerseite


Lesenswert?

Simon S. wrote:
> zur 2: Eigentlich kannst du an alles was frei programmierbar ist
> externen speicher anschließen.

Das stimmt so nicht ganz. Prinzipiell kann man überall externen Speicher 
anschließen. Aber bei Prozessoren ohne herausgeführtes Speicherinterface 
muss man selbiges über normale I/O Pins realisieren.
Das hat 1. den Nachteil dass es oft langsamer ist, als würde es direkt 
vom Prozessor adressiert werden und 2. kann der Speicher nicht in den 
regulären (vorhandenen) Adressraum eingeblendet werden. Taugt also somit 
nicht wirklich zur Programmierung unter C (ohne Krücken).

von Simon K. (simon) Benutzerseite


Lesenswert?

MC wrote:
>>Und mit MOVW kannst Du bequem ein anderes Registerpaar in die Pointer
>>laden.
> Das würde bedeuten, wenn ich ausschließlich mit Pointern in R0 bis R31
> arbeite, könnte ich 14 16Bit Pointer realiseren (X,Y,Z würden dann ja an
> sich wegfallen, da dort ja immer andere Pointer reingeladen werden).

Quark. Du kannst so viele Pointer im RAM halten, wie du möchtest. Nur in 
dem Moment, wo du den Pointer dereferenzieren willst, MUSS(!) der 
Pointer im X,Y,Z Register liegen, damit der Prozessor auch eben diese 
Dereferenzierung durchgeführt werden kann. Ansonsten ist es völlig Wumpe 
wo der Pointer liegt.

von MC (Gast)


Lesenswert?

Ich kenn mich mit AVRs zwar nicht so aus, aber:
wie soll ich die denn da bitte reinbekommen? Das geht doch nur über den 
Umweg der 32 Register, oder nicht? Und was mache ich mit meinem evtl. 
schon vorhandenen Pointer, ohne den zu überschreiben? Den muss ich dann 
auch wieder sichern,....

von Walter (Gast)


Lesenswert?

ja, es geht den "Umweg" über die Register, aber ist das etwa ein 
Problem?
Wenn Du in C programmierst macht das der Compiler für dich, und wenn du 
in Assembler programmierst und dann mit 32 Pointern gleichzeitig 
arbeitest na denn Prost Mahlzeit, viel Spaß hätte ich damit nicht!

von Simon K. (simon) Benutzerseite


Lesenswert?

MC wrote:
> Ich kenn mich mit AVRs zwar nicht so aus, aber:
> wie soll ich die denn da bitte reinbekommen?
Wen willst du wo rein bekommen?

> Das geht doch nur über den
> Umweg der 32 Register, oder nicht?
Die Indexregister sind Teil der 32 Register! Jeweils zwei der 32 
Register ergibt das X, Y oder Z Register.

> Und was mache ich mit meinem evtl.
> schon vorhandenen Pointer, ohne den zu überschreiben? Den muss ich dann
> auch wieder sichern,....
Du siehst das irgendwie falsch. Die Pointer sind dauerhaft im RAM und 
werden in dem Moment, wo man sie dereferenziert (*, [] in C) in ein X, Y 
oder Z Register geladen.

Ansonsten könntest du ja genau so gut sagen "Was ist wenn ich 40 Stück 8 
Bit Integer habe. Die können ja gar nicht auf einmal in den Registern 
bleiben. Die müssen ja immer gesichert werden, wenn ein anderer der 40 
Werte in ein Register hereingeladen werden soll."

von Simon K. (simon) Benutzerseite


Lesenswert?

Walter wrote:
> ja, es geht den "Umweg" über die Register, aber ist das etwa ein
> Problem?
> Wenn Du in C programmierst macht das der Compiler für dich, und wenn du
> in Assembler programmierst und dann mit 32 Pointern gleichzeitig
> arbeitest na denn Prost Mahlzeit, viel Spaß hätte ich damit nicht!

Erzähl doch kein Unfug. Was für einen Umweg über Register? X, Y und Z 
sind Register!

von MC (Gast)


Lesenswert?

Ich glaube, das alles gleitet jetzt etwas aus der Spur.

von rrrrr (Gast)


Lesenswert?

Ich möchte mal einigen Vermutungen entgegentreten:

> viele der PICs haben schon ziemliche Mühe, auch nur den internen
> Speicher halbwegs erträglich adressieren zu können.

Aus welchem Jahr stammt Dein Wissen?? - Es ist bereits 2008, die Welt 
hat sich in den letzten Jahrzehnten verändert! (Schau Dir z.B. ruhig mal 
die PIC18Fxxxx an.)

> 2. kann der Speicher nicht in den regulären (vorhandenen) Adressraum
> eingeblendet werden.

Genau das geht mit vielen PICs.

von Andreas K. (a-k)


Lesenswert?

rrrrr wrote:

>> viele der PICs haben schon ziemliche Mühe, auch nur den internen
>> Speicher halbwegs erträglich adressieren zu können.
>
> (Schau Dir z.B. ruhig mal die PIC18Fxxxx an.)

Hab ich, ist mir bekannt. Drum steht da ja auch "viele der PICs".

Sonderlich begeistert bin ich von der Methode allerdings nicht, mit der 
Microchip das bei den PIC18 gedeichselt hat.

von MC (Gast)


Lesenswert?

Bitte nicht schlagen, ich versuche nur, eure Aussagen zusammenzufassen:
- der AVR besitzt drei 16Bit Pointer X,Y,Z innerhalb der 32 Register
- man kann mit movw in die jeweiligen Registerpaare andere der 32 
Register
  laden
- man kann die Pointer im RAM ablegen und dann immer in X,Y,Z kopieren

Habe ich das jetzt richig verstanden?

von Andreas K. (a-k)


Lesenswert?

Ja.

von Simon K. (simon) Benutzerseite


Lesenswert?

MC wrote:
> Bitte nicht schlagen, ich versuche nur, eure Aussagen zusammenzufassen:
> - der AVR besitzt drei 16Bit Pointer X,Y,Z innerhalb der 32 Register
> - man kann mit movw in die jeweiligen Registerpaare andere der 32
> Register
>   laden
> - man kann die Pointer im RAM ablegen und dann immer in X,Y,Z kopieren
>
> Habe ich das jetzt richig verstanden?

Um dich zu beruhigen. Sobald dein C-Programm etwas größer wird und du 
irgendwo (egal wo eigentlich) einen Pointer benutzt (also 
dereferenzierst), wird der Compiler genau das machen. Er wird den 
Pointer aus dem RAM holen und in in einem der Indexregister 
dereferenzieren. Das ist durchaus üblich und gängig.
Nur wenn der Compiler feststellt, dass eine lokale Variable eh ein 
Pointer ist und sonst nix anderes da ist, wird er die lokale Variable 
möglicherweise direkt in einem Indexregister "anlegen".
Bei globalen Pointern geht das nur, wenn das Indexregister sonst nicht 
gebraucht wird.
Beide Fälle sind eher selten (Fall 1 ist vielleicht realistisch).
Aber der Compiler wird da schon relativ schnell ans kopieren kommen.

von Andreas K. (a-k)


Lesenswert?

Simon K. wrote:

> Sobald dein C-Programm etwas größer wird

Wer solche Fragen stellt, der programmiert nicht in C sondern in 
Assembler.

von MC (Gast)


Lesenswert?

100 Punkte!!!!

von Simon K. (simon) Benutzerseite


Lesenswert?

Andreas Kaiser wrote:
> Simon K. wrote:
>
>> Sobald dein C-Programm etwas größer wird
>
> Wer solche Fragen stellt, der programmiert nicht in C sondern in
> Assembler.

Ahso ;) Durch das Wörtchen "Pointer" bin ich zuerst auf C gekommen.

von MC (Gast)


Lesenswert?

Ich bins nochmal.
Ich habe mir die eZ8 sowie die Z8Encore mal angesehen. Vorallem die 
Z8Encore Familie ist ja doch gar nicht so schlecht! Aber sehe ich das 
richtig, dass die Z8Encore Controller keinen ext. Datenspeicher 
adressieren können?

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.