mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega 128 langsam?


Autor: Frank T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier das Testboard STK500 in dem ich den Prozessor ATMEGA128 
mit 8Mhz laufen habe.

Nun dachte ich ich könnte mehrere RS232 Schnittstellen mit dem Prozessor 
über die normalen IO Pins durchschalten.

Eine Messung der IO Leistung gibt bei mir aber nur eine Frequenz von 
10kHz und das obwohl der Prozessor mit 8Mhz takten sollte (intern laut 
Fuse Bits)

Mit 10khz kann ich ja nichmal eine 38400Baud Schnittstelle übertragen?

Hat jemand ne idee ob das so nicht geht?

Bei einem 8Mhz Prozessor sollte doch eine Übertragung von ein paar 
Seriellen Schnittstellen kein Problem sein.

Ich messe am Porte.0

Hier mein Testprogramm mit Basecom:

$regfile = "m128def.dat"

' test Geschwindigkeit

Config Porta = Input
Config Portb = Input
Config Portc = Output
Config Portd = Output
Config Porte = Output

Dim In1 As Bit
Dim In2 As Bit
Dim In3 As Bit
Dim In4 As Bit
Dim In5 As Bit
Dim In6 As Bit
Dim In7 As Bit
Dim In8 As Bit
Dim In9 As Bit
Dim In10 As Bit
Dim In11 As Bit
Dim In12 As Bit
Dim In13 As Bit
Dim In14 As Bit
Dim In15 As Bit
Dim In16 As Bit

'Start Schleife
Do

' Eingang einlesen
In1 = Pina.0
In2 = Pina.1
In3 = Pina.2
In4 = Pina.3
In5 = Pina.4
In6 = Pina.5
In7 = Pina.6
In8 = Pina.7
In9 = Pinb.0
In10 = Pinb.1
In11 = Pinb.2
In12 = Pinb.3
In13 = Pinb.4
In14 = Pinb.5
In15 = Pinb.6
In16 = Pinb.7


'Werte ausgeben
Portc.0 = In1
Portc.1 = In2
Portc.2 = In3
Portc.3 = In4
Portc.4 = In5
Portc.5 = In6
Portc.6 = In7
Portc.7 = In8
Portd.0 = In9
Portd.1 = In10
Portd.2 = In11
Portd.3 = In12
Portd.4 = In13
Portd.5 = In14
Portd.6 = In15
Portd.7 = In16

Toggle Porte.0
Loop
End

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist BASIC, nicht wahr?  Keine Fragen mehr.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre vermutlich wesentlich schneller, wenn du nicht jedes Bit 
einzeln speichern und übertragen würdest.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
' Eingang einlesen
In1 = Pina.0
In2 = Pina.1
In3 = Pina.2
In4 = Pina.3
In5 = Pina.4
In6 = Pina.5
In7 = Pina.6
In8 = Pina.7
In9 = Pinb.0
In10 = Pinb.1
In11 = Pinb.2
In12 = Pinb.3
In13 = Pinb.4
In14 = Pinb.5
In15 = Pinb.6
In16 = Pinb.7


'Werte ausgeben
Portc.0 = In1
Portc.1 = In2
Portc.2 = In3
Portc.3 = In4
Portc.4 = In5
Portc.5 = In6
Portc.6 = In7
Portc.7 = In8
Portd.0 = In9
Portd.1 = In10
Portd.2 = In11
Portd.3 = In12
Portd.4 = In13
Portd.5 = In14
Portd.6 = In15
Portd.7 = In16


Nach was langsameres um einen 8-Bit Port komplett einzulesen ist dir 
nicht eingefallen?
  PortC = PinA;
  PortD = PinB;

> Eine Messung der IO Leistung gibt bei mir aber nur eine Frequenz
> von 10kHz und das obwohl der Prozessor mit 8Mhz takten sollte
> (intern laut Fuse Bits)

Auch ein Porsche fährt mit angezogener Handbremse nicht schneller als 
30.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaaaahhhhhhh, hilfe.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte die Bits in einem Array speichern um es NOCH langsamer zu 
machen.

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit Assembler.
Schliesslich rennt ein 100m Läufer auch nicht mit Sicherheitsschuhen für 
Waldarbeiter.

Gruß, Udo

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quatsch, Assembler. Selbest mit Basic ist da noch ein Faktor 20 drin.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, aber unabhängig von Basic oder nicht, ist eine Software-UART gar 
nicht so trivial, höhere Baudraten kann man da ohne Interrupts 
vergessen. Nicht umsonst gibt es Controller mit mehreren Hardware-Uarts.

Aber soweit ich weiß, hat Bascom dafür doch eine fertige Funktion. Was 
tut die denn, und was sagt die Doku zur max. Baudrate und der maximalen 
Anzahl?

Oliver

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich den TE richtig verstanden habe, möchte er Software-UARTs 
erstellen.  Ein Testprogramm, das bitweise liest und schreibt, scheint 
zur Abschätzung nicht völlig ungeeignet.  Ungeeignet erscheint mir das 
Tool, das er sich für den Job ausgesucht hat.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Na ja, aber unabhängig von Basic oder nicht, ist eine Software-UART gar
> nicht so trivial, höhere Baudraten kann man da ohne Interrupts
> vergessen. Nicht umsonst gibt es Controller mit mehreren Hardware-Uarts.

Es gaht ja gar nicht um eine Software UART.
Es geht einfach nur darum einen Eingangsport komplett auf einen 
Ausgangsport durchzuschalten. Was die Pegel bedeuten interessiert in 
diesem Beispiel nicht.

Wahrscheinlich wird er da jetzt noch eine Schaltfunktionalität 
hinzufügen wollen, mit der er einzelne Kanäle abschalten kann.
Interessant wird es auch, wenn er dann einen 'Kreuzschienenverteiler' 
machen will.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR ist nicht so der Bitschubser, d.h. bei Bitmanipulationen im SRAM 
siehts stockfinster aus.
Da mußt Du besser nen 8051 nehmen (z.B. AT89LP4052), der hat 128 
Bitvariablen (= 16 Byte) im SRAM.

Und Bascom dürfte gegenüber C oder Assembler nochmal nen ordentlichen 
Overhead haben.

Was soll das überhaupt werden?
Wenn man das weiß, gibts bestimmt auch deutlich effizientere Lösungen.


Peter

Autor: Frank T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wow hier ist ja was los.
So viele Antworten hatte ich nicht erwartet.

Für kleine Lösungen haben ich immer Basecom genommen.
Allerdings hatte ich bisher nichts zeitkritisches.

Komme halt vom Sinclair ZX81 und da war halt Basic drauf.

Es sollte eine RS232 Kreuzschiene werden.
8 x 8

Da habe ich mir gedacht das es bei 8 Mhz doch gehen müsste ohne großen 
Jitter.

Habe hier ein IC gefunden - vielleicht funktioniert so was besser.

http://www.analog.com/en/switchesmultiplexers/digi...

Autor: egal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm ein cpld

Autor: Anselm 68 (anselm68)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte möglichst keine Bitvariablen nehmen.
Um einzelne Bits einer Varible zu handeln kann man auch folgendes 
schreiben:
Bsp.:
dim in as byte  <- hier sind die Ports 8 Bit-Variablen
Portd.3 = in.4 <- Bit 4 der in-Variable

Selbstverständlich auch in 16Bit möglich....


Anselm


p.S.: Jeder deiner Bitvariablen wird intern als 8Bit behandelt, welch 
eine Verschwendung.

Autor: Anselm 68 (anselm68)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Btw.:
Kann ein XMega nicht DMA? Wenn ich es richtig weiss kann man da ohne den 
Prozessorkern zu belasten einen Port auf den anderen umleiten.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein AVR sollte eigentlich auch schnell genug sein.
Aber nicht, wenn man so wie oben einzelne Bits umschaufelt...das ist ja 
grausam.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei die Aufgabenstellung nicht uninteresant ist.
Wie macht man einen frei konfigurierbaren Kreuzschienenverteiler in 
Software, der auch noch möglichst schnell ist.

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8 Signale eines Ports auf 8 Signale eines anderen Ports beliebig 
abzubilden, braucht im günstigsten Fall der mir einfällt 19 Takte. Dazu 
müssen aber die Positionen als "1" Bits in verschiedenen Registern (z.B. 
r16-r23) bereitliegen:
    in     XL,inport      ;1
    clr    XH             ;1
    sbrc   XL,0           ;1/2
    or     XH,r16         ;1 Ausgangskonfiguration für Eingang 0
...
    sbrc   XL,7           ;1/2
    or     XH,r23         ;1 Ausgangskonfiguration für Eingang 7
    out    outport,XH     ;1

Mit Sprung wären das dann 21 Takte, das wären ungefähr 380KHz Abtastrate 
bei 8MHz Taktfrequenz.

Jörg

Autor: Frank T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So - nachdem sich viele aufgeregt habe das das einlesen besser mit Byte 
passieren soll habe ich ich mal ausprobiert.

Nun messe ich ca 20khz
Ist immerhin eine Verdopplung der IO Leistung.

' Eingang einlesen
In1 = Porta
In2 = Portb

