Daten Senden Empfangen Ic -> Pc -> Ic
Hallo zusammen,
ich habe mir ein VB.Net Programm geschrieben wo ich an einen Ic (Atmega16) warte Zeiten ändern. Die Übertragung von VB zum Ic soll in Ascii code passieren. Die Umwandlung in VB funktioniert
super, lasse es mir in einer Textbox anzeigen.
Wenn ich im Ic die Variable x (als Char oder uint8_t) umwandle und damit z.B. eine warte Zeit einstellen möchte geht das nicht.
Ich habe mir auch schon die Variable x als Ascii wider an den Pc geschickt da kommen immer unterschiedliche Werte an. Selbst wenn ich direkt ein Ascii Variable schicke.
[CODE]
#include <avr/io.h>
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>
#define F_CPU 1000000 /* evtl. bereits via Compilerparameter definiert */
#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.
static void Rot (void)
{
PORTB = (~(1<<PIN0) & ~(0<<PIN1) & ~(0<<PIN2) & ~(0<<PIN2) & ~(1<<PIN3) & ~(0<<PIN4) & ~(0<<PIN5) & ~(0<<PIN5) & ~(1<<PIN6) & ~(0<<PIN7));
}
//----------------------------------------------------------------------------------------------------
// UART konfig
void uart_init (void)
{
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
UCSRB |= (1<<TXEN) | (1<<RXEN); //UART TX und RX einschalten
UCSRC = (1<<URSEL) |(1<<UCSZ1) | (1<<UCSZ0); //Asynchron 8N1
}
//----------------------------------------------------------------------------------------------------
//Senden
int uart_putc(uint8_t z)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = z; /* sende Zeichen */
return 0;
}
//----------------------------------------------------------------------------------------------------
//Empfanen
uint8_t uart_getc(void)
{
while (!(UCSRA & (1<<RXC)))
;
return UDR;
}
//----------------------------------------------------------------------------------------------------
int main (void)
{
uint8_t x;
uint8_t c; //Ascii kommen
uint8_t z; //Ascii gehen
uint8_t t; //Variable für Zeitwert
//Ausgangs Port Festgelegt
DDRB = 0xFF;
PORTB = 0xFF;
uart_init(); //UART deklarit
while (1)
{
c = uart_getc(); //Variable c mpfange
x = atoi (c); //Ascii variable c in variable x umwandeln
itoa (65, z, 10); //65 in Ascii umwandeln entspricht A zum Testen
uart_putc(z); //variable z (65, A) an Pc senden
t = x * 100; //Auf sekungen umwandeln
PORTB = Rot; //Port B schalten
_delay_ms(t); //WarteZeit t
PORTB =0xFF; //Port B ausschalten
_delay_ms(t); //WarteZeit t
PORTB = Rot; //Port B schalten
_delay_ms(t); //WarteZeit t
PORTB =0xFF; //Port B ausschalten
}
return 0; // never reached
}
[/CO
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe die F_CPU auf 12MHz stehen und die LED's blinken im Sekundentakt
Hier die Fuses einstellungen
Anhang 30824
Habe auch schon probiert wenn ich nur den Sende Pin aktiviert ist. Da habe ich dann die uart_puts() zeile in die else schleife geschrieben, kam aber auch nur irgendwelche Buchstaben oder Zeichen an.
Habe es auch mal mit einem anderen PC und uC probiert.
Hier nochmal das Programm
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define F_CPU 1200000 /* evtl. bereits via Compilerparameter definiert */
#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.
#include <util/setbaud.h>
//------------------------------------------------------------------------------------------
//USART initialisieren
void uart_init(void)
{
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
UCSRB |= (1<<TXEN) | (1<<RXEN); //UART TX und RX einschalten
UCSRC = (1<<URSEL) |(1<<UCSZ1) | (1<<UCSZ0); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
}
//------------------------------------------------------------------------------------------
//Warteschleife
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms) {
zaehler = F_CPU / 5000;
while (zaehler) {
__asm volatile("nop");
zaehler--;
}
ms--;
}
}
//------------------------------------------------------------------------------------------
// Zeichen senden
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)))
{
}
UDR = c;
return 0;
}
//------------------------------------------------------------------------------------------
//String senden
void uart_puts(char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//------------------------------------------------------------------------------------------
//Zeichen empfangen
uint8_t uart_getc(void)
{
while (!(UCSRA & (1<<RXC))) //warten bis Zeichen verfügbar
;
return UDR; //Zeichen aus UDR an Aufrufer zurückgeben
}
//------------------------------------------------------------------------------------------
//Sting empfangen
void uart_gets(char *Buffer, uint8_t MaxLen)
{
uint8_t NextChar;
uint8_t StringLen = 0;
NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
// Sammle solange Zeichen, bis:
// * entweder das String Ende Zeichen kam
// * oder das aufnehmende Array voll ist
while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
*Buffer++ = NextChar;
StringLen++;
NextChar = uart_getc();
}
// Noch ein '\0' anhängen um einen Standard
// C-String daraus zu machen
*Buffer = '\0';
}
//------------------------------------------------------------------------------------------
//Hauptprogramm
int main(void)
{
int Line[5]; //Array vom Typ int
char Buffer[9]; //String mit maximal 8 zeichen
int a;
DDRB = 0xFF;
PORTB = 0xFF;
uart_init(); // UART einstellen
while (1)
{
if ((UCSRA & (1<<RXC))) //überprüfen ob neue Zeichen vorhanden sind
{
uart_gets(Line, sizeof(Line)); //Zeichen wurden empfangen, jetzt abholen
a=atoi (Line); //aus Text eine Zahl machen
itoa (Line, Buffer, 10); // Aus der Variablen a ein Text erstellen
uart_puts("j"); //Senden festen Buchstaben j
else
{
uart_puts("a"); //Senden festen Buchstaben a
PORTB = 0b00000000;
delay_ms(1000);
PORTB = 0b00001111;
delay_ms(1000);
PORTB = 0b11110000;
delay_ms(1000);
PORTB = 0b11111111;
delay_ms(1000);
}
}
}
Wenn ich die Daten-oder die Stoppbits verstelle, bekomme ich gar nichts mehr angezeigt.
Also müsten diese ja auch stimmen.