Werbung
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:
mega8 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
an portb sowie portc gibt der controller nichts aus.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
würd mich freuen wenn mir jemand helfen kann weil momentan weiss ich einfach nicht mehr weiter![]()
klemm mal die beiden AVRs einzeln an den PC, und probiere so, wer schuld ist...
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??![]()
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:
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...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
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
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
Code:...|(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...
Disclaimer: none. Sue me.
rx1 an tx2 und rx1 an tx2...Zitat von eric101
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![]()
Lesezeichen