'Werte ausgeben
Portc.0 = In1.0
Portc.1 = In1.1
Portc.2 = In1.2
Portc.3 = In1.3
Portc.4 = In1.4
Portc.5 = In1.5
Portc.6 = In1.6
Portc.7 = In1.7
Portd.0 = In2.0
Portd.1 = In2.1
Portd.2 = In2.2
Portd.3 = In2.3
Portd.4 = In2.4
Portd.5 = In2.5
Portd.6 = In2.6
Portd.7 = In2.7

'Messausgang für IO Leistung
Toggle Porte.0

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
ZX81 hatte ich auch mal und da ging es nur schnell, wenn man die Z80 
Hex-Codes in den Speicher "gepoked" hat. Assembler ist gar nicht so 
schwer.... und viel scheller wie Basic. Außerdem siehst du dann auch was 
du machst. Es wär dir aufgefallen, wie du die Bits einzeln auf den Port 
schreibst.
Gruß oldmax

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist am schnellsten mit ner Tabelle:

Jeder Ausgang hat 8 mögliche Eingänge, d.h. für 8 Ausgänge braucht man 
64 Tabellen a 256 Byte = 16kB.

Ein ATmega32P reicht dann.


Peter

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte man in Bascom nicht einfach

Portc = Pina

schreiben ? das kopiert 8 Bits auf einmal.

Kenne Bascom aber aber nicht, und die genaue Aufgabenstellung ist auch 
unklar.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doc schrieb:
> Könnte man in Bascom nicht einfach
>
> Portc = Pina
>
> schreiben ? das kopiert 8 Bits auf einmal.
>
> Kenne Bascom aber aber nicht, und die genaue Aufgabenstellung ist auch
> unklar.

Die genaue Aufgabenstellung lautet, dass während dieser Umkopieraktion 
die Bits auch noch systematisch umgeschaufelt werden müssen. Und das 
macht das ganze dann etwas komplexer, wenns schnell sein soll.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es geht einfach nur darum einen Eingangsport komplett auf einen
>Ausgangsport durchzuschalten.

In seinem Beispiel wird nur Port A nach Port C , und Port B nach Port D 
geschaufelt.

Also geht es ganz einfach Byteweise.

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:

allein bei einer 1:1 Zuordnung braucht es schon 40320 Bytes in der 
Tabelle (8*7*6*5*4*3*2*1).

Jörg

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für eine 8zu8-Zuordnung reicht doch eine Tabelle mit 256 Bytes. Diese 
müsste halt im RAM liegen und dann je nach gewünschter Zuordnung neu 
erstellt werden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Für eine 8zu8-Zuordnung reicht doch eine Tabelle mit 256 Bytes. Diese
> müsste halt im RAM liegen und dann je nach gewünschter Zuordnung neu
> erstellt werden.

Stimmt, die Tabelle muß im RAM liegen.

Dann ist die Durchlaufzeit:
loop:
     in yl, PINA
     ld yl, y
     out PORTB, yl
     rjmp loop
= 6 Zyklen = 666kHz bei 8MHz


Peter

Autor: Udo R. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg,
erlär mir mal bitte wie Du auf diese Lösung kommst???
Wenn es darum geht eine feste Verdrahtung dür jeden der 256 Inputwerte 
zu haben reicht die 256Byte Tabelle. Wenn allerdingsabhängig von 
unbekannten Faktoren abhängt wie die Zuordnung zu den Ausgangswerten 
sein soll, dann hängt es von der Anzahl an möglichen Kombinationen der 
Faktoren ab vieviel Platz du für dann n Tabellen benötigst.
Aber nochmal, wenn der OP vor 25? Jahren Basic gelernt hat, dann kann er 
sich doch nach so langer Zeit mal an was neues wagen. Nicht soviel Angst 
vor Assembler.
C plus die C Eigenarten bei Controllerprogrammierung ist meiner Meinung 
nach viel schwieriger, ausser man kann schon C perfekt.

Gruß, Udo

Autor: Frank T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es ist ja nur ein Testbeispiel.

Es sollten später jeder Eingang mit jedem Ausgang verbunden werden 
können.
Das würde ich schon hin bekommen - über Variablen.

Der Test sollte mir zeigen das ich keine Probleme bekomme und hat mir 
aber genau das Gegenteil gezeigt.

Nun habe ich hier mehrere Anregungen und bin noch am überlegen was ich 
als nächstes ausprobiere.

Basecom und ATmega128 scheint nicht schnell genug zu sein.

1. Ich bleibe beim ATmega und versuche mich in Assembler
380KHz Abtastrate wie einer genannt hatte würden hoffentlich ausreichen.
Wobei ich glaube dann hätte ich maximal einen Fehler von 10% Jitter.
Ich glaube 1% ist nur erlaubt??

2. Ich bestelle ein spezielles IC wie zB: 
http://www.analog.com/en/switchesmultiplexers/digi...
Scheint aber keiner Erfahrungen damit zu haben und keine Ahnung wo ich 
das her bekomme.

3. Ich besorge mir alles für einen CPLD. 5 bis 10 ns sind bestimmt 
schnell genug und benutzte den AtMega nur zur Steuerung.
Vielleicht hat da jemand einen guten Link mit Infos wie man da am besten 
vorgeht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doc schrieb:
>>Es geht einfach nur darum einen Eingangsport komplett auf einen
>>Ausgangsport durchzuschalten.
>
> In seinem Beispiel wird nur Port A nach Port C , und Port B nach Port D
> geschaufelt.
>
> Also geht es ganz einfach Byteweise.

Du musst auch das Fernziel im Auge haben.
Und das Fernziel ist nun mal ein Kreuzschienenverteiler. Und den kriegst 
du mit Byteweise Kopieren nicht hin.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Frank T. (Gast)

>1. Ich bleibe beim ATmega und versuche mich in Assembler
>380KHz Abtastrate wie einer genannt hatte würden hoffentlich ausreichen.
>Wobei ich glaube dann hätte ich maximal einen Fehler von 10% Jitter.
>Ich glaube 1% ist nur erlaubt??

Kommt auf die Baudrate an. 9600 Baud sind kein Problem, 115200 kann man 
da vergessen. Ich würde den AVR generell vergessen. Das ist schlicht der 
falsche Ansatz.
>2. Ich bestelle ein spezielles IC wie zB:

Naja, ist halt was exotisches, schwer zu bekommen.

>3. Ich besorge mir alles für einen CPLD. 5 bis 10 ns sind bestimmt
>schnell genug

Selbst der langsamste CPLD den die Welt je gesehen hat kann das. Da 
reicht auch die 15ns Version.

> und benutzte den AtMega nur zur Steuerung.

Tu das.

>Vielleicht hat da jemand einen guten Link mit Infos wie man da am besten
>vorgeht.

http://www.mikrocontroller.net/articles/Programmie...

Mal peilen. Für die 8 Ausgänge braucht man 8 8:1 Muxe, das schafft eine 
Makrozelle. Für die Selektion braucht man 3 Bit, sprich 3 Makrozellen. 
Wenn man das seriell laden will/muss ohne die aktuelle Konfiguration zu 
stören, braucht man nochmal je drei Bit, sprich Makrozellen. Macht in 
Summe 7 Makrozellen/Kanal = 56 Makrozellen. Also tuts ein 64 oder 72 
Makrozellen CPLD. Der XC9572XL ist dein Freund.

http://www.reichelt.de/?;ARTICLE=40158

MfG
Falk

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und das Fernziel ist nun mal ein Kreuzschienenverteiler. Und den kriegst

okay, hatte ich übersehen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> Kommt auf die Baudrate an. 9600 Baud sind kein Problem, 115200 kann man
> da vergessen.

Hab ich doch oben gezeigt, geht prima in Assembler.

Das Delay ist <10% Bitzeit, auf 10 Bits gerechnet <1% Baudratenfehler, 
also voll im grünen Bereich.
Das Delay akkumuliert sich ja nicht.

Natürlich kann der AVR nichts anderes machen, also einfach nen AVR dafür 
abstellen, z.B. ATmega48. Die Einstellungen kriegt er über I2C gesagt.

In der Regel ist ein AVR kleiner, billiger und stromsparender als ein 
CPLD.

Der einzige Nachteil zum CPLD ist, daß wärend des Umschaltens zum 
Berechnen der neuen Tabelle alle 8 Kanäle kurzzeitig unterbrochen sind.


Peter

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
>Nun dachte ich ich könnte mehrere RS232 Schnittstellen mit dem Prozessor
>über die normalen IO Pins durchschalten.
Man beachte das RS232 eigentlich bidirektional ist, die Gegenrichtung 
also auch noch mit verbunden werden muss, und wenns ganz verrückt wird:
In1->Out3 / In5->Out1
Das ist dann schon richtig hohe Schule wenn es über einfache 
Bitschubbserei gehen soll.
Mein Ansatz wäre da eher: mehrere kleine AVRs(8) mit 
Hardwareschnittstelle
und ein Master zum Verteilen(SPI/I2C oder wenn ganz schnell, paralell)
Ein Haken wäre allerdings, die Baudraten. Obwohl, die könnte der Master
eigentlich auch mit übergeben.

Na dann, Viel Spass, Uwe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.