Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Sensorabfrage und Ausgänge ansteuern.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.02.2013, 16:53 Uhr
Gruenschnabel



Hallo Leute,

wir machen in der Schule ein kleines Projekt. Ich habe mit meinem "Progrämmchen" einige Probleme. Ich bekomme das Programm auf dem Microcontroller nicht zum laufen. Ich habe den Mircocontroller Eingänge und Ausgänge zugeordnet. Ich glaube das ich das richtig gemacht habe. Dann möchte ich nur mehrere Eingänge mit einer UND Bedingung verknüpfen und dann einen Ausgang anzusteuern. Ich weiß das hört sich nicht so schwer an. Ich bin aber zu doof dazu. Nach eingängiger Internet recherche bin ich verzweifelt. Könnt ihr mir helfen?

MfG

Gruenschnabel



C++:
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif
#include <cr_section_macros.h>
#include <NXP/crp.h>
#include <stdio.h>
#include "uart0.h"

//Definition der Funktionen
//Ausgang LED
#define LED_ROT_AUS LPC_GPIO2->FIOCLR=(1<<0)                //Led_ROT_Parkhaus belegt Ausschalten
#define LED_ROT_EIN LPC_GPIO2->FIOSET=(1<<0)                //Led_ROT_Parkhaus belegt Einschalten
#define LED_GRUEN_AUS LPC_GPIO2->FIOCLR=(1<<1)                //Led_Grün_Parkhaus frei Ausschalten
#define LED_GRUEN_EIN LPC_GPIO2->FIOSET=(1<<1)                //Led_Grün_Parkhaus frei Einschalten
#define SCHRANKE_AUSFAHRT_AUS LPC_GPIO2->FIOCLR=(1<<2)        //Schranke_Ausfahrt Ausschalten
#define SCHRANKE_AUSFAHRT_EIN LPC_GPIO2->FIOSET=(1<<2)        //Schranke_Ausfahrt Einschalten
#define SCHRANKE_EINFAHRT_AUS LPC_GPIO2->FIOCLR=(1<<3)        //Schranke_Einfahrt Ausschalten
#define SCHRANKE_EINFAHRT_EIN LPC_GPIO2->FIOSET=(1<<3)        //Schranke_Einfahrt Einschalten

//Eingänge
#define S1     (LPC_GPIO0->FIOPIN>>18)&1        //P0[18]    Parkplatz 1
#define S2     (LPC_GPIO0->FIOPIN>>17)&1        //P0[17]     Parkplatz 2
#define S3     (LPC_GPIO0->FIOPIN>>23)&1        //P0[23]     Parkplatz 3
#define S4     (LPC_GPIO0->FIOPIN>>24)&1        //P0[24]     Parkplatz 4
#define S5     (LPC_GPIO0->FIOPIN>>25)&1        //P0[25]     Parkplatz 5
#define S6     (LPC_GPIO0->FIOPIN>>26)&1        //P0[26]     Parkplatz 6
#define S7     (LPC_GPIO1->FIOPIN>>30)&1        //P1[30]     Parkplatz 7
#define S8     (LPC_GPIO1->FIOPIN>>31)&1        //P1[31]     Parkplatz 8
#define S9     (LPC_GPIO2->FIOPIN>>7)&1        //P2[7]     Parkplatz 9
#define S10    (LPC_GPIO2->FIOPIN>>8)&            //P2[8]     Parkplatz 10
#define S11 (LPC_GPIO0->FIOPIN>>21)&1        //P0[21]     S11 Simulation Einfahrt erster Magnetkreis
#define S12 (LPC_GPIO0->FIOPIN>>22)&1        //P0[22]     S12 Simulation Einfahrt Ticketanforderung
#define S13 (LPC_GPIO0->FIOPIN>>27)&1        //P0[27]     S13 Simulation Einfahrt Schranke belegt
#define S14 (LPC_GPIO0->FIOPIN>>28)&)        //P0[28]     S14 Simulation Einfahrt zweiter Magnetkreis
#define S15 (LPC_GPIO2->FIOPIN>>13)&1        //P2[13]     S15 Simulation Ausfahrt erster Magnetkreis
#define S16 (LPC_GPIO2->FIOPIN>>4)&1        //P2[4]     S16 Simulation Ausfahrt Ticket bezahlen
#define S17 (LPC_GPIO2->FIOPIN>>5)&1        //P2[5]     S17 Simulation Ausfahrt Schranke belegt
#define S18 (LPC_GPIO2->FIOPIN>>6)&1        //P2[6]     S18 Simulation Ausfahrt zweiter Magnetkreis

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
//#include "main.h"
//#include "uart0.c"


