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
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;
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
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]
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...
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
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.
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
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] ;
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?
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???
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.
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.
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??
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
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.
> 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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.