Hi Leute ich würde gern, dass was ich eingelesen habe auf RXD Wieder auf
TXD ausgeben als CHAR
Ich steh auf der Leitung,.... gibt nix aus:
/*
* C2T3_v1.c
*
* Created: 28.05.2017 16:13:26
* Author : Gert
*/
#include <avr/io.h>
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>
#include <util/delay.h>
#define FOSC 16000000
#define MYUBRR 51
void uart_init(void)
{
cli();
//1 = output, 0 = input
// DDRB = 0b11101111; //PB4 = MISO
// DDRC = 0b11111110; //
DDRD = 0b11111110; //PORTD (RX on PD0)
//USART Baud rate: 56700
UBRR0H = (MYUBRR >> 8);
UBRR0L = MYUBRR;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);//|(1<<RXCIE0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
UCSR0A = (1<<U2X0);
}
int uart_putc(unsigned char c)
{
while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}
UDR0 = c; /* 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++;
}
}
/* Zeichen empfangen */
uint8_t uart_getc(void)
{ PORTD |= (1 << PORTD3);
while (!(UCSR0A & (1<<RXC0))) // warten bis Zeichen verfuegbar
return UDR0; // Zeichen aus UDR an Aufrufer
zurueckgeben
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
}
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';
}
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}
int main(void)
{
char char_array[] = { "Programm gestartet" };
char char_array2[] = { "A" };
// Pufferspeicher ausreichend groß
// evtl. Vorzeichen + width + Endezeichen:
//char s[8];
float f = -12.345;
// int16_t i = -12345;
uint16_t adcval;
ADC_Init();
uart_init();
PORTD |= (1 << PORTD3);
_delay_ms(5000);
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
uart_puts(char_array);
char str[2];
/* Replace with your application code */
while (1)
{
char Line[40]; // String mit maximal 39 zeichen
uart_gets( Line, sizeof( Line ) );
uart_puts(Line);
}
return 0;
}
1 | /* Zeichen empfangen */
|
2 | uint8_t uart_getc(void) |
3 | { PORTD |= (1 << PORTD3); |
4 | while (!(UCSR0A & (1<<RXC0))) // warten bis Zeichen verfuegbar |
5 | |
6 | return UDR0; // Zeichen aus UDR an Aufrufer |
7 | zurueckgeben
|
8 | PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen |
9 | }
|
Entweder Semikolon vergessen, oder verquere Logik (je nachdem wie du dir das eigentlich gedacht hattest). Bitte beim nächsten Mal für den Code entsprechende Tags verwenden. Und ein neuer Thread unter neuem Nick wäre jetzt auch nicht unbedingt nötig gewesen.
du meinst so:
uint8_t uart_getc(void)
{ PORTD |= (1 << PORTD3);
while (!(UCSR0A & (1<<RXC0))) // warten bis Zeichen verfuegbar
{ }
return UDR0; // Zeichen aus UDR an Aufrufer
zurueckgeben
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
}
Hallo,
Kann mir wer helfen stehe vor einem völlig komischenProblem:
Wenn ich dieses Programm ausführe und ich per UART ein M sende Startet
sich das Programm Neu: von Vorne...
Woran kann das liegen?
/*
* C2T3_v1.c
*
* Created: 28.05.2017 16:13:26
* Author : Gert
*/
#include <avr/io.h>
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>
#include <util/delay.h>
#define FOSC 16000000
#define MYUBRR 51
// Globale Variablen
int Messung =0;
int Zeitintervall = 1000;
void uart_init(void)
{
cli();
//1 = output, 0 = input
// DDRB = 0b11101111; //PB4 = MISO
// DDRC = 0b11111110; //
DDRD = 0b11111110; //PORTD (RX on PD0)
//USART Baud rate: 56700
UBRR0H = (MYUBRR >> 8);
UBRR0L = MYUBRR;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
UCSR0A = (1<<U2X0);
// stdout = &mystdout; //Required for printf init
// UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // UART RX, TX und
RX Interrupt einschalten
sei();
}
// Serielle Ausgabe:
/* ATmega16 */
int uart_putc(unsigned char c)
{
while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */
{
}
UDR0 = c; /* 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++;
}
}
volatile char uart_ausgabe[50] = "";
#define UART_MAXSTRLEN 5
volatile uint8_t uart_str_complete = 0; // 1 .. String komplett
empfangen
volatile uint8_t uart_str_count = 0;
volatile char uart_string[UART_MAXSTRLEN + 1] = "";
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}
ISR(USART0_RX_vect)
{ //PB0 im PORTB setzen
unsigned char nextChar;
// Daten aus dem Puffer lesen
nextChar = UDR0;
if( uart_str_complete == 0 ) { // wenn uart_string gerade in
Verwendung, neues Zeichen verwerfen
PORTD |= (1 << PORTD3);
// 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 ) {
uart_string[uart_str_count] = nextChar;
uart_str_count++;
}
else {
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
uart_string[uart_str_count] = '\0';
uart_str_count = 0;
uart_str_complete = 1;
}
}
}
// ADC
void ADC_Init(void)
{
// die Versorgungsspannung AVcc als Referenz wählen:
ADMUX = (1<<REFS0);
// oder interne Referenzspannung als Referenz für den ADC wählen:
// ADMUX = (1<<REFS1) | (1<<REFS0);
// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
// schon auf 0, also single conversion
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der
Konvertierung warten
}
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
(void) ADCW;
}
uint16_t ADC_Read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single
conversion"
while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung
warten
}
return ADCW; // ADC auslesen und zurückgeben
}
/* ADC Mehrfachmessung mit Mittelwertbbildung */
/* beachte: Wertebereich der Summenvariablen */
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples )
{
uint32_t sum = 0;
for (uint8_t i = 0; i < nsamples; ++i ) {
sum += ADC_Read( channel );
}
return (uint16_t)( sum / nsamples );
}
/* Beispielaufrufe: */
int main(void)
{ cli();
char Programm_gestartet[] = { "Programm gestartet" };
char Messungstartstring[] = { "Messung gestartet" };
char Messungstoppstring[] = { "Messung gestoppt" };
char Messungszeit000string[] = "Messung so schnell als möglich";
char Messungszeit100string[] = "Messung alle 100ms";
char Messungszeit500string[] = "Messung alle 500ms";
char Messungszeit1000string[] = "Messung alle 1000ms";
char Messungszeit2000string[] = "Messung alle 2000ms";
char Messungszeit5000string[] = "Messung alle 5000ms";
// Vergleichsstrings
char Messungstart[] = "M";
char Messungstopp[] = "S";
char Messungszeit000[] = "Z000";
char Messungszeit100[] = "Z100";
char Messungszeit500[] = "Z500";
char Messungszeit1000[] = "Z1000";
char Messungszeit2000[] = "Z2000";
char Messungszeit5000[] = "Z5000";
uint16_t adcval;
ADC_Init();
uart_init();
PORTD |= (1 << PORTD3);
_delay_ms(10000);
uart_puts(Programm_gestartet);
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
sei();
/* Replace with your application code */
while (1)
{
if(uart_str_complete)
{
//uart_puts(uart_string);
USART_Flush();
if(strcmp(uart_string, Messungstart) == 0)
{
uart_puts(Messungstartstring);
Messung = 1;
}
if(strcmp(uart_string, Messungstopp) == 0)
{
uart_puts(Messungstoppstring);
Messung = 0;
}
if(strcmp(uart_string, Messungszeit000) == 0)
{
uart_puts(Messungszeit000string);
Zeitintervall = 0;
}
if(strcmp(uart_string, Messungszeit100) == 0)
{
uart_puts(Messungszeit100string);
Zeitintervall = 100;
}
if(strcmp(uart_string, Messungszeit500) == 0)
{
uart_puts(Messungszeit500string);
Zeitintervall = 500;
}
if(strcmp(uart_string, Messungszeit1000) == 0)
{
uart_puts(Messungszeit1000string);
Zeitintervall = 1000;
}
if(strcmp(uart_string, Messungszeit2000) == 0)
{
uart_puts(Messungszeit2000string);
Zeitintervall = 2000;
}
if(strcmp(uart_string, Messungszeit5000) == 0)
{
uart_puts(Messungszeit5000string);
Zeitintervall = 5000;
}
uart_str_complete = 0;
}
if (Messung == 1)
{ USART_Flush();
adcval = ADC_Read(PORTA0);
strcat(uart_ausgabe, itoa(adcval,uart_ausgabe,10));
uart_puts(Messungstartstring);
}
}
return 0;
}
Es muss etwas mit ADC zu tun haben.
T.A. schrieb: > Es muss etwas mit ADC zu tun haben. Dann minimiere dein Code doch mal soweit, dass das Problem noch auftritt und alles unnötige rausgelöscht ist, lerne dann wie man Dateianhänge benutzt und die [ c ] und [ /c ] Formattierungscodes.
1 | strcat(uart_ausgabe, itoa(adcval,uart_ausgabe,10)); |
Das ist eine echt kreative Art, das Programm abzuschießen. ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.