UART Problem mit String

Gast #430996
Lesenswert?
• ▲
▼
Hy

Habe folgendes zusammengeschustert aber irgendwie will er mir nix 
ausgeben !! Mega8l & MyAVR Board 1.5

Es soll über den AD die Spannung vom Poti eingelesen werden. Der Wert 
wird per PWM an den Summer geschlossen

Das klappt wunderbar.

Aber die Ausgabe per R232 will einfach nicht!!

wo liegt der Fehler??

hier das Programm

#define   F_CPU 3686400
#define BAUD    9600
#define UBRR_BAUD  ((F_CPU/(16*BAUD))-1)
#include  <avr/io.h>

int zeichen(unsigned char c)
{
  while(!(UCSRC & (1 << UDRE)));   // Abfrage ob senden möglich
  UDR = c;        // Senderegister
  return 0;
}

void string(char *s)
{
  while (*s)
  {
    zeichen(*s);
    s++;
  }
}

int main (void)
{

  DDRB = 0xFF;
  int b = 0;
  ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS2);

  for (;;)
  {
    ADMUX = 0;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) )
    {}
    b = ADCW;
    b = ~b>>2;
    TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
    TCCR1B = (1<<CS11);
    OCR1A = (b/30);
    DDRB = 0x02;  //Summer Ausgabe
    UBRRH = (UBRR_BAUD>>8);
    UBRRL = UBRR_BAUD;
    string(b);

  }

}
#431008
Lesenswert?
• ▲
▼
Deine RS232 ist ja gar nicht initialisiert.
Schau mal ins AVR-Gcc Tutorial. Da sind alle Schritte
drin, die du machen musst um eine RS232 in Betrieb zu nehmen.

Weiters:
Initialisiert wird eine Baugruppe nur einmal.
Es ist daher nicht so gut, wenn du das in der for-Schleife
immer und immer wieder machst. Im besten Fall passiert
dabei gar nichts und du verplemperst nur Zeit. Im schlimmsten
Fall würgt dir die erneute Initialisierung eine laufende
Operation auf dieser Baugruppe ab.
Gast #431026
Lesenswert?
• ▲
▼
ok danke für den Tip.

Ich hab die Initialisierung oben vor die Schleife gepackt und zur 
Einfachheit erstmal nur ein Zeichen zur Ausgabe in die Mainfunktion 
gepackt.

Nutze das Program Terminal. Verbindung 9600, Data Bits 8, Parity none, 
handshake none.

leider kommt nix trotz dem dauersenden der for schleife nix an?

#define   F_CPU 3686400
#define BAUD    9600
#define UBRR_BAUD  ((F_CPU/(16*BAUD))-1)
#include  <avr/io.h>

int zeichen(unsigned char c)
{
 while(!(UCSRC & (1 << UDRE)));   // Abfrage ob senden mšglich
 UDR = c;        // Senderegister
 return 0;
 }

 void string(char *s)
 {
 while (*s)
 {    zeichen(*s);
     s++;

 }
 }

 int main (void){
 DDRB = 0xFF;
 int b = 0;
 ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS2);

 UCSRB |= (1<<TXEN);
 UCSRC |= (1<<URSEL)|(3<<UCSZ0);
 UBRRH = (UBRR_BAUD>>8);
 UBRRL = UBRR_BAUD;

 for (;;)
 {
 ADMUX = 0;
 ADCSRA |= _BV(ADSC);
 while (ADCSRA & _BV(ADSC) )
 {}
 b = ADCW;
 b = ~b>>2;
 TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
 TCCR1B = (1<<CS11);
 OCR1A = (b/30);
 DDRB = 0x02;  //Summer Ausgabe
 zeichen('a');
 }
}
#431045
Lesenswert?
• ▲
▼

>  while(!(UCSRC & (1 << UDRE)));

Das UDRE Bit ist im Register UCSRA, nicht UCSRC

Anbei ein auf einem Mega8 getestetes Pgm.

#define F_CPU    3686400UL

#include <avr/io.h>
#include <inttypes.h>

#define BAUD     19200UL
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)

int uart_putc(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))
    ;

  UDR = c;
  return 0;
}

uint8_t uart_getc(void)
{
  while (!(UCSRA & (1<<RXC)))
    ;
  return UDR;
}

void uart_puts( char* str )
{
  while( *str )
    uart_putc( *str++ );
}

int main(void)
{
  UCSRB   |= (1 << TXEN) | ( 1 << RXEN );  // UART TX, RX einschalten
  UCSRC   |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
  UBRRH  = (uint8_t) (UBRR_BAUD>>8);  // USART Baud
  UBRRL  = (uint8_t) UBRR_BAUD;

  uart_puts( "\r**** ATMega8 ****\r" );
  uart_puts( "Hallo World\r" );

  while( 1 ) {
    char c = uart_getc();

    if( c == 0x08 ) {
      uart_putc( 0x08 );
      uart_putc( ' ' );
      uart_putc( 0x08 );
    }
    else {
      uart_putc( c );
    }
  }
}
Gast #431180
Lesenswert?
• ▲
▼
mhhh vielen Dank für den Script...

leider gibt er das nie aus:

uart_puts( "\r**** ATMega8 ****\r" );
  uart_puts( "Hallo World\r" );

Wenn ich was sende, kommt es auch zurück das klappt teils gut

h,i,j,k,m,l,werden richtig übertragen
a,b,g,o nur zeichen

liegt das evtl an nicht 100% rrichtiger interer Frequenz?
#431270
Lesenswert?
• ▲
▼
Bei solchen Sachen dimensioniere ich meist
grosszügig. Ob da jetzt temporär am Stack
7 oder 10 chars reserviert werden, spielt keine
Rolle.
Ich hab allerdings schon genügend Programme gesehen,
bei denen sich der Programmierer knausrig gezeigt
hat, manchmal auch zu knausrig, und das Array überlaufen
hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren