www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 USART Unsauber


Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich versuche mich grade mit dem Atmega8 und der seriellen
Kommunikation.
Folgender Programmablauf ist gedacht.
Es wird ein Zeichen über die Serielle-Schnittstelle gelesen.
Handelt es sich um eine Eins, werden LED's geschalten und über die
Serielle Schnittstelle "LED" ausgegeben.
Handelt es sich um ein anderes Zeichen, so wird dieses Zeichen über die
Serielle Schnittstelle ausgegeben.

Es funktioniert teilweise - meistens gibt er nur "Müll" zurück, wirre
Zeichenketten etc.

Kann es vielleicht auch daran liegen, das mein MAX232 nicht genügend
Spannung bekommt? Versorgung ist über 9V Block und 7805.

Gruß und vielen Dank fürs durchschauen -> Programm im Anhang

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
9V Block ist wohl nicht die beste Stromversorgung..

nen Anfang wäre vielleicht in der letzten Zeile bei transmit: das RETI
zu nem RET zu machen..

dave

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Klar - dort sollte ein RET stehen. Aber wenn ich da einen RET hinmache,
dann macht er noch weniger :( Hatte ich schon versucht. Trotzdem danke.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meß mal die Versorgunsspannung, ob se auch wirklich so ca. 5V ist.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es klingt vielleicht wirklich blöd, aber ich hab nichts zum Messen da :)

Habe meine Hobby-Elektronik Werkstatt vor Beginn der Technikerschule
aufgegeben. Und jetzt, drei Wochen vor Ende der Technikerschule, hat
mich das Elektronik-Fieber richtig gepackt ;-)

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Techniker gibt ne Elektronikwerkstatt auf? Verstehe ich nicht...

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie im Tutorial hier:
        ; Frame-Format: 8 Bit
        ldi temp, (1<<URSEL)|(3<<UCSZ0)
        out UCSRC, temp

Außerdem.. haste auch die Taktquelle auf extern umgelegt?

Ist kräftig unlogisch, dass er weniger macht, wenn du das RET
reinsetzt.. ich denke mal, dass er dann jedesmal einen IRQ auslöst,
wenn du sendest..

dave

Autor: Ralf K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Thomas,
kenne das Problem leider zu gut.
Hört sich verdammt nach eingestellter Übertragungsrate an.
Mußt du ausprobieren.

z.b. beim ATmega8 hatte ich nur Erfolg bei 4800 Baud bei 1Mhz.
Es hängt von der Taktfrequenz ab.
Natürlich kommen auch andere Fehlerquellen in Frage.
Nur wenn ich bislang wirre Zeichen empfing, dann lag es immer an der
Baudrate.

Viel Glück
lg Ralf

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus

Taktquelle ist extern auf 4MHz Quarz.

Ich habe noch einen LED-Blinker eingeaut, der alle 200ms eine LED
schaltet. Wenn ich transmit mit einem RET beende, dann bleibt sogar der
Blinker stehen ?!? HILFE !!!

110baud ... 4800 baud bringen keine Verbesserung.

Ich bin mir fast sicher, das es an der Versorgungsspannung hapert.
Werde morgen mal mit einem Netzgerät noch einen Anlauf starten.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> r16,3686400/(9600*16)-1
und
> Taktquelle ist extern auf 4MHz Quarz.
passen nicht recht zusammen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit 4MHz meinte ich die 3686400. Das passt doch, oder?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also was hat der Quarz denn nu? 3,6 oder 4,0MHz? Ist bei serieller
Kommunikation nicht ganz unwichtig.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RETI ist übrigens schon richtig, denn sonst bleibt nach den ersten
Interrupt derselbige abgeschaltet.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3686400Hz

Warum RETI - Ich rufe aus einem Interrupt eine Subroutine mittels rcall
auf. Ich bin mir jetzt nicht sicher wie der rcall auf dem ATMEGA
arbeitet.

Beim 8086 werden z.B. bei Rücksprung aus einem Interrupt 2 Wörter vom
Stack gelesen. Hingegen beim Unterprogramm nur 1 Wort.

Daher komme ich hier beim RET und RETI durcheinander. Hast Du weitere
Informationen, warum der Interrupt abgeschaltet bleibt?

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Routine LED muss natürlich am Ende ein RETI bekommen.. Transmit
ein RET..

dave

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auszug aus "AVR Instruction Set":

RETI:
Returns from interrupt. The return address is loaded from the STACK and
the Global Interrupt Flag is set.

RET:
Returns from subroutine. The return address is loaded from the STACK.
The Stack Pointer uses a pre-increment scheme
during RET.

> Hast Du weitere Informationen, warum der Interrupt abgeschaltet
> bleibt?

Ist halt so implementiert.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Transmit gehört wirklich RET rein. Beim "led:" Teil aber gehört
RETI rein - das ist ja kein Unterprogramm.

Allerdings ist das nicht das Problem, weil Du zwar die Interrupts an
der falschen Stelle einschaltest, aber immerhin passiert es.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dave - bitte um Erklärung!

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andere Frage: Du hast den Quarz-Oszillator schon eingeschaltet, also die
Fuses entsprechend gesetzt?

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interrupt löscht das I-Flag.. RETI setzt es..

du springst bei 1 in LED.. also hast du 2 Orte, wo du zurückspringst..
an die 2 Orte müssen dann natürlich RETIs...
Transmit braucht kein I-Flag.. das soll schön gelöscht bleiben.

dave

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@AK: Fuses sind gesetzt - wie im Tutorial beschrieben.

@Dave: aha...Ich rufe aber doch LED genauso auf wie transmit. Oder muss
ich unterscheiden, wenn ich was aus einer Interrupt-Routine aufrufe?

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
receive:
in data,udr
ldi temp,'1'
cp data,temp
breq led
mov send, data
rcall transmit
reti

Mir kommt das eher so vor ;) als würdest du nur bedingt SPRINGEN und
nicht AUFRUFEN.. breq ist "wenn gleich, dann RJMP"

dave

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also besser so?

;-------------------------
receive:
  clr  temp
  in  data,udr
  ldi  temp,'1'
  cp  data,temp
  brne  end
  rcall  led
end:
  mov    send, data
  rcall  transmit
reti
;-------------------------
led:
  com    otemp
  ...
ret
;-------------------------


Nochmal zum Verständnis. Wo ich vorher die Routine LED mit reti beendet
habe, bin ich gleich wieder komplett aus dem interrupt raus und nicht
erst zurück in receive?!

Funktioniert so aber auch nicht. Ich werde zusammenpacken und auf das
Netzgerät warten.

Gruß

Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und nochmal!

Es muss an der Spannung liegen - selbst das Testprogramm aus dem
Terminal schaut so aus:

Test!
     st!
Tes
Test!
Testá

Test!
Test!
Test
Tesô!
Test!
Te
Test!
     Test!
Ôst!

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nochmal zum Verständnis. Wo ich vorher die Routine LED mit
> reti beendet habe, bin ich gleich wieder komplett aus dem
> interrupt raus und nicht erst zurück in receive?!

Ist die Doku vom RETI sooo unverständlich? Oder ist bloss dein Englisch
so gut wie mein Altgriechisch? In letzterem Fall wirst Du mit
Microcontrollern deine liebe Not haben.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es tut mir leid, dass ich damit "The Stack Pointer uses a pre-increment
scheme during RET" nichts anfangen kann!

Autor: Simon Küppers (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
siehe anhang. meine verbesserungsvorschläge

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht!!!

Es lag also wirklich an der Spannungsversorgung!

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.