PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16F877A mit PC verbinden funktioniert nicht!



doolitle15
23.09.2007, 17:31
Hallo
ich will einen 16f877a mit dem pc verbinden!
aber es funktioniert nicht! das Programm habe ich in c geschrieben!
ich habe auch testweise dazu einfach 2 Ausgänge auf high gesetzt damit ich weiß ob der pic überhaupt arbeitet und es funktioniert!

kann es sein das ich es anders anschließen muss??
ich verwende nämlich ein RS232 kabel bei dem tx und rx ausgekreuzt sind!!

PIC MAX 232
PIN25-->PIN11
PIN26-->PIN12

MAX232 RS232 Schnittstelle
PIN13-->PIN3
PIN14-->PIN2


oder kann es sein das ich im c code einen fehler habe??

#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
while(TRUE)
{
output_high(PIN_B3);
output_high(PIN_B2);
printf("Hallo wie geht es dir?"); //Ausgabe auf RS232
}
}

hoffe mir kann jemand helfen!!

mfg

kalledom
24.09.2007, 14:29
Gehe mal auf meine Seite: http://www.domnick-elektronik.de/aktdzm.htm
Da ist der Plan für einen PIC16F877 mit MAX232 und 10-pol. Pfosten, von dem per Flachbandkabel eine 9-pol. D-Sub-Buchse direkt in den PC eingesteckt werden kann.

Edit: Bei C kann ich Dir leider nicht weiter helfen, weil ich ausschließlich nur in Assembler programmiere.
Dazu gibt es unter http://www.domnick-elektronik.de/picasm.htm und http://www.domnick-elektronik.de/picpwm.htm viele Beispiele.

rvogt1964
24.09.2007, 15:13
Hallo - ich will einen 16f877a mit dem pc verbinden!

Hi doolitle,

dein Programm läuft bei mir auf meinem Testboard, so wie du es geschrieben
hast, allerdings mit weiteren Parametern unter #fuses NOBROWNOUT + NOPUT.

Muss also wenn der Fehler wenn im Spannungsconverterbereich (Beschaltung des RS232 IC's) liegen... 8-[

so long,
Reiner.

doolitle15
25.09.2007, 08:04
ok danke für die raschen antworten!! werde es heute nach der arbeit gleich ausprobieren!!!

mfg doolitle

djdune
25.09.2007, 20:01
Schaut nach CCS-C aus.
Wenn du evtl ein Steckbrett verwendest, könnte das der Störungsgrund sein. Ich hab noch nie einen Pegelwandler am Steckbrett zum laufen gebracht. Auch ein paar beliebte fehler sind falsche Einstellungen am Terminalprogramm und das Vertauschen von RX und TX.
Mich verblüfft von CCS die direkte PIC auf USB Konvertierung, wofür keine Zusatzhardware und Treiber notwendig sind.

Andre_S
26.09.2007, 07:52
...
Ich hab noch nie einen Pegelwandler am Steckbrett zum laufen gebracht.
...


Hallo,

da hatte ich bisher noch keine Probleme...


Gruß André

doolitle15
26.09.2007, 10:37
Hallo
habe die verbindung zum pc zusammengebracht!! war ein ganz dummer fehler den ich anscheinend übersehn habe!! RX und TX vertauscht!!

jetzt habe ich aber ein anderes Problem und zwar mit dem Brenner 5 von sprut! ich will wiedermal ein c programm hinein brennen aber immer zwischen 50 und 80% kommt eine fehlermeldung wo drinnen steht, dass der brenn vorgang abgebrochen werden muss weil bei ein fehler aufgetreten ist!!

das komische ist das ich das programm ohne fehler kompiliert habe!!

kann es sein das mein brenner den geist aufgibt??

mfg doolitle

rvogt1964
26.09.2007, 11:30
...dass der brenn vorgang abgebrochen werden muss weil bei ein fehler aufgetreten ist!!

Hi,

bei div. Brennsoftwarepaketen ist man in der Lage, eine Geschwindigkeits-
einstellung vornehmen zu können (längsamere Datenübertragung zum Brenner, da seriell).

Teilweise hängt die Geschwindigkeit doch stark vom Rechner ab. Da werden dann durch die Software "Pausen" von ein paar ms mehr eingelegt, so dass dieses Problem somit ggf. nicht mehr auftritt.

Ich hatte damals mal mir einen Brenner von VELLEMAN (über CONRAD Elektronik) zugelegt, in der Brennsoftware war z.B. eine solche Option zur Geschwindigkeitseinstellung (nicht Einstellung der Baudrate!) vorhanden.

Eine 2. Möglichkeit wäre noch, das dein Programm ggf. die Größe des Flash-
Speichers überragt, und deswegen der Abbruch kommt.

Aber wie gesagt, alles nur Vermutungen... :-)

