Forum: Mikrocontroller und Digitale Elektronik Hilfe PORT D kann nicht 2x in einem Programm mit LCD genutzt werden.


von Uwe K. (uwe_k60)


Lesenswert?

Wir haben ein Problem,

Wir brauchen in unserem Programm den Port D mehrfach...Einmal als 
Eingang und einmal als Ausgabe für das LCD Display... doch leider geht 
das nicht... wir haben im DigiEingang gesagt alles Eingang und gut... 
bei den Anaolgen Eingängen soll auf dem Display die Werte ebenfalls 
ausgegeben werden und an den PC geschickt werden...doch wenn ich die LCD 
dort include, dann meckert er beim builden(MPLAP)... ich soll es an den 
anfang setzen, aber dann gehen die eingänge nicht mehr...

Was kann ich tun, habe den entwurf einfach mal angehangen...

danke für alles...



//Projekt_MAIN.c
//Byte 1 = 0x00 heisst alle Programme beenden und auf neuen Befehl 
warten!

//__CONFIG(0x3F31)
//#include    <Projekt_Titel für Display.h>
//#include    <delay.h>
#include    <pic.h>
//#include    <uart.h>
//#include    <Receive_4x_Hex_Codes.h>

void haupt(void)
{

   #define Byte1=ausgabe(1);
   #define Byte2=ausgabe(2);
   #define Byte3=ausgabe(3);
   #define Byte4=ausgabe(4);


                                                                              //ANFANG
   if(Byte1=0x10)                     //Digitale Ausgangskarte
      {
         TRISB=0;
         TRISD0=0;
         TRISD1=0;
         TRISD2=0;
         TRISA4=0;
         PORTA=0;
         PORTB=0;
         RD0=0;
         RD1=0;
         RD2=0;

         while (Byte1=0x10)
         {
            if(Byte2=0x90)            //Relais Stufe 1 Relais 1-8
               {
                  RA4=1;            //Karte Aktiv
                  RD0=1;            //Stufe 1
                  //DelayMS(1);
                  PORTB=Byte3;
               }
            else if(Byte2=0x50)            //Relais Stufe 2 Relais 9-18
               {
                  RA4=1;            //Karte Aktiv
                  RD1=1;            //Stufe 1
                  //DelayMS(1);
                  PORTB=Byte3;
               }
            if(Byte2=0x30)            //Relais Stufe 3 Relais 19-24
               {
                  RA4=1;            //Karte Aktiv
                  RD2=1;            //Stufe 1
                  //DelayMS(1);
                  PORTB=Byte3;
               }
         }
      }
   if (Byte1=0x20)                 //Digital Eingang Aktiv
      {
         TRISD0=0;
         TRISD1=0;
         TRISD2=0;
         TRISD3=1;
         TRISD4=1;
         TRISD5=1;
         TRISD6=1;
         TRISD7=1;
         RD0=0;
         RD1=0;
         RD2=0;
         RD3=0;
         RD4=0;
         RD5=0;
         RD6=0;
         RD7=0;
         while ( Byte1=0x20)
            {
               while(!TXIF);
               TXREG=PORTD ;      //ByteSent1 bitte deklarieren nach 
ReneSeinem Datensendewort
               asm("nop");
            }
      }
   if(Byte1=0x40)//Analog Ausgang Aktiv
      {
         //#include Projekt_Display.h            //in diese Muss hinein 
das die Bits abgefragt werden welcher Ausgang gerade an ist.
         //#include Projekt_Analog_OUTPUT_LCD_Anzeigewahl.h
         TRISD=0;                      //Freigabe Display Port D = 
Ausgang
         TRISB=0;
         TRISC=0;
         TRISE0=0;
         TRISE1=0;
         TRISE2=1;                     //Port RE2 = Eingang Fehler 
Sammelmeldung
         TRISA5=0;                     //Port RA5 = Ausgang
         PORTB=0;
         PORTC=0;
         RE0=0;
         RE1=0;
         RA5=1;                     //Port RA5 = Einschalten, Anzeige 
des Analog wertes auf Display, wert muss umgerechnet werden

         while (Byte1=0x40)
            {
               if (PORTE2==0)
               {
                  ByteSent 1= 0x01;    //Sammelstörung Analog OUT an PC
               }
               PORTB=Byte2;
               PORTC=Byte3;
               PORTE=Byte4;//Achtung soll nur E0 und E1 betreffen, da E2 
= Alarmrückmeldung an Pic ist wenn Sammelfehler
               while(!TXIF);
               TXREG=RE2;      // bitte deklarieren nach ReneSeinem 
Datensendewort
               asm("nop");
            }
      }
   if(Byte1=0x80)                  //Analog Eingang Aktiv
      {
         //#include Projekt_Display.h
         //#include Projekt_Analog_INPUT_LCD_Anzeigewahl.h

         TRISD=0;                      //Port D = Ausgang ->Display Port 
bereit
         TRISA5=0;                     //Port RA5 = Ausgang
         RA5=1;                     //Port RA5 = Einschalten, Anzeige 
des Analogwertes auf Display SIEHE BEISPIEL SCHULE!!!!
         TRISA0=1;                     //RA0 Analog 1
         TRISA1=1;                     //RA1 Analog 2
         TRISA2=1;                     //RA2 Analog 3
         TRISA3=1;                     //RA3 Analog 4
         ADCON1=0x0B;                  //RA0-RA4= Analog
         ADCS1=0;ADCS0=1;              //ohne Channel-Angabe   ----- 
kann bleiben ergibt Takt Fosc/8
         ADON=1;                       //Converter Eingeschaltet ----- 
kann bleiben


         while (Byte1=0x80)           //Es werden alle Eingänge 
dauerhaft gesendet bis das Byte 1 sich ändert
            {
               while(!TXIF);
               TXREG=RA0;      //ByteSent1 bitte deklarieren nach 
ReneSeinem Datensendewort
               asm("nop");
               while(!TXIF);
               TXREG=RA1;      //ByteSent1 bitte deklarieren nach 
ReneSeinem Datensendewort
               asm("nop");
               while(!TXIF);
               TXREG=RA2;      //ByteSent1 bitte deklarieren nach 
ReneSeinem Datensendewort
               asm("nop");
               while(!TXIF);
               TXREG=RA3;      //ByteSent1 bitte deklarieren nach 
ReneSeinem Datensendewort
               asm("nop");
            }
      }

} 
//ENDE

von Daniel V. (danvet)


Lesenswert?

Gibt es dazu auch einen Schaltplan?
Wie kann ein Port zugleich Ausgang und Eingang sein?

Ach ja, solche Ausdrücke "while (Byte1=0x40){}" werden nicht 
funktionieren. Dreimal darfst du raten warum. Zumindest eine "Warning" 
sollte der Compiler bringen...

von Karl H. (kbuchegg)


Lesenswert?

Und das


   #define Byte1=ausgabe(1);

ist auch Unsinn.

Tu dir selbst einen Gefallen und hol dir ein C-Buch und mach erst mal 
die ersten paar Kapitel mit einem PC-Compiler durch.

Ohne ein Wort Spanisch zu können, kann man in Deutschland vielleicht 
nach Argentienien auswandern, aber bei der Computer Programmierung 
reisst man ohne wenigstens Grundkentnisse der Programmiersprache nix.
Und bei dem was man da so sieht, fehlt es hinten und vorne an 
Grundkentnissen.

von Uwe K. (uwe_k60)


Angehängte Dateien:

Lesenswert?

Mh ... raten bin ich schlecht, höchstens, weil da kein == steht??? bin 
echt ratlos...

Und schaltpläne gibt es... um es kurz zu fassen, das byte1 bestimmt um 
welche Platine es sich handelt und damit verbunden welche ein oder 
ausgänge ich brauche...

Habe mal das Portbelegungsplänchen hochgeladen...

Daraus kann man es erkennen...

Daher ja mein Problem das ich abhängig vom BYTE1 im Unterprogramm erst 
die Ports belegen kann als Ein oder Ausgang....

Soweit sollte es ja gehen bis auf die sache mit dem Display... aber 
wiedo kann das denn mit dem While ncht gehen???


Danke dir wirklich sehr

von Peter D. (peda)


Lesenswert?

Uwe K. schrieb:
> Wir brauchen in unserem Programm den Port D mehrfach...Einmal als
> Eingang und einmal als Ausgabe für das LCD Display... doch leider geht
> das nicht...

Natürlich geht das nicht ohne eine Zusatzschaltung.
Sonst kämpfen die Eingänge mit den Ausgängen, bzw. das Gerät an den 
Ausgängen spielt verrückt.

