Forum: Mikrocontroller und Digitale Elektronik Quode abgeschrieben zum testen und Kompelirungsfehler


von Martin X. (martin007)


Lesenswert?

Hallo

Ich wollte den Atmal mega 8 in C anfangen mein erstes Ziel sollte sein 
Per UART etwas zu senden, das zweite ziel währe ein Registerinhalt mit 
den UART zu senden.

Mein Problem ist das ich Kompelirungsfehler bekomme obwohl ich das 
richtig abgeschrieben habe der Quode kommt aus dem AVR Lehrbuch:
1
/
2
//---------------------------------------------------------------------------
3
// Title      :Rahmen für ein AVR C-Programm
4
// Date        :28.10.2005
5
// Version    :1.1
6
// Autor      :Dipl. Ing. Päd. Alexander Huwaldt
7
//---------------------------------------------------------------------------
8
#define F_CPU 3686400
9
#include <avr\io.h>
10
#include <avr\wdt.h>
11
12
// einleiten
13
void initUART ()
14
{
15
  UBRRL = 23;
16
  UCSRB = 8;
17
}
18
void putChar (char data)
19
{
20
  while (!(UCSRA & 32));
21
  UDR =data;
22
  }
23
  
24
void print (char buffer [] )
25
{
26
for (int i=0; buffer [i] !=0; i++)
27
putChar (buffer [i]);
28
}
29
main ()
30
{
31
initUART ();
32
while (true)
33
{
34
print ("hallo welt.!") ;
35
}
36
}

folgende fehler bekomme ich
Kompiliere die Datei ucart.cc.
ucart.cc: In function 'int main()':
ucart.cc:35: warning: deprecated conversion from string constant to 
'char*'
Ende.


was habe ich falsch gemacht??
sage schonmal danke

Martin

von Simon K. (simon) Benutzerseite


Lesenswert?

Die Formatierung ist aber wirklich ekelhaft.
Probier mal statt
1
void print (char buffer [] )
das:
1
void print (const char buffer [] )

von Martin X. (martin007)


Lesenswert?

Hallo

@ Simon Sorry wegen den C werde ich das nächstemal besser machen

Blos warum tut der Quode aus dem Buch nicht?
Wenn ich das Richtig verstehe habe ich jetzt einen Schreibgeschützen 
wert/Vareabele deffenirt mit dem Namen buffer aber kann ich den da jetzt 
einfach anstat "halloxxx" den Inhalt des Registers 16 ausgeben?Ich 
stelle mir das so vor
1
print r16 ;

Hmm Sage schonmal Danke

von Daniel H. (doomstar)


Lesenswert?

Hi,

bei deiner Funktion initUART() fehlt noch ein wenig mehr um den Uart zum 
laufen zu bekommen

Schau dir mal bitte das Datenblatt der Controllers an.

Da gibt es noch die Register UCSRB und UCSRC wo der UART eingestellt 
werden muss.

im Register UCSRB z.b. must du erstmal TXEN uaf 1 setzen damit der UART 
überhabt senden kann. Im Register UCSRC sind die Einstellungen 
vorzunehmen
Wie die Daten Nachricht auszusehen hat.

Hier mal eine Init von mir.

//Funktion zur Initialisierung
void init_usart ()
{
  UBRRH = 0; // Highbyte ist 0;
  UBRRL = 103; //Lowbyte
  UCSRB |= (1<<TXEN) | (1<<RXEN);  //UART TX & RX einschalten
  UCSRC |= (1<<URSEL) | (3<<UCSZ0); //Modus Asynchron 8N1
}

von Martin X. (martin007)


Lesenswert?

Hallo

Der Quode leuft aber so mit den oben geschrieben änderungen.
Lese das myAVR Contolcenter V2.0 und damit bekomme ich mein Text 
ausgegeben.
Ich muß dazuschreiben das ich das ich das mySmartUSB Modul nutze.( kan 
sein das es daran liegt)

Aber die gebe ich den jetzt den Inhalt eines Registers über aus, Später 
will ich das auf ein LCD ausgeben wollte aber erst klein anfangen.

THX


martin

von Simon K. (simon) Benutzerseite


Lesenswert?

Der Code ist aus einem Buch? Ohne const aber mit dem Aufruf 
"print("hallo welt!"); ?
Wenn ja: Schmeiß das Buch weg!

von Daniel H. (doomstar)


Lesenswert?

Hi,

hab noch nicht soviel Ahnung aber diese Zeile aus dem Buch
Print r16;

sieht für mich verwierend aus (sieht aus wie ein mix aus c und 
Assembler)

Was ist den in dem Register 16 drinne nicht das es leer ist und deswegen 
nichts kommt.

versuch doch mal ein Char variable anzulegen und dann diese dann per
Funktion putchar(variable) an dich zu senden.

Gruß

von Martin X. (martin007)


Angehängte Dateien:

Lesenswert?

So wie man erraten kann bin ich ein neuling in der MIC Welt.
Ich habe mir das Set "Mikrocontroller Einsteigerset PLUS" von myavr 
erworben.
da ist erstmal alles in Assambler beschrieben und nur 4 Seiten in C was 
ich schade finde aber egal.
Da ich nicht alles in Assambler schreiben will und kann wollte ich mit c 
weitermachen und so bin ich aus das Problem gestoßen.
Als Anhang die Betreffende Seite.
Wie soll ich das Sonst anfangen zu Lernen wen nicht mit einem 
Einsteigerset.

Hmm

Martin

von Martin X. (martin007)


Lesenswert?

Daniel H. schrieb:
> Hi,
>
> hab noch nicht soviel Ahnung aber diese Zeile aus dem Buch
> Print r16;

Da haste mich falsch verstanden oder ich habe mich falsch ausgerückt.
ICh wollte ein Register ausgeben und das war mein vorschlag mir war klar 
das das mit gehen wird aber wie mache ich das die übergebe ich ein wert 
das er ausgegeben wird?
Gehen wir einfach davon aus das da ein wert kommt der über einen Pin 
gemessen wurde ein Analogwert.

Martin

von P. S. (Gast)


Lesenswert?

Wenn du C lernen willst, solltest du das mit einem ordentlichen C-Buch 
(Immer ncoh gut: Kernighan & Ritchie) auf einem "normalen" System 
machen, nicht mit dem Mikrocontroller.

von Martin X. (martin007)


Lesenswert?

Hallo

ich habe mir das Buch Moderne C-Programmirung gekauft aber das ist schon 
etwas her das problem ist das da kenntnise verausgesetzt werden...
mal schauen was ich da mache.
Wenn da noch empfelungen kommen dan bin ich für alles offen

martin

von Marci W. (Gast)


Lesenswert?

Martin X. schrieb:
> Hallo
>
> ich habe mir das Buch Moderne C-Programmirung gekauft aber das ist schon
> etwas her das problem ist das da kenntnise verausgesetzt werden...
> mal schauen was ich da mache.
> Wenn da noch empfelungen kommen dan bin ich für alles offen
>
> martin

"C von A bis Z", gibt's auch als kostenlose Onlineversion. Fängt 
eigentlich ganz vorne an. Kannst ja mal reinschauen. Das Buch gibt's 
hier online:

http://openbook.galileocomputing.de/c_von_a_bis_z/

Vielen Dank an der Verlag für das OpenBook!

ciao

Marcus

von Martin X. (martin007)


Lesenswert?

@  Marcus Woletz

ok Danke für diesen tip ich schaue da mal rein und da ich auf gedruckte 
werke stehe werde ich das eventuell auch kaufen mal schauen.(kan man 
auch mal in die Ecke werfen :) )
für mich ist der Beitrag vertig Bedanke mich an dieser stelle und werde 
später nochmal auf euch zurückkommen...

Martin

von Rolf Magnus (Gast)


Lesenswert?

Wenn es sich um C-Code handelt, solltest du es auch als C übersetzen und 
nicht als C++.

von Simon K. (simon) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Wenn es sich um C-Code handelt, solltest du es auch als C übersetzen und
> nicht als C++.

Ich würde es nicht ausschließen, dass es so in seinem Buch stand. Hast 
du dir mal oben den PDF Anhang angeschaut? Das ist Programmierstil 
unterster Kategorie. Sowas in nem "Lehrbuch"...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

@ Martin X.

Du hast nix falsch gemacht.

Dein Compiler behandelt per Voreinstellung den String "hallo welt.!" als 
konstant. Und erzeugt dementsprechend auch einen Zeiger "const char *", 
der an die Funktion print() übergeben wird.

Die Funktion print hingegen nimmt als Argument ein nichtkonstantes 
Feld von char Elementen bzw. vereinfacht einen Zeiger auf "char *".

Es beissen sich also einmal "const char *" bei der Übergabe und "char *" 
bei der Funktion selber.

Dementsprechend gibt der Compiler auch eine Warnung aus, dass die 
bisher übliche automatische Umwandlung ineinander deprecated (=engl. 
für missbilligt) der jetzigen und künftigen Compilerversionen bzw. 
Sprachstandards ist.

Man kann die Warnung umgehen, indem man die Voreinstellung des Compilers 
ändert (-Wwrite-strings Argument): 
http://babbage.cs.qc.edu/courses/cs701/Writeable_Strings.html

von Simon K. (simon) Benutzerseite


Lesenswert?

Stefan B. schrieb:
> Man kann die Warnung umgehen, indem man die Voreinstellung des Compilers
> ändert (-Wwrite-strings Argument):
> http://babbage.cs.qc.edu/courses/cs701/Writeable_Strings.html

Warum sollte man das machen? Das Programm von vornherein sauber zu 
schreiben ist nicht nur einfacher, sondern auch richtiger.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich habe nicht geschrieben "man sollte" sondern "man kann" ;-)

Wenn ein Kurs auf dem Verhalten aufsetzt und man den Kurs so durchführen 
will oder muss, sollte man sich an die Eingangsvoraussetzungen halten. 
Wenn man weiss, wieso etwas gemacht wurde und man Erfahrung gewonnen 
hat, kann man auch den Pfad des Kurses verlassen. Anfangs ist es aber 
meist sicherer/einfacher auf dem Pfad zu bleiben.

von Gast (Gast)


Lesenswert?

> Quode

Würdig einer Konrad-Duden-Medaille für besonders kreative 
Orthografieunfälle.

von Da D. (dieter)


Lesenswert?

Kompelirung is aber auch ganz weit vorne, bei den peinlichsten 
Orthografieunfällen.

von Marci W. (Gast)


Lesenswert?

Hallo Leute,

Da Dieter schrieb:
> Kompelirung is aber auch ganz weit vorne, bei den peinlichsten
> Orthografieunfällen.

auch ich sehe mangelhafte Orthografie überhaupt nicht gerne. Allerdings 
sollte man dringend unterscheiden, ob sich Fehler aufgrund mangelnder 
Sorgfalt (sehr ärgerlich) oder aus anderen Gründen, die der Autor 
vielleicht nicht selbst zu verantworten hat, eingeschlichen haben. Mehr 
möchte ich dazu nicht sagen, um dem OP nicht zu nahe zu treten.

ciao

Marcus

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
Noch kein Account? Hier anmelden.