doolitle15
26.09.2007, 13:53
danke für die rasche antwort!!

ich glaub nicht das mein programm zu groß ist! oder?
hier der code:
--------------------------------------------------------------------------
#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen[];
char *Text;
int8 duty1, duty2;

duty1 = 0;
duty2 = 0;

setup_ccp1(CCP_PWM); //setup capture unit 1 to
setup_ccp2(CCP_PWM); //setup capture unit 1 to
setup_timer_2(T2_DIV_BY_1,100,1); //setup period timer2


/* Haupt- und Heckrotor AUS */
output_low(PIN_C0); //Hauptrotor
output_low(PIN_C3); //Hauptrotor
output_low(PIN_D0); //Heckrotor
output_low(PIN_D1); //Heckrotor
set_pwm1_duty(0); //Geschwindigkeit Hauptrotor
set_pwm2_duty(0); //Geschwindigkeit Heckrotor

while(TRUE)
{
empfangen=getc();
delay_ms(200);
duty1 = (int)strtol(empfangen, &Text,10);
Text = (Text +1);
duty2 = (int)strtol(Text, &Text,10);
delay_ms(200);
printf("duty1= %u, duty2= %u", duty1, duty2);
}
}
-----------------------------------------------------------------------------------
das mit der geschwindigkeit muss ich mir gleich mal anschauen!!

mfg doolitle

rvogt1964
26.09.2007, 14:14
ich glaub nicht das mein programm zu groß ist! oder?

Hi,

nun ich denke man kann anhand des Sourcecodes leider nicht direkt feststellen, wie lang in Bytes (für's Flashrom) letzten Endes der ausführbare compilierte Code für den Prozessor selbst geworden ist.

Ich weiss nur, das Stringfunktionen (Wandlerfunktionen) sehr viel an Code brauchen, in Abhängigkeit von dem PIC als solches (PIC16 wesentlich mehr als die neueren PIC18 und/oder höher), wo seitens der codeoptimierten Sprache für einzelne Prozessoren schon einige Unterschiede festzustellen sind. Dies hängt denn vom Compiler ab, wie er dies in Sacher Code optimiert, und was letzten Endes noch an Lib's (Funktions-Bibliotheken) "hinzugelinkt" wird. Das bauscht denn die Sache schon recht auf. Im MPLAB kannst Du nach einladen der HEX-Datei über die "Gauges" sehr gut sehen, wieviel Bytes dein Programm letzten Endes von welchem Speicher wieviel benötigen wird beim Brennen des PIC.

Falls die Länge keine Rolle spielen sollte, bleibt denn eigentlich meines erachtens nach nur die Brenngeschwindigkeit übrig, die ggf. ein Problem verursacht...

doolitle15
26.09.2007, 14:51
hallo rvogt1964 !

ja du hast recht gehabt ich habe bei den optionen diese Geschwindigkeit runtergesetzt!! und habe 2 mal ohne probleme diesen code hinein brennen können!!!


ich habe aber gleich noch eine frage zu diesem code!! und zwar ich schicke mit labview einen string ( der zb so aussieht: 032:045) über die serielle schnittstelle zum pic!! und der pic soll diesen string splitten und die zahl 032 in eine variable schreiben und die zahl 45 in eine variable schreiben!! leider funktioniert mein verfasster code nicht!! aber ich weiß nicht warum? kannst du mir vielleicht weiterhelfen??

c-code:
#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen[];
char *Text;
int8 duty1, duty2;

duty1 = 0;
duty2 = 0;


while(TRUE)
{
empfangen=getc();
delay_ms(400);
duty1 = (int8)strtol(empfangen, &Text,10);
Text = (Text +1);
duty2 = (int8)strtol(Text, &Text,10);
delay_ms(200);
printf("duty1= %u, duty2= %u", duty1, duty2);
}
}

mfg doolitle

djdune
26.09.2007, 15:28
Hallo
jetzt habe ich aber ein anderes Problem und zwar mit dem Brenner 5 von sprut! ich will wiedermal ein c programm hinein brennen aber immer zwischen 50 und 80% kommt eine fehlermeldung wo drinnen steht, dass der brenn vorgang abgebrochen werden muss weil bei ein fehler aufgetreten ist!!

Das Problem hab ich auch. Ich hoffe, dass es mit dem Brenner8, den ich gerade baue, behoben wird.

Zu deinem Problem mit dem Text teilen:
Wenn du eine : Seperierung machst, sollte es so aussehen:
printf("%u:%u", duty1, duty2);
und das dann in Labview aufteilen

doolitle15
27.09.2007, 21:41
ich möchte aber vom Labview zum PIC einen string schicken der so aussieht: "023:054"!
das hab ch auch schon im labview gemacht und es funktioniert!
getestet hab ich das ganze indem ich einfach meinen pc mit einem anderne mit dem rs232 kabel verbunden hab!

aber wenn ich diesen string zum pic sende dann schickt der pic immer nur "duty1= 0, duty2= 0" zürück!!

was könnte ich falsch gemacht haben????

#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen;
char *Text;
long duty1, duty2;

while(TRUE)
{
do
{
if(kbhit()) empfangen=getc(); }
while(empfangen==0);

delay_ms(500);
duty1 = strtoul(empfangen, &Text, 10);
Text = (Text +1);
duty2 = strtoul(Text, &Text, 10);
delay_ms(500);

printf("duty1= %lu, duty2= %lu", duty1, duty2);
}
}

djdune
27.09.2007, 23:48
Hi!

Es gibt eine token split Funktion. Mit der sollte es funktionieren:



#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen, duty[2], split, *Text;


while(TRUE)
{
do
{
if(kbhit()) empfangen=getc();
} while(empfangen==0);

strcpy(duty,empfangen);
strcpy(split,":");
Text = strtok(duty, split);
while(Text!=0)
{
puts(Text);
Text = strtok(0, split);
}
delay_ms(500);
printf("duty1= %u, duty2= %u", duty[0], duty[1]);
}
}



Ich hab mal das geschrieben.
Laut Compiler keine Fehler, aber dafür garantier ich nicht /!\ (Ist ja schon spät). Theoretisch läufts. Schaus dir mal durch, und gibt bescheid, ob es das war. Im aktuellen Manual stehen alle Befehle drinnen und in dieser neuesten Ausgabe sogar übersichtlich.

doolitle15
30.09.2007, 11:02
hallo!
also das ich den empfangen string aufteile das funktioniert!!
aber habe jetzt ein anderes problem!! ich wandle im labview einen wert zwischen 0-100 in einen String und schicke diesen dann über die rs232 zum pic! der soll diesen wert über den befehl getc() in die variable empfangen schreiben! und dann den pwm ausgang auf den wert einstellen!! leider funktioniert das nicht! weiß vielleicht wer warum das so ist??
hoffe mir kann jemand helfen??

mfg


#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen;

int8 duty1, duty2;

duty1=0;
duty2=0;

setup_ccp1(CCP_PWM); //setup capture unit 1 to
setup_ccp2(CCP_PWM); //setup capture unit 1 to
setup_timer_2(T2_DIV_BY_1,100,1);


/* Haupt- und Heckrotor AUS */
output_low(PIN_C0); //Hauptrotor
output_low(PIN_C3); //Hauptrotor
output_low(PIN_D0); //Heckrotor
output_low(PIN_D1); //Heckrotor
set_pwm1_duty(0); //Geschwindigkeit Hauptrotor
set_pwm2_duty(0); //Geschwindigkeit Heckrotor

while(TRUE)
{

empfangen=getc();
delay_ms(400);

delay_ms(200);

set_pwm1_duty(duty1);
set_pwm2_duty(duty1);
delay_ms(200);
output_high(PIN_C0); //Hauptrotor
output_low(PIN_C3); //Hauptrotor
output_high(PIN_D0); //Heckrotor
output_low(PIN_D1); //Heckrotor
delay_ms(200);
printf("\r %u%%",duty1);
delay_ms(200);
}
}

djdune
02.10.2007, 01:22
Hi!

Bitte schreibe den Code in Zukunft in so ein Code Feld. Das ist ja fast nicht lesbar.


#include <16F877a.h>
#use delay (clock=4000000)
#use RS232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#fuses XT, NOWDT, NOPROTECT, NOLVP
#include <stdlib.h>

void main (void)
{
char empfangen;

int8 duty1, duty2;

duty1=0;
duty2=0;

setup_ccp1(CCP_PWM); //setup capture unit 1 to
setup_ccp2(CCP_PWM); //setup capture unit 1 to
setup_timer_2(T2_DIV_BY_1,100,1);


/* Haupt- und Heckrotor AUS */
output_low(PIN_C0); //Hauptrotor
output_low(PIN_C3); //Hauptrotor
output_low(PIN_D0); //Heckrotor
output_low(PIN_D1); //Heckrotor
set_pwm1_duty(0); //Geschwindigkeit Hauptrotor
set_pwm2_duty(0); //Geschwindigkeit Heckrotor

while(TRUE)
{

duty1=getc();
delay_ms(400);

delay_ms(200);

set_pwm1_duty(duty1);
set_pwm2_duty(duty1);
delay_ms(200);
output_high(PIN_C0); //Hauptrotor
output_low(PIN_C3); //Hauptrotor
output_high(PIN_D0); //Heckrotor
output_low(PIN_D1); //Heckrotor
delay_ms(200);
printf("\r %u%%",duty1);
delay_ms(200);
}
}

Denke ich, da die Variable falsch ist.
Hat eigentlich meine Variante oder eine andere mit dem Splitten funktioniert?