PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Überforderung Mega16?



m_herr
04.02.2007, 10:02
Hallo Leute,


wie in einem anderen Beitrag hier schon geschrieben, habe ich ein kleines Problem mit einem Mega16.

Ausganssituation:
Mega16 in einem Entwicklungsboard, also mit Abschirmmasse, Blockkondensatoren etc ohne Freiverdrahtung.
8Mhz Quarz, Baud 384000.

Ca alle 200ms kommt ein ca 50Zeichen String an, dieser soll vom Atmega empfangen werden, in Einzelteile zerlegt, in Zahlen umgewandelt, mit ausgeleseneen ADC-Werten verrechnet werden (Ganzzahlberechnungen, ohne Rekursion oder tiefe Schleifen)
Dann soll aus dem Ganzen wieder ein ca 50Zeichen-String gebildet werden und dieser soll auch ca. alle 200ms gesendet werden.

Programmtechnisch nutze ich die Möglichkeiten vom Rowald-Buch.
Es klappte bisher auch mit dem Senden oder dem Empfangen sehr gut damit. Aber seitdem ein Chip Senden UND Empfangen soll, gibt es Probleme.
Ich habe gestern abend das Problem soweit eingekreist, daß ich davon ausgehe, daß der Empfang der Daten das Problem ist, es wird nämlich nur jedes 4te Zeichen empfangen. da ich davon ausgehe, daß die Daten richtig gesendet werden, kann es nur am Empfang liegen.....

Überfordere vielleicht den Mega? Kann er vielleicht gar nicht solche Aufgaben bewältigen mit 8Mhz (es sind nur ca 30% Flash belegt)?

Wäre nett, wenn sich dazu jemand mit Erfahrung äußern könnte. Nicht das ich sinnlos weitersuche nach einem Fehler.

chr-mt
04.02.2007, 10:46
Hi,
so lange das alles hintereinander passiert, ist das kein Problem.
Zeit ist ja nun wirklich genug.
Ich mache sowas ähnliches, allerdings immer ohne Interrupts.
Ich erinnere mich daran, daß ich das mal nach der Rowalt Methode probiert hatte und den selben Effekt hatte.
Je höher die Baudrate und um so mehr Code in der Interruptroutine war, um so mehr Zeichen gingen verloren.

Gruß
Christopher

Felix G
04.02.2007, 10:54
Naja, prinzipiell musst du nur mal messen wie lange der µC braucht um einen String einzulesen, die Berechnungen durchzuführen und das Ergebnis zu senden.

Ist diese Zeit länger als 200ms, wirst du versuchen müssen deinen Code effizienter zu machen. (oder du erhöhst die Taktfrequenz)

m_herr
04.02.2007, 10:58
gut, und wie kann ich so etwas messen?

m_herr
04.02.2007, 11:46
so, habe jetzt Gewißheit: Der Empfänger empfängt nur ca jedes 4 Zeichen. dadurch übersieht er das startzeichen auch. so das ein unregelmäßiger empfang stattfindet.

dumme frage und auch Kristallkugel-Verdächtig. Woran kann das liegen?

Wie gesagt, Senden bzw Empfangen geht problemlos mit dieser Schaltung, nur das gleichzeitige Senden und Empfangen. Deswegen schließe ich Hardware aus, bleibt nur Softwäre.

PicNick
04.02.2007, 12:19
Bei Baud 38400 hat der µC ~ 200 µS Zeit, das Byte wegzuräumen, bis das nächste kommt. In der Zeit macht er bei 8 MHZ ca 1600 Cyklen, das sollt' sich schon ausgehen.

Mach also erstmal eins: Empfange die 50 Byte erstmal komplett, und dann sende diese oder andere 50 Byte zurück, egal. Sonst mach mal nix.

Kontrollier' mal, ob das klappt (am besten mit Dummy-bytes, die du auch kontrollieren kannst).

VIelleicht zertrümmert das Senden irgendwie den gleichzeitigen empfang.

Kristallkugel brauchst du nicht, der Fehler steht im Source-Code, Frage ist höchstens: wo ?

m_herr
04.02.2007, 19:49
so, habe nun gesessen, komme aber nicht weiter.

Knackpunkt ist das Empfangen. Entweder liegt es schon beim Sender, oder der Empfang wird gestört.
Der Sender ist auch ein Mega 16, bei dem die Empfangs-Leiterbahn (also RX) unter dem Chip langeht. Könnte das vielleicht Probleme bereiten?

Wenn ich mit

"Config Serialin = Buffered , Size = 20"
gleichzeitig ein "On Urxc Onrxd" habe und dort jedes Zeichen auswerte, merke ich, daß das Startzeichen nicht immer erkannt wird. Also das Toggeln des Pins (leider kein Display vorhanden) unregelmäßig ist.

Gleichzeitig fällt mir auf, daß On Urxc Onrxd sehr oft und gleichmäßig angesprungen wird, auch wenn keine daten empfangen werden (Kabel ab)
Oszie springt munter und gleichmäßig darauf hin. Ist das normal?

PicNick
05.02.2007, 06:58
Hallo, Kollege: "Config serialin" und "On Urxc" sind widersprüchlich.
"serialin" belegt schon den interrupt. Weiß gar nicht, was rauskommt, wenn du beides angibst.
An sich wäre es die beste Lösung, "serialin" zu sagen und den Interrupt zu "overriden" (mit einer eigenen Routine)
Die nächste Wahl wäre "serialin" und in der Do-Loop schleife immer mit "ischarwaiting() " immer nur abzufragen, ob was da ist .

repi64
11.02.2007, 19:30
Mal so nebenbei gefragt.
Ist der HW-, SW-Stack und Framesize ausreichend dimensioniert?