Man kann mit zusätzlichen Signalen einen Eingangstreiber in Tristate 
setzen, wenn die Pins Ausgänge sein sollen.
Und man kann mit einem Latch die Ausgänge stabil halten, solange die 
Pins Eingänge sein sollen.

Beim (HD44780) LCD gibt es noch eine Ausnahme, man muß nur den E-Pin 
stabil auf low halten, wenn es nicht geschrieben wird.


Peter

von Uwe K. (uwe_k60)


Lesenswert?

Also ich habe um das Display überhaupt in Betrieb zu nehmen einen 
Schaltung davor die die gesamte Betriebsspannung vom Display trennt über 
einen freien Portpin...

Aber wenn ich nun hingehe und das Display von vorne herein als Ausgang 
deklariere durhc meine LCD.h, so kann ich es ja nicht in einem 
unterprogramm wieder in einen Eingang ändern. Das meine ich damit, ich 
muss es im Unterprogramm die LCD.h einbringen nur das lässt er nicht 
zu...

von Daniel V. (danvet)


Lesenswert?

Uwe K. schrieb:
> Also ich habe um das Display überhaupt in Betrieb zu nehmen einen
> Schaltung davor die die gesamte Betriebsspannung vom Display trennt über
> einen freien Portpin...
>
> Aber wenn ich nun hingehe und das Display von vorne herein als Ausgang
> deklariere durhc meine LCD.h, so kann ich es ja nicht in einem
> unterprogramm wieder in einen Eingang ändern. Das meine ich damit, ich
> muss es im Unterprogramm die LCD.h einbringen nur das lässt er nicht
> zu...

Mir scheint du kennst dich nicht nur mit C nicht so gut aus, sondern 
auch nicht mit der µC-Hardware.
Sobald du RA5 änderst (Display an/aus), kannst du doch auch die Richtung 
von PortD ändern.
Das hast du doch so ähnlich in deinem Programm oben gemacht.

von Uwe K. (uwe_k60)


Lesenswert?

Ich weiss der eine oder andere meint ich solle lieber die finger davon 
lassen, aber ich kann  nicht mehr zurück,. da unser eigendlicher 
Programmierer für das Projekt schwer krank geworden ist, daher müssen 
wir das jetzt retten... Ok ich weiss das ich es ein und ausschalte... 
aber wie du siehst, habe ich die
 if(Byte1=0x80)                  //Analog Eingang Aktiv
      {
         //#include Projekt_Display.h
ausgekommentiert, weil wenn ich die aktiv lasse dann meckert er 
sofort...

Ich muss die aber rein theoretisch hier erst reinsetzten, oder denke ich 
total verkehr...

von Chris (Gast)


Lesenswert?

Uwe K. schrieb:
> if(Byte1=0x80)

du meinst wohl
if(Byte1==0x80)
ich denke du willst hier eine überprüfung machen, keine zuweisung.
Daher meckert er auch

von Daniel V. (danvet)


Lesenswert?

Uwe K. schrieb:
> Ich weiss der eine oder andere meint ich solle lieber die finger davon
> lassen, aber ich kann  nicht mehr zurück,. da unser eigendlicher
> Programmierer für das Projekt schwer krank geworden ist, daher müssen
> wir das jetzt retten... Ok ich weiss das ich es ein und ausschalte...
> aber wie du siehst, habe ich die
>  if(Byte1=0x80)                  //Analog Eingang Aktiv
>       {
>          //#include Projekt_Display.h
> ausgekommentiert, weil wenn ich die aktiv lasse dann meckert er
> sofort...
>
> Ich muss die aber rein theoretisch hier erst reinsetzten, oder denke ich
> total verkehr...

Du kannst nicht zur Laufzeit Headerdateien einbinden. Headerdateien 
gehören an den Anfang des C-Files. Dahin wo z.B.auch <delay.h> steht.
Falls jetzt der Compiler meckert, dann must du das nächste Problem 
beheben.
Würdest du den kompletten SourceCode posten könnte man dir eventuell 
weiterhelfen.
Andererseits behaupte ich jetzt mal (wenn ich so sehe, was an C-Code 
produziert wurde), dass du das ganze nicht in zwei Wochen zum Laufen 
bekommst.

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.