Forum: Mikrocontroller und Digitale Elektronik UART ARRAY von PC an PIC


von Uwe K. (uwe_k60)


Lesenswert?

Hallo zusammen

da ich mir gestern schon nen "rüffel" hier abgeholt habe, nützt es 
nichts wenn ich als unfreiwillig unwissender noch ne frage stellen 
muss...

Ich muss 4Byte vom Rechner an den Pic schicken...

Nun ich habe gestern den Typ bekommen:

du kriegst das Byte von der UART

   Bytes[nextByte] = empfangenes Byte;
   nextByte++;
   if( nextByte == 4 )
     nextByte = 0;

Gut das habe ich ausprobiert aber ich schaffe es nicht...


   while(!RCIF);
      Byte[nextByte] = RCREG;
  RCIF=0;
  nextByte++;
  if( nextByte == 3 )
  nextByte = 0;

Oder wie???

Ich bin am Ende...

Das jeweilige

Byte(0)
Byte(1)
Byte(2)
Byte(3)

kann ich dann nutzen...

So mein Programm konnte ich zumindest erfolgreich übersetzen mit mplap, 
keine fehler nur testen kann ich es nict weil ich kein signal 
rüberbekomme...

Schitt...

Und danke nochmal für den tip gestern...ich weiss ich kann so gut wie na 
ja nichts, aber es muss nunmal sein...

Danke

von Rolf (Gast)


Lesenswert?

Hast Du einen Debugger? Wenn ja, dann setzte mal einen Breakpoint auf

Byte[nextByte] = RCREG;

Wenn er dort hinkommt, weisst Du schon mehr.

Welcher PIC?

Mit welchem PC-Programm sendest Du?


   while(!RCIF);
      Byte[nextByte] = RCREG;
  RCIF=0;
  nextByte++;
  if( nextByte == 3 )        // hier muss eine 4 hin
  nextByte = 0;

von Uwe K. (uwe_k60)


Lesenswert?

Nein ich habe nur MPLap...Sorry... Ich arbeite mit dem 16F877 da wir den 
in der schule auch genutzt haben, wollten für das projekt den 18f4525 
nehmen aber hatten probleme mit der Config, aber der 16er kann 10bit ad 
das reicht uns, bin gerade dabei das display fertig zu programmieren, da 
ich jetzt die 1024 umwandlen muss in 0,000 bis 20,000mA...hihihi

Senden tu ich zur zeit mit nem Terminal bzw. auch mit PCW PORT Tool... 
also empfangen kann ich(ein kruzes Programm erstellt und getestet) und 
wir haben auch schon probiert das was ich zum pik sende über ne taste 
wieder an den rechner zurück zu schicken das ging scheinbar...

mit der 4 das habe ich gerade geändert...Danke...

Kann ja mal den Quelltext Posten, auch wenn ich mich schäme, weil ist 
vielleicht nicht so übersichtlich wie es sein sollte...smile

von Rolf (Gast)


Lesenswert?

Uwe K. schrieb:
> Das jeweilige
>
> Byte(0)
> Byte(1)
> Byte(2)
> Byte(3)
>
> kann ich dann nutzen...

es müssen eckige Klammern sein: Byte[1]

von Rolf (Gast)


Lesenswert?

In welcher Stadt ist denn eure Firma?

von Uwe K. (uwe_k60)


Lesenswert?

Wir haben keine Firma, wir müssen das als Projekt machen für eine 
Abschlussarbeit für den Techniker, aber leider ist unser Programierer 
schwer krank geworden und wir wollen es trotzdem schaffen...

von Uwe K. (uwe_k60)


Lesenswert?

Krefeld

von avr (Gast)


Lesenswert?

Bei PIC kann man einiges bei SPRUT finden.
Bei C mit dem PIC auch:

http://sprut.de/electronic/pic/c/pic_c/pic_c00.html#einleitung

