-         

Ergebnis 1 bis 10 von 10

Thema: uart zwischen mega8 und at90s2313

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37

    uart zwischen mega8 und at90s2313

    Anzeige

    ich möchte über UART daten vom at90s2313 an einen mega8 schicken, aber irgendwie habe ich immer ein frame error . beide laufen mit externen takt auf 4mhz und 19.2k baud.
    at90s2313 code:
    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:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    klemm mal die beiden AVRs einzeln an den PC, und probiere so, wer schuld ist...

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    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??

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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:

    Code:
    ;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...

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Was mir auffällt:
    1. 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
      Code:
      ...|(1<<UCSZ0)|(1<<UCSZ1)
      // anstatt
      ...|(3<<UCSZ0)
    2. 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.
    3. 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...
    Disclaimer: none. Sue me.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    was genau meinst du mit gekreuzt?

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Zitat Zitat von eric101
    was genau meinst du mit gekreuzt?
    rx1 an tx2 und rx1 an tx2...

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    06.04.2005
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    37
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •