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
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 ;-)
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
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
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.
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?
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.
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.
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
@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?
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
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
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!
> 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.