Hier dann z.B. die Arrays und Strings.

avr

von Rolf (Gast)


Lesenswert?

Uwe K. schrieb:
> Nein ich habe nur MPLap...Sorry...

Wie programmierst Du denn? Ich kenne nur diese Pullmolldosen, mit denen 
man programmieren und debuggen kann, ich weiss im Moment nicht die 
genaue Bezeichnung.

von Uwe K. (uwe_k60)


Lesenswert?

Das ist alles auf der Platine drauf, ICD2 Brenner und Max232, als 
Brenner ist ebenfalls ein 16f876 mit drauf... und so machen wir das die 
ganze Zeit, mit MPLap Builden und dann mit dem Programmer von MPLap 
übertragen...

Die Unterlagen von Sprut haeb ich schon ausgedruckt und so weiter, aber 
ich sage ja mir fehlt so ein bischen die umsetzung, ich mach das anders 
ich setzte einfach mal das Hauptprogramm hier dran... ich brauche das 
Array am Anfang für die "Unterprogramm" starts...

Und ja ich bin Anfänger daher nicht nur negativ darüber reden, bitte...: 
Danke:




______________________________________________________________________ 
_

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

#include    <htc.h>
__CONFIG   (0x3F31);
#include "Projekt_UART.h"
#include "Projekt_LCD.h"
#include "Projekt_Messen_Analog_IN.h"
#include "Projekt_Display_Titel.h"
#include "Projekt_Anzeige_Display_Analog.h"




void main(void)
{


  //while(!RCIF);
        //Byte[nextByte] = RCREG;
    //RCIF=0;
    //nextByte++;
    //if( nextByte == 3 )
    //nextByte = 0;
     // dann das Byte[1] in die If Anfragen




    unsigned char Byte1;
    unsigned char Byte2;
    unsigned char Byte3;
    unsigned char Byte4;

  PORTA=0;
  PORTB=0;
  PORTC=0;
  PORTD=0;
  PORTE=0;


                                                                                    //ANFANG
   if(Byte1==0x10)                     //Digitale Ausgangskarte
      {
    unsigned char k;
    for (k=0;k<1;k++)
          {
             while (!TXIF);
             TXREG=0x10;       //Programm bestätigung 1x an PC zurück 
senden
             asm("nop");
          }


     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;       //Relais 1-8
               }
            else if(Byte2==0x50)            //Relais Stufe 2 Relais 9-18
               {
                  RA4=1;            //Karte Aktiv
                  RD1=1;            //Stufe 2
                  DelayMs(1);
                  PORTB=Byte3;    //Relais 1-8
               }
            if(Byte2==0x30)            //Relais Stufe 3 Relais 19-24
               {
                  RA4=1;            //Karte Aktiv
                  RD2=1;            //Stufe 3
                  DelayMs(1);
                  PORTB=Byte3;    ////Relais 1-8
               }
         }
      }
   if (Byte1==0x20)                 //Digital Eingang Aktiv
      {

    unsigned char k;
    for (k=0;k<1;k++)
          {
             while (!TXIF);
             TXREG=0x20;       //Programm bestätigung 1x an PC zurück 
senden
             asm("nop");
          }



         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
      {
        unsigned char k;
    for (k=0;k<1;k++)
          {
             while (!TXIF);
             TXREG=0x40;       //Programm bestätigung 1x an PC zurück 
senden
             asm("nop");
          }

               //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 (RE2==0)
               {
          while(!TXIF);
                   TXREG=0x01;      // bitte deklarieren nach ReneSeinem 
Datensendewort
                   asm("nop");
                    //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

            }
      }
   if(Byte1==0x80)                  //Analog Eingang Aktiv
      {
      unsigned char k;
      for (k=0;k<1;k++)
            {
               while (!TXIF);
               TXREG=0x80;       //Programm bestätigung 1x an PC zurück 
senden
               asm("nop");
            }

          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=0b10000010;            //RA0-RA4= Analog
           ADCON0=0b0100001;             //Converter Eingeschaltet ----- 
kann bleiben
       lcd_init();


           while (Byte1==0x80)           //Es werden alle Eingänge 
dauerhaft gesendet bis das Byte 1 sich ändert
              {

          char MW0,MW1,MW2,MW3;



                MW0=messen_ch(0);             //AN0 einlesen
                analog_in(MW0,0x45);
                while(!TXIF);
                TXREG = ADRESL;
                asm("nop");
              while(!TXIF);
              TXREG = ADRESH|0b00000000;// Analog 0 IN
              asm("nop");

              while(!TXIF);               //Sichtlücke
              TXREG = 0xFF;
              asm("nop");
              while(!TXIF);
              TXREG = 0xFF;
              asm("nop");



              MW1=messen_ch(1);            //AN1 einlesen
              analog_in(MW1,0x45);
              while(!TXIF);
              TXREG = ADRESL;
              asm("nop");
              while(!TXIF);
              TXREG = ADRESH|0b00010000;// Analog 1 IN
              asm("nop");


              while(!TXIF);               //Sichtlücke
              TXREG = 0xFF;
              asm("nop");
              while(!TXIF);
              TXREG = 0xFF;
              asm("nop");


              MW2=messen_ch(2);             //AN2 einlesen
              analog_in(MW2,0x45);
              while(!TXIF);
              TXREG = ADRESL;
              asm("nop");
              while(!TXIF);
              TXREG = ADRESH|0b00100000;// Analog 2 IN
              asm("nop");


              while(!TXIF);               //Sichtlücke
              TXREG = 0xFF;
              asm("nop");
              while(!TXIF);
              TXREG = 0xFF;
              asm("nop");


              MW3=messen_ch(3);            //AN3 einlesen
              analog_in(MW3,0x45);
              while(!TXIF);
              TXREG = ADRESL;
              asm("nop");
              while(!TXIF);
              TXREG = ADRESH|0b00110000;// Analog 3 IN
              asm("nop");


              while(!TXIF);               //Sichtlücke
              TXREG = 0xFF;
              asm("nop");
              while(!TXIF);
              TXREG = 0xFF;
              asm("nop");
              }
      }

}
                                                                          //ENDE

von Rolf (Gast)


Lesenswert?

unsigned char Byte1;
    unsigned char Byte2;
    unsigned char Byte3;
    unsigned char Byte4;


bytes_received = 0 ;

while ( bytes_received <= 4 ) {
  while(!RCIF);
  Byte[nextByte] = RCREG;
  RCIF=0;
  nextByte++;
  if( nextByte == 4 ) nextByte = 0 ;
  bytes_received++ ;
}

Byte1 = Byte[0] ;
Byte2 = Byte[1] ;
Byte3 = Byte[2] ;
Byte4 = Byte[3] ;

von Rolf (Gast)


Lesenswert?

Du brauchst im Hauptprogramm noch eine umschließende while(1) {   } oder 
Ähnliches, sonst läuft dein Programm nur einmal durch und ist dann zu 
Ende. Ich vermute mal, dass ja immer wieder von vorne anfangen soll, 
oder?

von Uwe K. (uwe_k60)


Lesenswert?

Hey wenn ich dankbarkeit in nullen und einsen darstellen könnte ich 
würde hier eine endlos schleife schreiben, danke das mit dem while(1) 
hab ich vergessen... ups...und sonst was hastd du sonst für einen 
eindruck bis auf das das scheinbat nicht sehr standard mässig ist???

von Rolf (Gast)


Lesenswert?

Ich bin jetzt mal davon ausgegangen, dass Du den Rest des Programms 
schon getestet hast und dass der läuft, wenn Du nur vorher Byte1, Byte2 
usw. Werte zuweist. Ist das so? Dann ist das schonmal ganz gut, 
unabhängig davon, wie gut der Programmierstil ist.

