Forum: Mikrocontroller und Digitale Elektronik Beispiel logische FunKtion


von rapeur (Gast)


Lesenswert?

Hallo Zusammen,
Ich habe eine bitte an euch ich moechte gern mit dem Programm MPLAB  den 
Mikrochip PIC18F4550  und den Microchip MPLAB-C18 Compiler eine logische 
Funktion Programmiert. Ich habe so versucht aber es klapp nicht . Das 
ist mein Programm:

#include <pconfig.h>
#include <stddef.h>
#include <i2c.h>
#include <usart.h>
#include <func1.h>

void main(void) {
 \par
  OSCCON |=0x80; // 8 MHz


TRISA=1 ; // Port A Input
TRISB=1 ; // Port B Input
LATBbits.LATB0=1;
TRISC=0; // Port C Output
TRISD=1; // Port D Input


 LATCbits.LATC1= AND1(LATAbits.LATA1,LATBbits.LATB1);

}


#ifndef FUNC1_H
#define FUNC1_H

extern void AND1(){
   bool A=0 ;
 if((X=1)&&(Y=1))
{
A=1;
}
return A ;
}

#endif

Executing: "C:\\MCC18\\bin\\mcc18.exe" -p=18F4550 "test.c" -fo="test.o" 
-D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-\par
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:5:Error [1105] symbol 'A' has not 
been defined
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:5:Error [1101] lvalue required
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1105] symbol 'X' has not 
been defined
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1101] lvalue required
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1105] symbol 'Y' has not 
been defined
C:\\Users\\VPI\Desktop\\DIP\\func1.h:6:Error [1101] lvalue required\par
C:\\Users\\Nomgabou\\Desktop\\DIP\\func1.h:8:Error [1105] symbol 'A' has 
not been defined
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:8:Error [1101] lvalue required
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:10:Error [1105] symbol 'A' has not 
been defined
C:\\Users\\VPI\\Desktop\\DIP\\func1.h:10:Warning [2052] unexpected 
return value
C:\\Users\\VPI\\Desktop\\DIP\\test.c:38:Warning [2058] call of function 
without prototype
C:\\Users\\VPI\\Desktop\\DIP\\test.c:38:Error [1131] type mismatch in 
assignment
Halting build on first failure as requested.
}
Ich habe bestimmt  dummen Fehler gemacht. Ich brauche ihre Hilfe

von Unbekannter (Gast)


Lesenswert?

> Ich habe bestimmt  dummen Fehler gemacht.

Ja, etwa im Schnitt ein bis zwei Fehler pro Zeile!


> Ich brauche ihre Hilfe

Sehe ich auch so. Kauf Dir ein Grundlagenbuch über C, wenn Du schon kein 
Tutorial im Internet suchen und/oder lesen willst.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Alles formale Fehler in der Bedienung der Sprache C. Es fehlen die 
Angaben zu Übergabewerten an die Funktion AND1 und die Beachtung des 
Rückgabewertes.

Formal könnte man die Sache so verbessern. Das muss aber überprüft 
werden, ob die Programmlogik so gewünscht ist:

Datei test.c
1
#include <pconfig.h>
2
#include <stddef.h>
3
#include <i2c.h>
4
#include <usart.h>
5
#include <func1.h>
6
7
void main(void) 
8
{
9
/*
10
  Verstehe ich nicht.
11
  \par
12
*/
13
  OSCCON |= 0x80; // 8 MHz
14
  TRISA = 1; // Port A Input
15
  TRISB = 1; // Port B Input
16
  LATBbits.LATB0 = 1;
17
  TRISC = 0; // Port C Output
18
  TRISD = 1; // Port D Input
19
20
  LATCbits.LATC1 = AND1(LATAbits.LATA1, LATBbits.LATB1);
21
}

Datei func1.c
1
#include <stddef.h>
2
#include <func1.h>
3
4
bool AND1(bool X, bool Y)
5
{
6
  bool A = 0;
7
8
  if ( ( X == 1 ) && ( Y == 1 ) )
9
  {
10
    A = 1;
11
  }
12
13
  return A ;
14
}

