PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : uart zwischen mega8 und at90s2313



eric101
18.09.2005, 02:47
ich möchte über uart daten vom at90s2313 an einen mega8 schicken, aber irgendwie habe ich immer ein frame error :-k . beide laufen mit externen takt auf 4mhz und 19.2k baud.
at90s2313 code:

.include "C:\Dokumente und Einstellungen\eric\Desktop\asm\2313def.inc"

.def temp1 = r16

.cseg
.org 0x000
rjmp reset


reset: ldi temp1, ramend
out SPL, temp1
sbi DDRD, 1 ;output
ldi temp1, 0x0c
out ubrr, temp1 ;baudrate 19200baud
cbi ucr, chr9 ;9bit modus aus
sbi ucr, txen ;transmitter ein
rjmp start

start: ldi temp1, 0b00101010 ;bitmuster
out udr, temp1 ;werte an sender übertragen
t1: sbis usr, udre ;warten bis übertragung fertig
rjmp t1
rjmp start
mega8 code:

.include "C:\Dokumente und Einstellungen\eric\Desktop\asm\m8def.inc"

.def temp1 = r16

.cseg
.org 0x000
rjmp reset


reset: ldi temp1, low(ramend)
out SPL, temp1
ldi temp1, high(ramend)
out sph, temp1
ldi temp1, 0b00111111 ;output
out DDRC, temp1
cbi DDRD, 0 ;input
sbi DDRB, 0 ;output
cbi ucsra, u2x ;geschwindigkeit 1x
cbi ucsrb, ucsz2 ;8bit modus
ldi temp1, 0x0c
out ubrrl, temp1 ;baudrate19200
sbi ucsrb, rxen ;receiver ein


start:
sbis ucsra, rxc ;neue daten in udr?
rjmp start
sbic ucsra, FE
rjmp start
sbi PORTB, 0 ;erfolgreich übertragen?
in temp1, udr
out PORTC, temp1 ;ausgeben
rjmp start
an portb sowie portc gibt der controller nichts aus.
würd mich freuen wenn mir jemand helfen kann weil momentan weiss ich einfach nicht mehr weiter ](*,)

linux_80
18.09.2005, 20:57
Hallo,
im Datenblatt steht was davon, das FE solange gesetzt bleibt bis es absichtlich gelöscht wird, oder UDR gelesen wird.
Evtl. hilft es beim Init einfach eins von beiden zu tun !?

Wenn ich mirs recht überlege hat das FE sonst noch keiner abgefragt, deshalb wird sonst keiner Frameerror haben ;-)

uwegw
18.09.2005, 21:02
klemm mal die beiden AVRs einzeln an den PC, und probiere so, wer schuld ist...

eric101
19.09.2005, 19:44
das problem liegt bei dem mega8, ich kan mit dem at90s2313 per uart daten an einen anderen at90s2313 übertragen. auch wenn ich beim initialisieren udr auslese um gegenbenfals FE zu clearen klappts nicht.
wenn ich die frame errors ignoriere gibt er immer das fünfte bit als logisch 1 aus und den rest als null...was soll ich jetzt machen?? :-s

uwegw
19.09.2005, 21:10
ich hab mal nen programm für nen mega8 geschrieben, wo ich den interrupt für den empfang über die serielle schnittstelle benutzt habe.

hier mal die konfiguration, die ich benutzt habe:



;konstanten für die baudrate
.equ CLOCK = 16000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

;konfiguration der seriellen schnittstelle
;--------------------------------------------
; Baudrate einstellen
ldi mpr, LOW(UBRRVAL)
out UBRRL, mpr
ldi mpr, HIGH(UBRRVAL)
out UBRRH, mpr

; Frame-Format: 8 Bit
ldi mpr, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, mpr

; sender und empfänger aktivieren
sbi UCSRB, RXEN
sbi UCSRB,TXEN

sbi UCSRB, RXCIE ;empfangs-interrupt ein


ich hatte das programm erst für nen 90s8515 geschrieben. beim wechsel auf den mega8 hatte ich dann auch nen paar probleme, weil sich einiger registernamen unterscheiden und neue hinzugekommen sind...

eric101
19.09.2005, 22:26
mit deinem programm habe ich anscheinend genau das gleiche problem. ich versuch mal morgen einen mega16 als empfänger zu verwenden, mal schauen ob das klappt. mega8 hab ich leider gerade keinen zweiten da

SprinterSB
20.09.2005, 08:47
Was mir auffällt:

Teilweise werden die Register nich 'voll' initialisiert, sondern nur mit sbi/cbi einselne Bits gesetzt. Grundsätzlich sollte man immer allse Config-Bits setzen! Ausserdem sollte man wegen der Portierbarkeit implizite Annahmen vermeiden, also


...|(1<<UCSZ0)|(1<<UCSZ1)
// anstatt
...|(3<<UCSZ0)

Beim Berechnen der Baudrate über Macros gibt es Rundungsfehler, wenn die Baudrate nicht genau passt. Das ist bei dir mit 4MHz der Fall. Die Rundung geht idR nicht in die Richtung des kleinsten Fehlers. Da du nicht auf eine 'klassische' Baudrate rauskommen musst, weil ja beide AVRs 'krumm' bei 4MHz getaktet sind, würd ich auf eine andere Baudrate gehen, vielleicht 20kbps oder 16kbps.
Die Leitungen hast du ja gekreuzt...?

Ich hab mit dem Mega8 keine Probleme, weder im Poll- noch im Interrupt-Betrieb. Ich hab's einfach so gemacht, wie's im Manual geschrieben steht. Allerdings in C...

eric101
20.09.2005, 13:13
was genau meinst du mit gekreuzt? 8-[

uwegw
20.09.2005, 13:25
was genau meinst du mit gekreuzt? 8-[
rx1 an tx2 und rx1 an tx2...

eric101
20.09.2005, 15:56
ja das stimmt bei mir alles. ich hab jetzt mal den mega8 als sender genommen und und einen mega16 als empfänger und es klappt wieder nicht...initialisierung usw hab ich alles aus den datenblättern. hab auch mehrere baudraten ausprobiert. hat vielleicht jemand ein fertiges programm wo 2 controller miteinander kommunizieren, weil ich brings irgendwie nicht auf die reihe ](*,)