Ich dachte, es geht jetzt erstmal nur noch darum die 4 Bytes zu 
empfangen. Hast Du meinen Code getestet? Läuft er? Ich bin hier kein 
PIC-Zeug, an dem ich meinen Code, den ich hier poste, testen könnte.

von Rolf (Gast)


Lesenswert?

Rolf schrieb:
> Ich bin hier kein
> PIC-Zeug, an dem ich meinen Code, den ich hier poste, testen könnte.

Ich meinte: Ich habe hier kein PIC-Zeug, an dem ich meinen Code, den ich 
hier post, testen könnte.

von Uwe K. (uwe_k60)


Lesenswert?

while(1)
   {
    unsigned char Byte1;
    unsigned char Byte2;
    unsigned char Byte3;
    unsigned char Byte4;
    unsigned char bytes_received;  //RICHTIG???
    unsigned char Byte;            //RICHTIG???
    unsigned char nextByte;        //RICHTIG???

           bytes_received = 0 ;

    while ( bytes_received <= 4 )
      {
          while(!RCIF);
  *meckert Pointer required ->  Byte[nextByte] = RCREG;
          RCIF=0;
          nextByte++;
         if( nextByte == 4 ) nextByte = 0 ;
          bytes_received++ ;
      }

                      Byte1 = Byte[0] ;
  *meckert Pointer required ->      Byte2 = Byte[1] ;
  *meckert Pointer required ->      Byte3 = Byte[2] ;
  *meckert Pointer required ->  Byte4 = Byte[3] ;


Diese Punkte meckert er an und die anderen habe ich weg gemacht das war 
weil ich die oben nicht "unsigned char"gesetzt habe... Was ist ein 
Pointer??

von Uwe K. (uwe_k60)


Lesenswert?

MH, also ich habe gesucht aber irgendwie seh ich den wald vor lauter 
bäumen nicht... was der mit den Pointern meint??? 
Mh...merkwürdig...smile

von Rolf (Gast)


Lesenswert?

Uwe K. schrieb:
> unsigned char Byte;            //RICHTIG???

falsch, hier musst du das array definieren:

unsigned char Byte[4] ;



Ansonsten sieht es gut aus. Probier mal.

von Kein Name (Gast)


Lesenswert?

> Das ist alles auf der Platine drauf, ICD2 Brenner...

Ui!

Habt ihr mal ausprobiert, ob man das Ding auch unter Debugger->Select 
Tool->MPLAB ICD2 ansprechen kann?

Wenn ihr Glückt habt, kommen nur ein paar Meldungen, dass Mplab ein paar 
Configuration Bits abschaltet und in Debug-Modus neu kompilieren muss.

Grüße, und gute Besserung an den Programmierer!

von Uwe K. (uwe_k60)


Lesenswert?

Rolf schrieb:
> falsch, hier musst du das array definieren:
>
>
>
> unsigned char Byte[4] ;
>
>
>
>
>
>
>
> Ansonsten sieht es gut aus. Probier mal.

Hey SUpi, hat funktioniert keine Fehler mehr...PUH, ihr glaubt garnicht 
wie dankbar ich euch bin... wirklich...

So jetzt muss ich es nur noch mal ausprobieren ob das auch wirklich 
funzt...

Sonst hab ich keine Baustellen mehr, nächste woche kommen die Platinen 
die noch zusammensetzten und dann beten...

Sag mal nur ne dumme frage, ich habe am angfang meine display datei.h 
einpflegen müssen, doch ich brauche das display erst nei der analogen 
eingangskarte, reicht das wenn ich die dann wie geschrieben init()... 
weil ich ja in einem vorherigen Programm den Port d als eingang nutze... 
das display schaltze ich über transistot (spannungsversorgugn 
Displaypalitne ) erst zu wenn ich in das progrtamm gehe RA5....

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.