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
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?
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
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
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.
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"
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.
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
voidBCDcode1(interste);
ü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.
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?
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 weiterhelfenOliver 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!
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.
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?
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.
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.
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.
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
voidmain(){
2
3
interste;
4
intzweite;
5
charzaehler=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
voidmain(){
2
3
interste;
4
intzweite;
5
charzaehler=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.
Und PS:
Auf einem µC sieht die generelle Struktur eines Programms praktisch
immer so aus
1
....
2
3
intmain()
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.
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?