Forum: Mikrocontroller und Digitale Elektronik C- UART Datenübertragung


von Dennis H. (denn1is)


Angehängte Dateien:

Lesenswert?

Guten Morgen

vielleicht bin ich hier richtig um ein paar Tipps und Tricks zu 
bekommen, denn ich bin ziemlich schlecht in Sachen C - Programmierung.

Ich habe vor zwei Pics über eine UART Datenübertragung kommunizieren zu 
lassen, dies funktioniert auch einwandfrei. Der Master soll einen Zähler 
inkrementieren lassen und bei 100 zurücksetzen und diesen Hex-Wert soll 
er dann an den Client schicken.

Auf der Client Seite soll dieser Hex Wert nun auf zwei 7 Segment 
Anzeigen dargestellt werden. Wenn ich nun ein switch case befehl 
einbinden, werden mir fehler angzeigt, die mich rätrseln lassen.

Vielleicht kann mir jemand weiterhelfen

Pic16F887
MPLAB
Hi Tech Compiler

Die Dateien befinden sich im Anhang

Mit freundlichen Grüßen

Dennis

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dennis Hoppen schrieb:
> Wenn ich nun ein switch case befehl
> einbinden, werden mir fehler angzeigt, die mich rätrseln lassen.

Uns lassen die auch rätseln, gerade, wo Du es unterlässt, sie zu 
beschreiben.

Sind das Fehlermeldungen Deines Compilers? Oder funktioniert Dein 
Programm nicht so, wie Du erwartest?

von Oliver S. (oliverso)


Lesenswert?

Tja, und wir rätseln jetzt, welche Fehler dir angezeigt werden 
könnten...

Ein Fehler ist: Du hast kein C-Buch.

Der zweite Fehler dürfte sein, daß deine Switch- Anweisungen außerhalb 
jeder Funktion stehen.

Oliver

von Dennis H. (denn1is)


Angehängte Dateien:

Lesenswert?

Es geht mir eigentlich eher darum wie ich zwei switch case befehl(2 
Tabellen) mit zwei verschiedenen Integerwerten, richtig einbinden kann.

hab die funktion vergessen der Fehler ist
inappropriate break/continue
case label not in switch

von Prog R. (daniel_v)


Lesenswert?