Datei func1.h
1
#ifndef FUNC1_H
2
#define FUNC1_H
3
4
extern bool AND1(bool X, bool Y);
5
6
#endif

von Matthias Kölling (Gast)


Lesenswert?

In den Header kommt der Prototyp, aber nur wenn Du Die Funktion von 
extern aufrufen willst:
extern void AND1(?); den Typ müßtest Du noch angeben

Ins c-file kommt die Funktionsdefinition:
void AND1(?) // TypX?, TypY?
{
   bool A=0 ;            // bool muß dem Compiler bekannt sein
 //if((X=1)&&(Y=1))      // nicht Zuweisung
   if((X==1)&&(Y==1))    // sondern Vergleich

{
A=1;
}
return A ;               // wenn Du etwas zurückgibst ist es nicht void
}
Vielleicht eher so:

char AND1(char X, char Y)
{
   char A=0 ;            // char kennt der Compiler au jeden Fall
   if((X==1)&&(Y==1))
   {
      A=1;
   }
   return A ;
}

Gruß Matthias

von die ??? (Gast)


Lesenswert?

Wieso denn so ein Gefrickel?
1
#include <stddef.h>
2
#include <func1.h>
3
4
bool AND1(bool X, bool Y)
5
{
6
  return (X && Y) ;
7
}

von Karl H. (kbuchegg)


Lesenswert?

die ??? wrote:
> Wieso denn so ein Gefrickel?

Weil der OP offensichtlich Anfänger ist und man ihm zunächst
mal einen Weg zeigt, der ohne die C-typischen Abkürzungen und
Konventionen auskommt.

von die ??? (Gast)


Lesenswert?

...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum 
gegangen, was?   ;^)

von rapeur (Gast)


Lesenswert?

Hallo Zusammen
dank ihrer Hilfe habe ich keine Fehler mehr.

von Matthias Kölling (Gast)


Lesenswert?

Für mich kommt es darauf an, wie jemand fragt. Wenn ein Wille und ein 
Weg ersichtlich ist, warum nicht. Wenn jemand nach einer c++ Funktion 
fragt, die ein Sensorsignal auf eine Motoransteuerung umrechnet, werde 
ich auch schnell ironisch.

Gruß Matthias

von Stefan B. (stefan) Benutzerseite


Lesenswert?

die ??? wrote:
> ...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum
> gegangen, was?   ;^)

Nö, Ab heute ist das immer so!

von die ??? (Gast)


Lesenswert?

5€ drauf, dass gerade eh nicht mehr als copy&paste war. Aber ich will 
nicht nörgeln, nur so'n Gedanke.


Stefan "stefb" B. wrote:
> Nö, Ab heute ist das immer so!

Man darf gespannt sein.

von Unbekannter (Gast)


Lesenswert?

> Weil der OP offensichtlich Anfänger ist und man ihm zunächst
> mal einen Weg zeigt, der ohne die C-typischen Abkürzungen und
> Konventionen auskommt.

Ein sauberer Programmierstil ist keine "C-typischen Abkürzung".

Übrigens, die Klammern sind völlig unnötig und sinnlos:
1
#include <stddef.h>
2
#include <func1.h>
3
4
bool AND1(bool X, bool Y)
5
{
6
  return X && Y;
7
}

von die ??? (Gast)


Lesenswert?

...trägt aber zur besseren Lesbarkeit und somit zu einem "sauberen 
Programmierstil" bei. So what?

von Matthias Kölling (Gast)


Lesenswert?

@Unbekannter
Ist zwar schön kurz, ein MISRA-Checker dürfte aber die Warnung bringen, 
dass das implementierungsabhängig ist :)

Gruß Matthias

von yalu (Gast)


Lesenswert?

Was ist daran implementierungsabhängig? Allerdings muss noch stdbool.h
eingebunden werden, da dort der Datentyp bool (als _Bool) definiert
ist.

Ich hätte die Funktion bis auf die Großbuchtaben in Funktions- und
Variablennamen, die noch vom OP stammen, genauso wie Unbekannter
geschrieben. Klarer kann man doch eine Und-Verknüpfung nicht
ausdrücken, 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.