Programmierung etwas falsch gemacht zu haben, denn es funktioniert nicht richtig. Den Code habe ich hier hochgeladen:
formatting link
Funktionieren soll es so: kommt in einer kurzen Zeitspanne das gleiche Byte 2 mal, soll der
oder 2 verschiedene Bytes gesendet, soll das letzte gesendete Byte an
Folgende Reaktion war aber zu beobachten:
Zeichen noch 2x, passiert nichts mehr, erst, nachdem man ein anderes Zeichen gesendet hat (oder ein anderes Zeichen 2x sendet, dann kommt wieder das Dach). Was habe ich falsch gemacht?
Arne
Didn't find your answer? Ask the community — no account required.
T
Thomas Mozgan
Arne Rossius schrieb:
Hast du die Zeitspanne ausreichend dimensioniert. Die Uebertragung eines Bits dauert bei 9600baud ueber 1000 CLK (10MHz). Da kann man sich bei Warteschleifen verschaetzen.
Meinst du ^ mit Dach? Hat dieses nicht einen hoeheren ASCII Wert?
servus thomas
J
Jan-Hinnerk Reichert
Hallo,
so kompliziert?
Alternativen:
- Benutze einen Teil des Bytes als Befehlscode und einen Teil als
aber besser als warten ist es bestimmt
einen Fehler zu suchen, lohnt IMHO den Aufwand nicht. Falls Du
/Jan-Hinnerk
J
Jan-Hinnerk Reichert
Ich kenne den anderen Part natürlich nicht. Im allgemeinen ist es aber nicht einfach langsam genug zu sein. Ich denke da nur an alte PC-Spiele, die auf schnelleren Rechnern nicht mehr benutzbar waren ;-(
Ist klar. Falls das für Deine Anwendung ein Problem ist entfällt die Lösung.
Wo ist das Problem mit einem Byte mehr? Langsamer dürfte es eigentlich kaum werden. Die zusätzliche Übertragungszeit liegt auf jeden Fall unter Deiner Wartezeit. Falls Dein Sender einen FIFO hat dauert es da auch nicht länger. Außerdem sparst Du Dir das Senden eines zweiten Bytes für das Lesen, sparst hier also Zeit und Aufwand.
Falls es für Dich wichtig ist, daß die Ausgänge gleichzeitg geändert werden, kannst Du auch die Werte vom ersten Schreiben zwischenspeichern.
Und Du hast noch jede Menge Möglichkeiten das Protokol zu erweitern. z.B.
1000 xxxx -> out = xxxx
1001 xxxx -> out = out OR xxxx
1010 xxxx -> out = out AND (NOT xxxx)
1011 xxxx -> out = out XOR xxxx
Ich meinte natürlich count ;-)
/Jan-Hinnerk
J
Jan-Hinnerk Reichert
Ich habe keine Ahnung, wo man sowas lernen kann. Auf jeden Fall sollte man nicht von C-Compilern generierten Code als Vorbild nehmen. IMHO haben die AppNotes von Atmel leider oft ähnliche Qualität.
Da helfen wohl nur Erfahrung und gesunder Menschenverstand.
Mal ein paar kurze Tipps zu einem Teil Deines Codes:
Nie in Kommentaren die Befehle übersetzen. Wenn der Leser nicht weiß, daß "inc" inkrementiert oder das "count" ein Counter ist, kann er den Code sowieso nicht verstehen.
Entweder den Sinn erklären oder (falls es zu offensichtlich ist) lieber ganz weglassen. Im Gegensatz zu Hochsprachen passiert oft weniger pro Zeile, d.h. man braucht auch weniger Kommentare.
"ok" ist ein sehr schlecht gewählter Name. Er gibt keine nützliche Information und führt sogar ein bißchen in die Irre: Es ist nicht "nicht OK", wenn der Sprung nicht ausgeführt wird ;-)
IMHO ist der "cpse"-Befehl meistens eher verwirrend. Er spart hier auf jeden Fall keine Zeit.
Kommentare sind hier gut (IMHO ist Pseudo-Code eine tolle Sache)
Nun das ganze in etwas aufgeräumter Form:
main_loop: tst outp ; if something to output: breq dont_output out PORTB,last ; output it! clr outp ; blah dont_output: ldi last,0 ; blah
ldi count,200 ; wait approx. 200*256*3 cycles clr temp ; that is ??? ms @ ??? MHz wait: dec temp brne wait dec count brne wait rjmp main_loop
Ich benutze gerne Leerzeilen, um Funktionsblöcke voneinander zu trennen.
Ich hoffe, daß bringt Dich ein bißchen weiter.
/Jan-Hinnerk
J
Jan-Hinnerk Reichert
Lade Dir von Atmel die Befehlsbeschreibung runter (nicht so leicht zu finden):
formatting link
Den Rest per Mail (wird doch langsam etwas off-topic)
/Jan-Hinnerk
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.