Was mir auf die Schnelle auffällt, ist:
1
void BCDcode1 (erste){........

sollte eher:
1
 
2
void BCDcode1 (int erste){........

sein, wenn das die Funktion ist.

Weiteres ist die Funktion in den Klammern {} der main() geschrieben, da 
gehört sie nicht rein - sie muss extra stehen.
Von der Main aus kannst du sie dann aufrufen.
1
void BCDcode1 (erste);

von Dennis H. (denn1is)


Lesenswert?

Danke das hat mir schon viel geholfen die Fehler von vorher sind nun 
alle raus.

Muss ich denn wenn ich die void aufrufen will auch (int erste) 
schreiben?

Warning [358] F:\UART\Client\Client.c; 15.25 illegal conversion of 
pointer to integer
Error   [276] F:\UART\Client\Client.c; 18.15 type specifier required for 
prototyped argument
Warning [349] F:\UART\Client\Client.c; 18.21 non-prototyped function 
declaration for "BCDCode1"
Error   [192] F:\UART\Client\Client.c; 22.8 undefined identifier 
"zaehler"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dennis Hoppen schrieb:
> Muss ich denn wenn ich die void aufrufen will auch (int erste)
> schreiben?

Besorg Dir ein C-Buch.

Und lies es.

von Dennis H. (denn1is)


Lesenswert?

Dachte man trifft hier auf Hilfe, war wohl nicht der Fall kannst das 
thema schließen

und zum Thema "Buch" ich würde mir eins kaufen , wenn ich die Zeit dazu 
hätte und das nötige Kleingeld.

Alleine durch den Beitrag von Daniel (vielen Dank) hab ich eine Menge 
gelernt, das man hätte wissen müssen oder vielleicht sogar sollen.

von Prog R. (daniel_v)


Lesenswert?

Grundsätzlich muss ich sagen, dass der Rufus sicher recht hat - wenn du 
die Grundlagen nicht kannst, tust du dir schwer, Zusammenhänge zu 
erkennen.
Also dem Tipp solltest du, wenn möglich, schon Folge leisten.

Nun zum anderen Kram:

> Warning [358] F:\UART\Client\Client.c; 15.25 illegal conversion of
> pointer to integer
Ich hatte nirgends gesehen, dass du einen Pointer (also z.B. eine 
Variable der Form int*) deklariert hast. Hast du wieder deinen Code 
parat?

> Error   [276] F:\UART\Client\Client.c; 18.15 type specifier required for
> prototyped argument
> Warning [349] F:\UART\Client\Client.c; 18.21 non-prototyped function
> declaration for "BCDCode1"

Hierzu solltest du deine Funktion BCDCode1 entweder vor der Main (also 
darüber einfügen) oder diese zuerst deklarieren.
Dazu reicht es, wenn du
1
void BCDcode1 (int erste);
über die Main schreibst. Der Compiler/Linker kann diese sonst nicht 
zuordnen - mehr Infos im Buch über C.
> Error   [192] F:\UART\Client\Client.c; 22.8 undefined identifier
> "zaehler"
Problem mit der Dekaration? Poste mal den aktuellen Code.

von Ein (Gast)


Lesenswert?

Dennis Hoppen schrieb:
> und zum Thema "Buch" ich würde mir eins kaufen , wenn ich die Zeit dazu
> hätte und das nötige Kleingeld.

Internet-Zugang hast du nicht?

von Kaj (Gast)


Lesenswert?

Dennis Hoppen schrieb:
> Dachte man trifft hier auf Hilfe, war wohl nicht der Fall
Die bekommt man hier auch, die Hilfe heißt: Hilfe zur Selbsthilfe! 
Aber du willst keine Hilfe, sondern einfach die Lösung!

Dennis Hoppen schrieb:
> wenn ich die Zeit dazu
> hätte und das nötige Kleingeld
Ausreden, nichts als faule Ausreden.
Sich ein Buch zu besorgen dauert weder lange, noch kostet ein C-Buch 
exorbitant viel Geld. Ansonsten die Suchmaschine deines Vertrauens 
befrage, nach Stichworten wie: C-Tutorial
Aber das scheint deine Fähigkeiten zu überschreiten. Wenn du aber keine 
Suchmaschien benutzen kannst, wie hast du dann dieses Forum gefunden?

Dennis Hoppen schrieb:
> Alleine durch den Beitrag von Daniel (vielen Dank) hab ich eine Menge
> gelernt
Nein, hast du nicht, weil du nicht verstanden hast, was genau das 
Problem war/ist.

Dennis Hoppen schrieb:
> zwei Pics
> Pic16F887
Ah ja, dafür ist das Geld aber da... und bestimmt hast du auch noch 
breadboards und ein bisschen hühnerfutter dazu... aber das teure Buch... 
Einen Porsche kaufen, aber kein Geld mehr für die Klimaanlage haben!

Dennis Hoppen schrieb:
> MPLAB
> Hi Tech Compiler
Offenbar kannst du ja doch eine Suchmaschine benutzen, oder war das zeug 
von ganz alleine und urplötzlich auf deinem Rechner?


Dennis Hoppen schrieb:
> Vielleicht kann mir jemand weiterhelfen

Oliver S. schrieb:
> Ein Fehler ist: Du hast kein C-Buch.

Rufus Τ. Firefly schrieb:
> Besorg Dir ein C-Buch.
> Und lies es.
Dem ist nichts mehr hinzuzufügen!

von Dennis H. (denn1is)


Angehängte Dateien:

Lesenswert?

Dies ist mein aktueller Code.

Danke erstmal für die Unterstüzung.

Es ist schon klar das man die Grundlagen kennen sollte und ich muss ganz 
ehrlich sagen wir haben seit einem halben Jahr in der Schule (Ausbildung 
zum Elektroniker) C Kenntnisse vermittelt bekommen, die nichtmla die 
Grundlagen abdecken. Und dann stell ich mir doch die Frage was hat der 
Lehrer mit uns in dem letztem halben Jahr gemacht.

Kaj schrieb:
> Ah ja, dafür ist das Geld aber da... und bestimmt hast du auch noch
> breadboards und ein bisschen hühnerfutter dazu... aber das teure Buch...
> Einen Porsche kaufen, aber kein Geld mehr für die Klimaanlage haben!

Diese Bauteile hab ich auf der Arbeit rumliegen, also besitzen tue ich 
diese nicht und verwenden auch nicht da ich das Programm nur via Real 
Pic simulator simulieren werde.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dennis Hoppen schrieb:
> Und dann stell ich mir doch die Frage was hat der
> Lehrer mit uns in dem letztem halben Jahr gemacht.

Gegenfrage: Was hast Du mit dem gemacht, was der Lehrer versucht hat, 
Dir zu vermitteln?

Hat der komplett ohne Unterlagen (Buch, Papier etc.) gearbeitet?

von Dennis H. (denn1is)


Lesenswert?

Er hat komplett ohne Unterlagen gearbeitet ,hat immer was an die Tafel 
gekritzelt und wir sollten entweder, das übernehmen oder erweitern.
Aber um den Lehrer mal zu entlasten, was kann man in 90 Minuten pro 
Woche schon vermitteln nicht viel meiner Meinung.

von Prog R. (daniel_v)


Lesenswert?

Dennis Hoppen schrieb:
> Dies ist mein aktueller Code.

1. dividierst du wahrscheinlich nicht gewollt "zaehler" als charakter 
durch 10, oder?
hier sonst einen Typecast verwenden, um kompatibel zu sein.
int zaehler = (int) UART_Read;
oder so.

2. fällt mir eigentlich nichts auf, außer dass dein Programm die
SiebenSegment - Funktionen nie aufruft.

Würde dann in der Main so aussehen:

SiebenSegment1 (erste);
SiebenSegment1 (zweite);

Achja:

UART_Init(9600);
Passiert am Ende deiner Main-Funktion. Vorher allerdings schon 
UART_Read.
Ich würde mal sagen, dass du Schnittstelle vorm Auslesen initialisieren 
solltest - weiß jetzt aber nicht, was dieses UART_Read genau von wo 
liest.

von Dennis H. (denn1is)


Lesenswert?

Daniel V. schrieb:
> . dividierst du wahrscheinlich nicht gewollt "zaehler" als charakter
> durch 10, oder?
> hier sonst einen Typecast verwenden, um kompatibel zu sein.
> int zaehler = (int) UART_Read;
> oder so.

Ich möchte das Byte was geschickt wird (UART_Reaad) durch 10 Teilen, 
damit ich einen Wert habe für eine 7 Segment ANzeige und der Rest ist 
dann der Wert für die andere 7 Segment Anzeige.

von Karl H. (kbuchegg)


Lesenswert?

Dennis Hoppen schrieb:

> Ich möchte das Byte was geschickt wird (UART_Reaad) durch 10 Teilen,
> damit ich einen Wert habe für eine 7 Segment ANzeige und der Rest ist
> dann der Wert für die andere 7 Segment Anzeige.


Mag ja alles sein.

Nur musst du dir verinnerlichen, dass
* deine Programmiersprache sequentiell von oben nach unten arbeitet.
d.h. die Anweisungen in main() werden genau in der Reihenfolge 
ausgeführt, in der du sie hinschreisbt.

Wenn du also schreibst
1
void main(){
2
3
int erste;
4
int  zweite;
5
char  zaehler = UART_Read;
6
7
...

dann wird in dieser Reihenfolge genau jetzt, zu diesem Zeitpunkt, der 
Inhalt von UART_Read geholt und dieser Wert der variablen zaehler 
zugewiesen.
Nachdem dann diese Anweisung (in Form der Initialisierung) durchgelaufen 
ist, ist schon wieder alles vorbei. Zwischen zaehler und UART_Read gibt 
es keine weitere Verbindung, denn ...

* ... C ist nicht Excel, das sich aus dem was du in die Zellen 
schreibst, selber die Reihenfolge raussucht, in der die Dinge passieren 
sollen. In einem C Programm werden deine Anweisungen in der Reihenfolge 
von oben nach unten abgearbeitet, in der du sie hinschreibst, beginnend 
bei main() bzw. in den Verzweigungen bzw. Funktionsaufrufen, die du eben 
hingeschrieben hast. Aber auch dann gilt: wird eine Funktion aufgerufen, 
dann werden die Anweisungen in dieser Funktion von oben nach unten 
abgearbeitet. Mit der einzigen Ausnahme von Kontrollstrukturen, wie 
Verzweigungen oder Schleifenkonstrukte, die diesen 'normalen' 
Programmfluss dann eben entsprechend den Sprach-Regeln modifizieren.

Und speziell im Lichte letzteren, ist es wohl wenig sinnvoll ...
1
void main(){
2
3
int erste;
4
int  zweite;
5
char  zaehler = UART_Read;
6
    erste  = zaehler%10;
7
    zweite = zaehler/10;
8
9
...
10
UART_Init(9600);              //Baudrate = 9600
11
      
12
}
... sich zuerst einen Wert zu holen und erst dann die UART überhaupt zu 
intialisieren.
Das ist eine vollkommen logische Sache.
Schliesslich muss man zuerst eine Haustür aufsperren, ehe man durchgehen 
kann. Man muss zuerst das Licht im Keller einschalten und erst dann mit 
der Suche nach dem richtigen Werkzeug beginnen. Vom Stuhl muss man 
zuerst aufstehen und erst dann weggehen. In einem Roman beginnt man 
vorne zu lesen und arbeitet sich von oben nach unten, von der ersten 
Seite zur letzten Seite durch. etc. etc.

Aktionen haben eine Reihenfolge, in der sie Sinn machen!
Es reicht nicht, nur die Aktionen zu identifizieren. Man muss sie auch 
in die richtige Reihenfolge bringen.

> was kann man in 90 Minuten pro Woche schon vermitteln nicht
> viel meiner Meinung.

Irrtum. Da geht schon recht viel. Überhaupt im Zeitraum eines halben 
Jahres. Ich hab meinen Neffen seit ein paar Wochen unter die Fittiche 
genommen. Einmal die Woche, von 19 bis so ca 22 Uhr. Wir arbeiten auch 
frei aus der Hand (aber er hat natürlich einen Kernighan&Ritchie 
bekommen), und nach 6 oder 7 Abenden kann er mit Datentypen umgehen, 
Funktionen aufrufen ist kein Problem, Kontrollstrukturen sowieso nicht, 
Arrays sind kein Thema mehr, mit Strukturen kommt er klar und die ersten 
Schritte in String-Verarbeitung hat er auch hinter sich. Als nächstes 
kommen Pointer oder Files, weiß noch nicht. Klar fehlt ihm noch eine 
Menge Übung, aber ich sehe eigentlich von Abend zu Abend, wie sich die 
bisher gelernten Dinge immer mehr verfestigen, selbst wenn wir mal eine 
Woche ausfallen lassen müssen (er hat ja 'nebenebei' ja auch noch seine 
reguläre Schule).

D.h. Man kann in einem halben Jahr eine Menge erreichen. Aber dazu 
muss der Schüler auch mitmachen. Einige deiner Fehler sind 'erste 
Unterreichtseinheit - erste halbe Stunde', die eigentlich nur zeigen, 
dass du noch nie ein Progamm selber geschrieben hast - in einem halben 
Jahr.

von Karl H. (kbuchegg)


Lesenswert?

Und PS:

Auf einem µC sieht die generelle Struktur eines Programms praktisch 
immer so aus

1
....
2
3
int main()
4
{
5
6
  // mache alle Initialisierungen
7
  // d.h. Alle speziellen Variablen kriegen ihre Werte
8
  // d.h. Alle benutzen Hardwarekomponenten werde auf ihre
9
  //      Einstellungen eingestellt
10
  //
11
  // kurz gesagt: bereite alles vor, damit dann die eigentliche
12
  // Programmlogik eine fertig eingestellte/konfigurierte UMgebung
13
  // vorfindet um arbeiten zu können
14
15
16
  // wenn Interrupts im Spiel sind, dann ist hier jetzt der
17
  // richtige Zeitpunkt, das Interruptsystem mit dem 'Hauptschalter'
18
  // freizugeben
19
20
  while( 1 ) {
21
22
    // hier steht dann die Hauptlogik des Programms
23
    //
24
    // Oft ist das der Fall, indem hier eine Anzahl von Möglichkeiten
25
    // überprüft werden, ob gewisse für das Programm wichtige Ereignisse
26
    // eingetreten sind.
27
    // Ein Ereignis könnte zb sein, dass auf der UART ein Zeichen reingekommen
28
    // ist. Dann muss eben auf dieses Ereignis reagiert werden. Ist
29
    // kein Zeichen an der UART rein gekommen, dann gibt es in diesem
30
    // Unterpunkt auch nichts zu tun und das nächste mögliche Ereignis,
31
    // zb, dass der Analog/Digitalwandler fertig geworden ist, wird
32
    // überprüft.
33
    //
34
    // Wie auch immer: hier in diesem Teil ist die Programmlogik und
35
    // der µC wird Zeit seines stromdurchflossenen Lebens diese Schleife
36
    // und damit die main() Funktion, nie wieder verlassen und statt dessen  
37
    // reihum ein paar tausend mal in der Sekunde alle möglichen Ereignisse
38
    // dahin gehend prüfen ob sie eingetreten sind, bzw. die Dinge tun,
39
    // die es zu tun gibt.
40
  }
41
}

Vergleich mal diesen generellen Aufbau mit deiner Client.c aus dem 
ersten Posting, bzw. mit was du zuletzt gepostet hast.
Das sieht alles ein klein wenig anders aus. Da ist von dieser 
allgemeinen Struktur bei dir recht wenig zu sehen. Das wirkt eher wie 
eine ungeordnete Ansammlung von irgendwelchem Text, den du einfach 
hingeschrieben hast, wie es dir in den Sinn gekommen ist.
Womit wir wieder beim Thema Reihenfolge wären.

von Jonas Biensack (Gast)


Lesenswert?

Du schreibst ja auch "witch" (Hexe?!) statt "switch".

lol

Gruß Jonas

von S. R. (svenska)


Lesenswert?

Dennis Hoppen schrieb:
> und zum Thema "Buch" ich würde mir eins kaufen , wenn ich die Zeit dazu
> hätte und das nötige Kleingeld.
Bullshit.

Den Begriff "Bibliothek" hast du schonmal gehört, oder?

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.