-
Habe jetzt mit einer etwas größeren Lupe alle Lötstellen überprüft und zwei nachgelötet, obwohl die gut aussahen. Jetzt geht es. Zeiten passen.
Danke schonmal.
Jedoch klappt das mit HTERM noch nicht. Bekomme dort nichts angezeigt.
Hier nochmal mein Code. Passt das unten vor der LED Routine mit dem "uart_puts ( ARRAY ); mit dem Array senden?
Code:
#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
while (1){
///// Test Routine ´LED Test ///////
PORTC |= (1<<PC0); // Ausgang auf 1
_delay_ms(100);
PORTC |= (1<<PC1);
_delay_ms(100);
PORTC |= (1<<PC2);
_delay_ms(100);
PORTC &= ~(1<<PC0); // Ausgang auf 0
_delay_ms(100);
PORTC &= ~(1<<PC1);
_delay_ms(100);
PORTC &= ~(1<<PC2);
_delay_ms(100);
}
}
}
-
Versuchs erstmal mit was ganz einfachem.
Code:
int main(void) {
uart_init();
while(1) {
uart_putc('A');
_delay_ms(200);
}
return 0;
}
mfg
- - - Aktualisiert - - -
Und du darfst
nicht setzen!
mfg
-
'A' bekomme ich Übertragen. Das ASCII Array uart_puts( daten1 ); und uart_puts( daten2 ); nicht.
-
Wieder viel zu kompliziert.
Code:
int main(void) {
int8_t i; //interner Schleifenzähler
int16_t sendeDaten1[5]; //WErte Array1
char daten1[20]; //Sende Array1 --> [x32000x12345x67890x......]
uart_init();
while (1) {
for (i=0; i<5; i++){
sendeDaten1[i] = rand() % 100; //Zufallswerte in das 1. werte Array
sprintf(&daten1[i*3], "x%d", sendeDaten1[i]);
}
//printf("%s\n", daten1);
uart_puts(daten1); //erste daten Array als ASCII senden
}
return 0;
}
mfg
-
Die Übertragung zu HTERM funktioniert.
Buchstaben kommen enstrpechend an. Das Array wird auch gesendet, Habe jetzt das Array an jeder Stelle mit der gleichen Zahl gefüllt.
Jedoch jetzt zwei Bugs:
1. ist jede Übertragene Array Zahl in HTERM anders
2. Die Zahl die in HTERM angezeigt wird (z.B. "-24401" enstspricht nicht der gesendeten INT 111.
Habe beim Wandeln ITOA darauf geachtet das die Puffer Variable [6] groß ist, da INT 5 stellen hat plus "/0".
-
Sry, aber das WLAN-Modul von meiner Glaskugel ist kaputt. Musst den Sourcecode leider selbst posten.:MistPC
mfg