Gast
#2316578
Hallo zusammen,
Habe ein kleines Problem. Möchte eine Zahl über ein Terminalprogramm
einlesen und diese dann als Integer in einer Variablen speichern. Danach
soll die Zahl zur Kontrolle wieder ausgegeben werden. Das funktioniert
auch soweit schon recht gut, allerdings soll die Variable bis zur ersten
Eingabe schon einen vorbestimmten Wert besitzen und diesen dann erst bei
der ersten Eingabe ändern. Habe versucht diesen Wert in den String
einzugeben, allerdings bekomme ich bisher immer nur Null zurück. Würde
mich freuen wenn mir jemand einen Tip geben könnte.
Gruß Andreas
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
#define BAUD 9600UL
#define UBRR_BAUD ((F_CPU/(8UL*BAUD))-1)
#define UART_MAXSTRLEN 5
volatile uint16_t x;
volatile uint8_t uart_str_complete = 0; // 1 .. String komplett
empfangen
volatile uint8_t uart_str_count = 0;
char uart_string[6] = "2200";
char s [5];
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRR3H = (uint8_t) (UBRR_BAUD>>8);
UBRR3L = (uint8_t) (UBRR_BAUD);
UCSR3A= (1<<U2X3); // U2X auf LO
// Aktivieren von receiver und transmitter
UCSR3B = (1<<RXEN3)|(1<<TXEN3)|(1<<RXCIE3);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSR3C = (1<<UCSZ31)|(1<<UCSZ30);
}
int uart_putc(unsigned char c)
{
while (!(UCSR3A & (1<<UDRE3))) /* warten bis Senden moeglich */
{
}
UDR3 = c; /* sende Zeichen */
return 0;
}
void uart_puts (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem
"String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
int main(void)
{
TCCR3B = (1<<CS32) | (1<<CS30); //Timer 3 initalisieren (Prescaler
1024)
TIMSK3 |= (1<<TOIE3); //Timer 3 overflow erlauben
TCCR4A = (1<<WGM41) | (1<<COM4C1); //PWM Mode 14
TCCR4B = (1<<WGM42) | (1<<WGM43) | (1<<CS41); //PWM Mode 14 und
Prescaler 8
ICR4 = 40000; //PWM Frequenz 50Hz (50Hz=16MHz/8*40000)
//OCR4C = x; //An-Zeit 1,5ms (16MHz*1,5ms/8)
DDRH |= (1<<PH5); //OCR4C auf Ausgang
uart_init(); // USART initialisieren
sei();
while (1)
{
char tmp[5];
strcpy ( tmp, uart_string);
uint16_t x = atoi( tmp );
OCR4C = x;
}
}
ISR(USART3_RX_vect)
{
unsigned char nextChar;
// Daten aus dem Puffer lesen
nextChar = UDR3;
if( uart_str_complete == 0 ) { // wenn uart_string gerade in
Verwendung, neues Zeichen verwerfen
// Daten werden erst in uart_string geschrieben, wenn nicht
String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
if( nextChar != '\n' &&
nextChar != '\r' &&
uart_str_count < UART_MAXSTRLEN - 1 ) {
uart_string[uart_str_count] = nextChar;
uart_str_count++;
}
else {
uart_string[uart_str_count] = '\0';
uart_str_count = 0;
uart_str_complete = 0;
}
}
}
ISR (TIMER3_OVF_vect)
{
itoa (x, s, 10);
strcat ( s, " ");
uart_puts(s);
}