-
UART am ATMega644P
Hallo Leute,
wie der eine oder andere ja vll noch weiß ist mein Team nach wie vor am Projekt "autonomer Roboter" dabei und neigt sich langsam dem Ende.
Nächsten Donnerstag, also dem 19.03.2009, ist Abgabe Termin, somit bleibt nur noch wenig Zeit :-k
Wir stehen allerdings erneut vor einem Problem - dem UART
Wenn wir versuchen ein einziges Zeichen zu senden und abzufangen, kommt zwar etwas an, allerdings meist nicht das gewünschte Zeichen wie wir eigentlich wollten.
Eigentlich von uns gewollt ist eine Standard-Übertragung
8 Datenbits, 1 Stopbit, Parity None, Asynchronous Modus, bei 9600 BAUD
Unser leider gescheitertes Vorgehen:
- - ATmega644P-20PU
- Externer 16Mhz Quarz
- ISP-Schnittstelle nach RN Standard
- verwendeter UART#1
- MAX232 mit Kondensatoren
- NULL-Modem Kabel
- Stecker (RXD & TXD)
Initialisierung des UART1
Code:
unsigned int baud=9600;
UBRR1H = (F_CPU / 16* (unsigned char)(baud>>8)-1)>>8;
UBRR1L = (F_CPU / 16* (unsigned char)(baud>>8)-1);
UBRR1 = 103;
UBRR1 = (F_CPU / (BAUD * 8L) - 1);
UCSR1A = (0<<U2X1);
UCSR1B = (1<<TXEN1);
UCSR1C = (0<<UMSEL10);
UCSR1C = (0<<UPM11) | (0<<UPM10);
UCSR1C = (0<<USBS1);
UCSR1C = (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10);
UCSR1C = (0<<UCPOL1);
Senden eines Zeichens
Code:
void USART_Transmit( unsigned char data )
{
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
USART_Transmit(65);
Sämtliche Programmeinstellungen wurden kontrolliert, ebenfalls was die Baudrate von 9600 betrifft etc. Im Datenblatt des ATmega644P wurden wir unter anderem fündig was UBRR1 = 103; betrifft
Eigentlich sollte das ganze nun ein großes A übertragen.
Seit 2 Wochen probieren wir nun schon herum und kommen leider nicht weiter.
Wir würden uns wirklich über jeden Tipp freuen.
Hoffe natürlich bei möglichen Fragen schnell Antworten geben zu können.
-
Wenn ihr die Init so schreibt
Code:
unsigned int BAUD=9600;
#define F/CPU 16000000L
UBRR1 = (F_CPU / (BAUD * 8L) - 1);
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
dann sollte es funktonieren
Das xxx =(0<<xxx) ist Unsinn
-
Alles klar, ich werds direkt ausprobieren und mich anschließend melden.
[qoute]
dann sollte es funktonieren
Das xxx =(0<<xxx) ist Unsinn
[/qoute]
geb ich dir natürlich vollkommen Recht. Diente eigentlich auch zwischenzeitlich nur dazu damit wir die ganzen Möglichkeiten durchgehen konnten - Aus reinster Verzweifler heraus ;)
Aber ich danke dir schonmal soweit, melde mich
-
Habe nun folgendes geschrieben, allerdings wurdert mich das F/CPU - War das kein Rechtscheibfehler (F_CPU) ?
Compiler meckert:
Code:
#include <avr/io.h>
#define F/CPU 16000000L //definiert den CPU Takt
void USART_Transmit( unsigned char data )
{
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
int main()
{
unsigned int BAUD=9600;
UBRR1 = (F_CPU / (BAUD * 8L) - 1);
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
while (1)
{
USART_Transmit(65);
}
return 0;
}
Was habe ich falsch gemacht?
Nach wie vor für jede Hilfe dankbar
-
Das war sicher ein Schreibfehler von mir, natürlich F_CPU
Ausserdem muss es heissen UBRR1 = (F_CPU / (BAUD * 16) - 1);
-
Hab nun das geschrieben und das Funktioniert leider immernoch nix.
kommt scheinbar gar nix an...
Code:
#include <avr/io.h>
#define F_CPU 16000000L //definiert den CPU Takt
void USART_Transmit( unsigned char data )
{
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
int main()
{
unsigned int BAUD=9600;
UBRR1 = (F_CPU / (BAUD * 16) - 1);
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
while (1)
{
USART_Transmit(65);
}
return 0;
}
EIn anderes Beispiel unter Bascom allerdings funktioniert einwandfrei, somit schonmal kein Hardwarefehler denke ich.
Code:
$regfile = "m644pdef.dat"
$crystal = 16000000
$baud1 = 9600
Open "com2:" For Binary As #2
Do
Waitms 800
Print #2 , "**** Hier steht was ****"
Loop
End
Irgendwie wirds langsam echt deprimierend...
Hat sonst noch wer eine Idee oder sieht einfach den Fehler?
Dankbar für jede Hilfe
-
Ich sehe jetzt auch keinen Fehler, ausser das du dauernd ausgibst ohne wait.
-
Das kommt davon wenn man schlampig abschreibt und nicht kopiert
UBRR1 = (F_CPU / (BAUD * 16L) - 1);
-
Well Done Man :)
Könnte dich knutschen O:)
Es funktioniert!! Danke Dir!!
und natürlich für diejenigen die dasselbe Problem haben denen will ich natürlich die Lösung nicht vorenthalten:
Code:
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 16000000L //definiert den CPU Takt
void USART_Transmit( unsigned char data )
{
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}
int main()
{
unsigned int BAUD=9600;
UBRR1 = (F_CPU / (BAUD * 16L) - 1);
UCSR1B = (1<<TXEN1);
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
while (1)
{
_delay_ms(500);
USART_Transmit(65);
}
return 0;
}