mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Wert über RS232 übermitteln


Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Was möchte ich mache: ADC Signal auf den PC durch RS232 einspielen. Also 
den Bitwert übermitteln.

Was wurde gemacht:
1. ATMega8 und Übermittlung eines Zeichen x und weitere!
2. Zusammenbau eines Converters, welcher das Signal von Mikrokontroller 
auf RS232 umwandelt und dessen Übermittlung und Darstellung von x in 
Hyperterminal.
2. ADC Wandlung funktioniert (ADMUX = 0), schaltet LEDs an ab 800bit.

Was geht noch nicht:
Übermittlung des ADC-Wertes

wie kann ich das realisieren? Ich muss ja irgend wie den Bitwert 
auftrennen und einzeln übermittel. z.B. wenn ich Bitwert von 300habe 
dann übermittle ich zuerst das 3 dann die 0 und nochmals eine 0. und 
irgend ein Trennzeichen z.B. ; wäre gut.

Gruss Fox

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf() ist eine einfache Möglichkeit.

Autor: rooot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

puts(char *), putchar( char )

ist besser


prinf (scanf) sind zwar oft verwendet, aber sehr kompliziertesten 
Funktionen

printf (conio.h, stdio.h) braucht ca. 1k Speicher

Ich weis nicht ob das in diesem Projekt relevant ist (glaube eher 
nicht), vor allem bei µC Programmen ist auf solche dinge zu achten

mfg
rooot

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Buchstaben werden ja einzeln übermitteln.

    UDR = 'x';          // auch UDR = 0b00101000;
    while (!(UCSRA & (1<<UDRE))) {
  }


jetzt muss ich da putchar( char ) irgend etwas machen?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReadChannel ist die Funktion aus dem AVR-Tutorial und es wird die RS232 
Lib von Fleury verwendet.

//var

char buffer[7];
uint16_t adcval;

//senden

adcval = ReadChannel(0);
itoa(adcval,buffer,10);
uart_puts(buffer);


Funktioniert einwandfrei bei mir...

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bekomme ein Error. wo muss ich das jetzt bei meinem Code einbauen?

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch von hier (Schreiben von Zeichenkette:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...


Das versucht:
int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
}

klappt aber leider nicht.

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, dann lass uns doch nicht im Regen stehen. Was für ein Error kommt 
denn?

Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So bekomme kein Error, jedoch sendet es mir nur eine 0!
Wo ist der Fehler?

Der wichtigste Ausschnitt:

char s[7];
int16_t i = value;
itoa( i, s, 10 );
UDR = s;


Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleichts nochmals anders:

Wenn ich das hier habe, funktioniert es:
int senden(void)
{


    while (!(UCSRA & (1<<UDRE))) {
  }

    UDR = 't';


Wenn ich das hier mache:
int senden(void)
{


   char s[7];
   int16_t i = -12345;
   
   uart_init();
 
   itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
   uart_puts( s );
 


Es kommen die Errors:

../Projekt0006.c: In function 'main':
../Projekt0006.c:49: warning: implicit declaration of function 'senden'
../Projekt0006.c: In function 'senden':
../Projekt0006.c:62: warning: implicit declaration of function 
'uart_init'
../Projekt0006.c:65: warning: implicit declaration of function 
'uart_puts'
../Projekt0006.c:108: warning: no return statement in function returning 
non-void
avr-gcc.exe -mmcu=atmega8 -Wl,-Map=Projekt0006.map Projekt0006.o     -o 
Projekt0006.elf
Projekt0006.o: In function `senden':
C:\(Meine Daten)\Privat\(AVR 
Projekte)\Projekte\default/../Projekt0006.c:62: undefined reference to 
`uart_init'
C:\(Meine Daten)\Privat\(AVR 
Projekte)\Projekte\default/../Projekt0006.c:65: undefined reference to 
`uart_puts'
make: *** [Projekt0006.elf] Error 1
Build failed with 2 errors and 4 warnings...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst noch den Unterschied zwischen einem einzelnen Zeichen
und einem String verinnerlichen.
Ein einzelnes Zeichen ist einfach nur ein einzelnes Zeichen.
Ein char ist so etwas. Aber auch 'x' oder 'a' oder '8'.

Deine Funktion
int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
}

kann nur ein einzelnes Zeichen versenden.

Und jetzt kommt itoa ins Spiel und damit auch Strings. Strings
sind Abfolgen von Zeichen, wobei vereinbarungsgemäß das letzte
Zeichen des Strings das '\0' Zeichen ist.

Hmm. Ein String sind also mehrere Zeichen. uart_putc kann aber nur
ein einzelnes Zeichen versenden. Das passt nicht zusammen.

Also wirst du dir wohl eine Funktion basteln müssen, die einen
String (also eine Abfolge von mehreren Zeichen) versenden kann.
Die kann durchaus auf uart_putc zurückgreifen.

Hier ist zb eine

void uart_puts( char* String )
{
  while( *String != '\0' ) {
    uart_putc( *String );
    String++;
  }
}

und diese Funktion kannst du jetzt verwenden, wenn du einen String
versenden willst

  ...
  uart_init();

  uart_puts( "Hallo\n" );

  char s[7];
  int16_t i = -12345;
  itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
  uart_puts( s );


PS: Schön langsam wirds Zeit für dich, etwas Literatur zu besorgen
und zu lesen.

http://www.mikrocontroller.net/articles/FAQ#Wie_ka...
http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: Rüdiger Knörig (sleipnir)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du Matlab oder den freien Clone "Octave" hast kannst Du die Werte 
auch binärcodiert übermitteln und so einfach erfassen:
fid=fopen("/dev/ttyS0","rb"); x=fread(fid,10240,"uchar"); fclose(fid); 
plot(x)

Wie die serielle Schnittstelle unter Windows angesprochen wird weiß ich 
jetzt allerdings nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es kommen die Errors:
>
> ../Projekt0006.c: In function 'main':
> ../Projekt0006.c:49: warning: implicit declaration of function 'senden'
> ../Projekt0006.c: In function 'senden':
> ../Projekt0006.c:62: warning: implicit declaration of function
> 'uart_init'
> ../Projekt0006.c:65: warning: implicit declaration of function
> 'uart_puts'
> ../Projekt0006.c:108: warning: no return statement in function returning
> non-void

Diese Warnungen/Fehler allerdings haben eine ganz andere Ursache.
Dein Compiler liest deinen Quellcode von oben nach unten. Und zwar
genau ein mal.

Wenn der Compiler oben anfängt, dann kennt er gerade mal die
C Schlüsselwörter. Jedes andere Wort ist ihm unbekannt. Zb. auch
die Namen von Funktionen.
Erst durch das Lesen des Quelltextes (von oben nach unten) wird dem
Compiler mitgeteilt, dass 'senden' kein Tippfehler ist, sondern
der Name einer Funktion und das daher der Aufruf einer derartigen
Funktion auch keinen Fehler darstellt, sondern dass es die Funktion
auch wirklich gibt.
Das geht aber nur dann, wenn man die Funktion deklariert, bevor
sie das erste mal aufgerufen wird. Wie gesagt: Der Compiler liest
nur einmal von oben nach unten. Kommt der Aufruf vor der Deklaration,
so wie hier
int main()
{
  senden();
}

void senden( void )
{
}
dann hat der Compiler beim Aufruf der Funktion ein Problem. Er weiss
ja nicht, dass es tatsächlich eine Funktion namens 'senden' gibt.
Er hat sie ja bisher noch nicht gesehen, denn soweit hat er ganz
einfach nicht gelesen.
Also muss man das ganze umdrehen (es gibt noch eine 2.te Möglichkeit,
aber darüber erzähle ich jetzt nichts)
void senden( void )
{
}

int main()
{
  senden();
}

Wenn man diesen Text von oben nach unten liest, dann taucht zuerst
die Vereinbarung für senden auf. Der Compiler registriert diese
und merkt sich, dass es eine Funktion dieses Namens gibt.
Wenn er dann weiter liest und den Aufruf der Funktion findet, geht
er seine internen Tabellen durch und findet dort, dass es tatsächlich
eine Funktion dieses Namens gibt.

PS: Sagte ich schon, dass es Zeit für ein Buch wird? Wenn nicht:
Es wird Zeit ein Buch über C zu lesen!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich finde die 2.Möglichkeit aber besser :-)
Sonst man spätestens bei etwas komplexeren Programmen nur noch am 
umsortieren.

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Code jetzt mal auf ein Minimum reduziert. Bitte helft mir, 
ich bin am verzweifeln!!!

Habe es genau so gemacht, wie im Tutorial. Bekomme aber ein Fehler beim 
Compilieren. Da stimmt was nicht mit:

../Projekt0006.c:26: warning: return type of 'main' is not 'int'
../Projekt0006.c: In function 'main':
../Projekt0006.c:49: warning: implicit declaration of function 
'uart_init'
../Projekt0006.c:52: warning: implicit declaration of function 
'uart_puts'
../Projekt0006.c:74: warning: 'return' with a value, in function 
returning void
../Projekt0006.c:77: error: expected declaration or statement at end of 
input
make: *** [Projekt0006.o] Error 1
Build failed with 1 errors and 4 warnings...

Ich glaub es hängt damit zusammen, dass das noch etwas von dem hier 
steht:
// hier uart_init, uart_putc, uart_puts (s.o.)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>

#ifndef F_CPU
#define F_CPU 8000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif
#include <util/delay.h>
#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig,NICHT UL verwenden!

// 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-1000) // Fehler in Promille

#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu
hoch!
#endif

/* sdsgsdfgdfg */



void main() {


    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;




  while (1)
  {


   char s[7];
   int16_t i = -12345;
   
   uart_init();
 
   itoa( i, s, 10 ); // 10 fuer radix -> Dezimalsystem
   uart_puts( s );
 
   // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt auch:
   uart_puts( itoa( i, s, 10 ) );
 
   while (1) {
      ;
   }


return(0);


}



Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe noch int main(void) { geschrieben. daher nur noch 3 Fehler:

../Projekt0006.c:5:18: error: uart.h: No such file or directory
../Projekt0006.c: In function 'main':
../Projekt0006.c:47: warning: implicit declaration of function 
'uart_init'
../Projekt0006.c:50: warning: implicit declaration of function 
'uart_puts'
../Projekt0006.c:63: error: expected declaration or statement at end of 
input
make: *** [Projekt0006.o] Error 1
Build failed with 2 errors and 2 warnings...

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal, willst du uns hier verarschen?
Karl heinz Buchegger hat dir doch mit Engelsgeduld alles erklärt?!

Ich darf dich mal zitieren:
---
Ich glaub es hängt damit zusammen, dass das noch etwas von dem hier
steht:
// hier uart_init, uart_putc, uart_puts (s.o.)
---

Und dann deinen Compiler:
---
../Projekt0006.c:47: warning: implicit declaration of function
'uart_init'
../Projekt0006.c:50: warning: implicit declaration of function
'uart_puts'
---

Klingelts?

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier hast du, hoffe es geht. Sollte für nen mega16 sein...sollte :)
#define F_CPU 8000000UL // 8MHz
#include <avr/io.h>
#include <avr/delay.h>


void init_usart() {
  UBRRH=0;
  UBRRL=51; //9600 baud
  UCSRB = (1<<TXEN); //transmitter enable
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // 8data,2stop
}


void send_char(char c) {
  while (!(UCSRA & (1<<UDRE))) {}
  UDR=c;
}

void send_string(char* s) {
  while(*s) {
    send_char(*s);
    s++;
  }
}

int main(void) {
  init_usart();
  send_string("hallo welt!\n");
  while (1) {}

  return 0;
}

Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So habs schon fast geschafft:

Kann jetzt ein String senden "Hallo !".

Wie kann ich jetzt ADCW anstatt Hallo übermitteln?

Das hier klappt nicht:   char c[] = ADCW;

Liegt glaub am Datentyp.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:
> So habs schon fast geschafft:
>
> Kann jetzt ein String senden "Hallo !".
>
> Wie kann ich jetzt ADCW anstatt Hallo übermitteln?
>
> Das hier klappt nicht:   char c[] = ADCW;
>
> Liegt glaub am Datentyp.

???
Das hatten wir doch schon mal, so vor ungefähr 10 Postings.
Du bringst mich noch soweit, dass ich ein Merkbefreiungsformular
ausfülle.
  char s[10];

  itoa( ADCW, s, 10 );
  uart_puts( s );

PS: Ich weiß nicht ob ich es schon erwähnt habe, aber es wird
DRINGEND Zeit für ein C-Buch

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke den Post. Ja habe ich schon hier, aber man braucht halt sehr viel 
Zeit für das Ganze. Bin auch erst am einsteigen. Weiss halt noch nicht 
was ich alles machen möchte. Muss mich mal herantasten.

Habe jetzt denne alle Funktionenen zusammen, die ich eigentlich brauche. 
Danach kann man ausbauen.

Habe
- C++ .Net, Ron Nanko
- Programmiertechniken für AVR-Mikrokontroller, Manfred Schwabl-Schmidt

Gruss Fox

Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja bin schon ein wenig müde...

Ja voll cool! Jetzt klappts! Vielen Dank! Ich bin sehr Glücklich!!!

Im Anhang noch den ganzen Code für den ATMega8.

Gruss Fox

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:

> Im Anhang noch den ganzen Code für den ATMega8.

Build succeeded with 5 Warnings...

Manchmal frag ich mich, wozu ich mir eigentlich den Mund
fusselig rede.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:

> - C++ .Net, Ron Nanko

Aha. Und das ist jetzt beim Versuch C zu lernen genau wie hilfreich?

> - Programmiertechniken für AVR-Mikrokontroller, Manfred Schwabl-Schmidt

Schon besser. Dürfte aber immer noch um mindestens 2 Nummern
zu komplex in deiner gegenwärtigen Situation sein.

Es hilft nichts. Du brauchst ein Buch über C. Nicht C++, nicht C#,
sondern C. Und zwar Grundlagen, keine Programmiertechniken, Grundlagen
die bei 0 anfangen.

Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Manchmal frag ich mich, wozu ich mir eigentlich den Mund
fusselig rede.

Das wir, welche nicht die grosse Ahnung haben, daraus etwas lernen! Also 
dass man sein Wissen weitergeben kann. Das ist doch auch schön...

Habe noch den Code durchgegangen. Konnte alle Warnungen beseitigen.

-------------------------------------------

Device: atmega8

Program:     390 bytes (4.8% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weiß zwar nicht, wieso du dir die Mühe mit dem Semikolon 
machst, aber eine Frage habe ich: Wieso deklarierst du Funktionen in 
einer Funktion?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.