UART ARRAY von PC an PIC

OP #2452472
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
Gast #2452491
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;
OP #2452502
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
OP #2452576
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
Gast #2452591
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] ;
Gast #2452595
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?
OP #2452603
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???
Gast #2452612
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.
OP #2452616
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??
Gast #2453017
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!
OP #2453027
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....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren