Atmega8 USART Unsauber

Gast #170252
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
Angehängte Dateien:
Gast #170256
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 ;-)
Gast #170258
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
Gast #170259
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
Gast #170260
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.
Gast #170265
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?
Gast #170267
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.
Gast #170268
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.
Gast #170271
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
Gast #170273
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
Gast #170274
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
Gast #170276
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren