xrzr
28.02.2015, 09:26
Guten Tag,
ich bin dabei eine Verbindung von einem ATMEGA 1284 über UART / FT232 an den USB zu meinem Pc herzustellen.
Mein Ziel ist es:
Die Übertragung von zwei Arrays (ASCII) an meinen PC. Ich habe erst ein int_16t Array geffüllt mit random Zahlen und diese dann in ASCII gewandelt und mit einem Trennzeichen 'x' versehen.
Mein PC erkennt das eigene Board. Wenn ich HTERM öffne bekome ich mich auch Verbunden nur erhalteich keine Daten. Ich bekomme garnichts angezeigt.
Ich habe im Programm nach dem senden ma meine LED´s die auf den Board sind angesteuert. Die Leuchten dann auch alle ca. 25sekunden auf.
Muss ich vlt in der Fuses was einsellen?
An den RX von dem FT232 geht der TX von Atmega. Spricht gekreuzt habe ich.
29899
29900
Quelltext:
#define F_CPU 14745600UL // CPU Taktfrequenz
#include <util/delay.h> //
#include <avr/io.h> //
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
///////////// ---- Baudrate ---- /////////////
#define BAUD 9600UL // Baudrate
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
///////////// ---- Initalisiere UART ---- /////////////
void uart_init(void) {
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
UCSR0B |= (1<<TXEN0) |(1<<RXEN0); // UART TX / RX einschalten
UCSR0C = (1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N1
}
///////////// ---- UART Senden ---- /////////////
int uart_putc(unsigned char sende) {
while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}
UDR0 = sende; /* sende Zeichen */
return 0;
}
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s){
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc (*s);
s++;
}
}
///////////// ---- MAIN ---- /////////////
int main(void)
{
DDRC = 0xFF;
int16_t zw = 0; //interner Schleifenzähler
int16_t sendeDaten1 [5]; //WErte Array1
int16_t sendeDaten2 [5]; //WErte Array2
char daten1 [31]; //Sende Array1 --> [x32000x12345x67890x......]
char daten2 [31]; //Sende Array2
uart_init();
while (1) {
for (int16_t i=0; i<6; ++i){
sendeDaten1 [i] = rand() % 100; //Zufallswerte in das 1. werte Array
sendeDaten2 [i] = rand() % 100; //Zufallswerte in das 2. werte Array
daten1[zw] = 'x'; //Trennzeichen x vor jeden WErt
daten2[zw] = 'x'; //Trennzeichen x vor jeden WErt
itoa (sendeDaten1 [i], daten1[zw+1], 10);
itoa (sendeDaten1 [i], daten2[zw+1], 10);
zw = zw+6; //
}
uart_puts( daten1 ); //erste daten Array als ASCII senden
uart_puts( daten2 ); //zweites daten Array als ASCII seden
///// Test Routine ´LED Test ///////
PORTC |= (1<<PC0); // Ausgang auf 1
_delay_ms(15);
PORTC |= (1<<PC1);
_delay_ms(15);
PORTC |= (1<<PC2);
_delay_ms(15);
PORTC &= ~(1<<PC0); // Ausgang auf 0
_delay_ms(15);
PORTC &= ~(1<<PC1);
_delay_ms(15);
PORTC &= ~(1<<PC2);
_delay_ms(20);
}
while (1) {
;
}
return 0; // never reached
}
ich bin dabei eine Verbindung von einem ATMEGA 1284 über UART / FT232 an den USB zu meinem Pc herzustellen.
Mein Ziel ist es:
Die Übertragung von zwei Arrays (ASCII) an meinen PC. Ich habe erst ein int_16t Array geffüllt mit random Zahlen und diese dann in ASCII gewandelt und mit einem Trennzeichen 'x' versehen.
Mein PC erkennt das eigene Board. Wenn ich HTERM öffne bekome ich mich auch Verbunden nur erhalteich keine Daten. Ich bekomme garnichts angezeigt.
Ich habe im Programm nach dem senden ma meine LED´s die auf den Board sind angesteuert. Die Leuchten dann auch alle ca. 25sekunden auf.
Muss ich vlt in der Fuses was einsellen?
An den RX von dem FT232 geht der TX von Atmega. Spricht gekreuzt habe ich.
29899
29900
Quelltext:
#define F_CPU 14745600UL // CPU Taktfrequenz
#include <util/delay.h> //
#include <avr/io.h> //
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
///////////// ---- Baudrate ---- /////////////
#define BAUD 9600UL // Baudrate
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
///////////// ---- Initalisiere UART ---- /////////////
void uart_init(void) {
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
UCSR0B |= (1<<TXEN0) |(1<<RXEN0); // UART TX / RX einschalten
UCSR0C = (1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N1
}
///////////// ---- UART Senden ---- /////////////
int uart_putc(unsigned char sende) {
while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}
UDR0 = sende; /* sende Zeichen */
return 0;
}
/* puts ist unabhaengig vom Controllertyp */
void uart_puts (char *s){
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc (*s);
s++;
}
}
///////////// ---- MAIN ---- /////////////
int main(void)
{
DDRC = 0xFF;
int16_t zw = 0; //interner Schleifenzähler
int16_t sendeDaten1 [5]; //WErte Array1
int16_t sendeDaten2 [5]; //WErte Array2
char daten1 [31]; //Sende Array1 --> [x32000x12345x67890x......]
char daten2 [31]; //Sende Array2
uart_init();
while (1) {
for (int16_t i=0; i<6; ++i){
sendeDaten1 [i] = rand() % 100; //Zufallswerte in das 1. werte Array
sendeDaten2 [i] = rand() % 100; //Zufallswerte in das 2. werte Array
daten1[zw] = 'x'; //Trennzeichen x vor jeden WErt
daten2[zw] = 'x'; //Trennzeichen x vor jeden WErt
itoa (sendeDaten1 [i], daten1[zw+1], 10);
itoa (sendeDaten1 [i], daten2[zw+1], 10);
zw = zw+6; //
}
uart_puts( daten1 ); //erste daten Array als ASCII senden
uart_puts( daten2 ); //zweites daten Array als ASCII seden
///// Test Routine ´LED Test ///////
PORTC |= (1<<PC0); // Ausgang auf 1
_delay_ms(15);
PORTC |= (1<<PC1);
_delay_ms(15);
PORTC |= (1<<PC2);
_delay_ms(15);
PORTC &= ~(1<<PC0); // Ausgang auf 0
_delay_ms(15);
PORTC &= ~(1<<PC1);
_delay_ms(15);
PORTC &= ~(1<<PC2);
_delay_ms(20);
}
while (1) {
;
}
return 0; // never reached
}