void main(void)
{
        
    if (SysTick_Config(SystemCoreClock / 1000))
    
    {
            while (1);  // Capture error
    }
    LPC_GPIO2->FIODIR|= 0x0000000F;    // LED Gruen/ LED Rot /Schranke Einfahrt / Schranke Ausfahrt

    if(S1==1 && S2==1 && S3==1 && S4==1 && S5==1 && S6==1 && S7==1 && S8==1 && S9==1 && S10==1)
            {
            LED_ROT_EIN;
            LED_GRUEN_AUS;
            }
        else
            {
            LED_GRUEN_EIN;
            LED_ROT_AUS;
            }
        if((S10==1) && (S11==1))
                    {
                    SCHRANKE_EINFAHRT_EIN;
                    }
        if((S13==1)&&(S14==1))
                    {
                    SCHRANKE_EINFAHRT_EIN;
                    }
        if((S13==1))
                    {
                    SCHRANKE_EINFAHRT_EIN;
                    }
        else
                    {
                    SCHRANKE_EINFAHRT_AUS;
                    }
        if((S15==1)&&(S16==1))
                    {
                    SCHRANKE_AUSFAHRT_EIN;
                    }
        if((S17==1)&&(S18==1))
                    {
                    SCHRANKE_AUSFAHRT_EIN;
                    }
        if((S17==1))
                    {
                    SCHRANKE_AUSFAHRT_EIN;
                    }
        else
        {
                    SCHRANKE_AUSFAHRT_AUS;
        }
}



---
Edit: cpp-Tags und oberste Kommentarzeile eingefügt; der Formatierung wegen.

Dieser Post wurde am 25.02.2013 um 03:49 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.02.2013, 05:02 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hoffe mal, ihr habt in der Schule eine Entwicklungsumgebung mit einem Simulator für den Controller. Dann kannst Du das Programm nämlich darin schon mal testen, bevor Du es auf den Controller überträgst. Ansonsten würde ich Dir raten, Dir das Programm mal anzusehen, nachdem der Präprozessor es bearbeitet hat. Der macht ja nicht viel mehr, als die #include-Dateien einzubinden und die Makros zu ersetzen. Aber gerade bei Makros schleichen sich oft Probleme ein, die man nicht sofort sieht. So sieht Deine erste Zeile

C++:
   if(S1==1 && S2==1 && S3==1 && S4==1 && S5==1 && S6==1 && S7==1 && S8==1 && S9==1 && S10==1)


nachdem sie vom Präprozessor bearbeitet wurde etwa so aus:

C++:
   if((LPC_GPIO0->FIOPIN>>18)&1 ==1 && (LPC_GPIO0->FIOPIN>>17)&1==1 &&
      (LPC_GPIO0->FIOPIN>>23)&1==1 &&  (LPC_GPIO0->FIOPIN>>24)&1==1 &&
      (LPC_GPIO0->FIOPIN>>25)&1==1 &&  (LPC_GPIO0->FIOPIN>>26)&1==1 &&
      (LPC_GPIO1->FIOPIN>>30)&1==1 &&  (LPC_GPIO1->FIOPIN>>31)&1==1 &&
      (LPC_GPIO2->FIOPIN>>7)&1==1 && (LPC_GPIO2->FIOPIN>>8)& ==1
     )


Hab das der besseren lesbarkeit wegen mal auf mehrere Zeilen verteilt. Und das ist auch nur eine Annahme, da ich nicht weis, was in den Dateien "LPC17xx.h", <cr_section_macros.h> und <NXP/crp.h> drin steht und was deshalb aus LPC_GPIO0, FIOPIN, etc. wird.


Was mir dann aber auffiel: in diesen Zeilen:

