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.