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
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
Vielleichts nochmals anders:
Wenn ich das hier habe, funktioniert es:
1
intsenden(void)
2
{
3
4
5
while(!(UCSRA&(1<<UDRE))){
6
}
7
8
UDR='t';
Wenn ich das hier mache:
1
intsenden(void)
2
{
3
4
5
chars[7];
6
int16_ti=-12345;
7
8
uart_init();
9
10
itoa(i,s,10);// 10 fuer radix -> Dezimalsystem
11
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...
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
1
intuart_putc(unsignedcharc)
2
{
3
while(!(UCSRA&(1<<UDRE)))/* warten bis Senden moeglich */
4
{
5
}
6
7
UDR=c;/* sende Zeichen */
8
return0;
9
}
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
1
voiduart_puts(char*String)
2
{
3
while(*String!='\0'){
4
uart_putc(*String);
5
String++;
6
}
7
}
und diese Funktion kannst du jetzt verwenden, wenn du einen String
versenden willst
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.
> 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
1
intmain()
2
{
3
senden();
4
}
5
6
voidsenden(void)
7
{
8
}
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)
1
voidsenden(void)
2
{
3
}
4
5
intmain()
6
{
7
senden();
8
}
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!
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.)
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<inttypes.h>
4
#include<stdlib.h>
5
6
#ifndef F_CPU
7
#define F_CPU 8000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
8
#endif
9
#include<util/delay.h>
10
#define BAUD 9600L // Baudrate, das L am Ende ist wichtig,NICHT UL verwenden!
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...
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?
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.
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.
1
chars[10];
2
3
itoa(ADCW,s,10);
4
uart_puts(s);
PS: Ich weiß nicht ob ich es schon erwähnt habe, aber es wird
DRINGEND Zeit für ein C-Buch
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
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
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.
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.
>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...