C++:
#define S10    (LPC_GPIO2->FIOPIN>>8)&       // <-- Fehler
#define S14 (LPC_GPIO0->FIOPIN>>28)&)       //  <-- Fehler


fehlt eine Zahl am Ende, also ein Operand, (S10) bzw. die schliessende Klammer ist falsch (S14).

Sonst kann ich da erst mal keine Fehler finden, weil ich mit den Controllern noch nicht gearbeitet habe, also keine Details darüber weis.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.02.2013, 09:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.02.2013, 13:59 Uhr
ao

(Operator)



Zitat:
Könnt ihr mir helfen?

Wenn wir wüssten, was nicht funktioniert ....

Abgesehen von den Tippfehlern, die Hans schon bemerkt hat:

Bei Makros, die Ausdrücke bilden, ist es in der Regel ratsam, den ganzen Ausdruck in ein Extra-Klammerpaar einzuschließen, so wie hier:

C++:
#define S1     ((LPC_GPIO0->FIOPIN>>18)&1)        //P0[18]    Parkplatz 1


Der Grund ist, dass der Ausdruck vom Präprozessor so, wie er ist, in den Quellcode eingefügt wird, und da kann es Überraschungen mit der Operator-Reihenfolge geben (Operatoren im #define-Ausdruck und Operatoren drumherum). Nach sowas sucht man unter Umständen extrem lange, weil es so gar nicht ins Auge fällt bzw. erst nach der Präkompilierung sichtbar wird.

Eine andere Möglichkeit: Den Präprozessor ganz außen vor lassen und S1 bis S18 als C-Funktionen formulieren:

C++:
int S1 () { return (LPC_GPIO0->FIOPIN>>18) & 1); }


Das würde ich ganz grünen Anfängern auf jeden Fall empfehlen, denn der Präprozessor ist schon manchmal ein gemeines Biest, mit dem muss man sich nicht gleich als Erstes anlegen.

Allgemein: Du hast die komplette Logik schon programmiert, bevor das Programm überhaupt läuft und irgendwas Sinnvolles tut? Ungünstig, da viel zuviel für einen Schritt. Fang ganz klein an, eine LED blinken lassen oder einen Eingang einlesen und den Pegel auf einer LED ausgeben.

Und noch was: Was für eine Entwicklungsumgebung hast du für das Ding?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.02.2013, 18:38 Uhr
Gruenschnabel



Hallo Leute,


schon mal danke für eure Hilfe, wir haben mittlerweile Festgestellt, das unser Microcontroller die Eingänge nicht akzeptiert hat und diese weiterhin als Ausgänge benutzt....


Die ersten Fehler sind behoben nun stellen wir uns erst mal den nächsten Herausforderungen.

MfG
Der grünste Grunschabel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.02.2013, 04:40 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat:
wir haben mittlerweile Festgestellt, das unser Microcontroller die Eingänge nicht akzeptiert hat und diese weiterhin als Ausgänge benutzt....


dann solltet Ihr mal im Programmierhandbuch nachsehen, wie die Ports konfiguriert werden, damit sie so arbeiten, wie Ihr das wollt. - Vorausgesetzt, die Hardware ist richtig angeschlossen.

Hans


--
P.S.

Zitat von ao:

Eine andere Möglichkeit: Den Präprozessor ganz außen vor lassen und S1 bis S18 als C-Funktionen formulieren:


C++:
int S1 () { return (LPC_GPIO0->FIOPIN>>18) & 1); }





den Trick sollte ich mir merken... ;-)
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.03.2013, 12:51 Uhr
ao

(Operator)



Zitat von Gruenschnabel:
wir haben mittlerweile Festgestellt, das unser Microcontroller die Eingänge nicht akzeptiert hat und diese weiterhin als Ausgänge benutzt....

Hallo Grünschnabel,
prüft diese Aussage doch nochmal nach, was bringt euch darauf? Beim LPC17xx sind die GPIOs nach dem Reset defaultmäßig Eingänge; man muss sie nicht dazu machen. Beschrieben im "LPC17xx User Manual" (NXP-Dokument UM10360), Kapitel 9.5.

Welcher LPC17xx ist das genau?

Dieser Post wurde am 04.03.2013 um 12:52 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: