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
Nach was langsameres um einen 8-Bit Port komplett einzulesen ist dir
nicht eingefallen?
1
PortC=PinA;
2
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.
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
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.
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.
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
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/digital-crosspoint-switches/ad8150/products/product.html
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.
Wobei die Aufgabenstellung nicht uninteresant ist.
Wie macht man einen frei konfigurierbaren Kreuzschienenverteiler in
Software, der auch noch möglichst schnell ist.
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:
1
in XL,inport ;1
2
clr XH ;1
3
sbrc XL,0 ;1/2
4
or XH,r16 ;1 Ausgangskonfiguration für Eingang 0
5
...
6
sbrc XL,7 ;1/2
7
or XH,r23 ;1 Ausgangskonfiguration für Eingang 7
8
out outport,XH ;1
Mit Sprung wären das dann 21 Takte, das wären ungefähr 380KHz Abtastrate
bei 8MHz Taktfrequenz.
Jörg
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
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
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.
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.
>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.
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.
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:
@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
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/digital-crosspoint-switches/ad8150/products/product.html
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.
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.
@ 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/Programmierbare_Logik
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
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
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