Forum: Offtopic MPLAB -> Mülltonne


von Simon S. (-schumi-)


Lesenswert?

Hallo,

die Frage AVR<->PIC ist ja schon lange durchgekaut worden. Gegen den PIC 
selbst habe ich auch garnichts einzuwenden.

Aber diese MPLAP Entwicklungsumgebung bringt mich noch ins Grab!

Heute hab ich in der Arbeit angefangen ein Testboard (<- fertig gekauft, 
zum üben) mit Platine mit Real-Time-Clock dran zu programmieren.

1. Versuch mit PIC18F4550:
- Erstellen eines Projektes ewig kompliziert und ohne Ende 
unübersichtlich (z.B.: Warum X verschieden Compiler zum auswählen? 
Reicht es nicht C oder ASM anzukreuzen? Und dann ist MPLAB natürlich 
noch zu dämlich um die Compiler selbst einzubinden, sondern der Anwender 
darf sie mühsam suchen)
- Compilieren an sich hat funktioniert -> "Linking failed" -> 
ARHGHGHGH!!
-> Irgendwann aufgegeben

2. Versucht mit einem PIC16F887 (anderes Board):
- 1. MicroCPro oder wie es heißt gestartet -> Fail -> Restart -> Fail -> 
Restart -> Fail.... ahja... Ein Programm dass abstürzt bevor es 
überhaupt offen ist, auch toll...

Und die IDE geht mir derart auf die Nerven (z.B. kann ich nicht mal Tabs 
machen!?!?), dass ich Geany installierte und eine "make_all.bat" und 
eine "make_program.bat" angelegt hatte. Also das Zeug wieder 
rausgekrahmt.

Ok, kompilieren und Flashen funktioniert in Geany jetzt relativ gut (bis 
auf die ziemlich krasse Trägheit wenn man auf "kompilieren" klickt)

Also mal losgelegt. Dann fast eine Stunde einen "; expected, "char" 
found"-Fehler gesucht. Irgenwann drauf gekommen dass der Compiler zu 
dämlich ist um im Quellcode (und nicht nur ganz am Anfang von main) 
Variablen zu deklarieren -> Kreisch + Kopf->Tisch

==> Warum ist das alles so kompliziert, instabil und unübersichtlich?? 
Mir braucht niemand zu erzählen dass diese IDE einfacher zu bedienen 
währe als ein Makefile zu kopieren und das TARGET zu tauschen.

Ist das bei euch auch so? Als Vorteil beim PIC wird ja oft erwähnt dass 
alles aus einer Hand kommt -> Hilft auch nichts wenn dann nichts 
funktioniert...

Ich wünschte man könnte mit dem GCC für den PIC kompilieren, dann währen 
alle Sorgen vergessen...


Gruß
-schumi-

von Purzel H. (hacky)


Lesenswert?

Es wird im allgemeinen positiv vermerkt, dass man einen eigenen Compiler 
anschnallen kann. Ja. Und wenn der Compiler magere Fehlermeldungen 
rausgibt, kann die IDE nichts dafuer.

von Simon S. (-schumi-)


Lesenswert?

>Es wird im allgemeinen positiv vermerkt, dass man einen eigenen Compiler
>anschnallen kann.
Mir ist keine IDE bekannt die das nicht könnte

>Und wenn der Compiler magere Fehlermeldungen
>rausgibt, kann die IDE nichts dafuer.
Das ist mir natürlich klar. Deswegen schrieb ich ja auch
>Ich wünschte man könnte mit dem GCC für den PIC kompilieren
GCC ist ja auch nur ein Compiler

Aber danke für deine Antwort! Inwiefern hast du Erfahrung mit MPLAB? 
(Bzw. welche?)

von C. H. (_ch_)


Lesenswert?

Mit dem MPLAB-Editor stehe ich ehrlich gesagt auch auf Kriegsfuß, aber 
Tabs kann man einstellen.

Mal sehen wann das neue MPLAB-X serienreif ist. Vielleicht kann man sich 
dann mal wieder vom externen Editor trennen :)

Gruß,
Christian

von Purzel H. (hacky)


Lesenswert?

Die AVR IDE's die ich in gebrauch habe koennen das alle nicht. Dh 
koennen keinen anderen Compiler wie der der dazu geplant wurde.

Ich kenn das MPLAB nur aus der Ferne, irgendwann in den 90ern wurde es 
mir zu bloed das immer noch 16 bittige MPLAB zu verwenden, waehrend die 
anderen IDE's bereits 32 bit waren. Dh ich bin dann auf AVR umgestiegen. 
Sehe das MPLAB aber noch bei meinen Kollegen. Und hab auch schon einen 
PIC Kurs besucht, um nicht aus der Uebung zu kommen.

von Wilhelm F. (Gast)


Lesenswert?

Gelegentlich arbeite ich auch mit MPLAB, und muß sagen, daß ich damit 
immer sehr gut zurecht kam. Besonders, wenn man nur in Assembler 
programmiert, und keinen fremden C-Compiler einbindet.

Ich verwende mit MPLAB die Freeware-Version des HiTech-C-Compilers, und 
der ist etwas limitiert. Leider compilieren die Sourcen einwandfrei und 
ohne Fehlermeldungen, aber der Code läuft dann einfach nicht. Die 
Limitierung des Compilers besteht einfach darin, daß er diverse 
Konstrukte wie mehrfach geschachtelte Klammerausdrücke und Verknüpfung 
dieser ganz einfach nicht umsetzt, und es auch gar nicht dokumentiert 
ist. Dem kam ich auf die Schliche, weil ich Assemblercode 1:1 nach C 
portierte. Einfach just for Fun, weil ich anstatt Assembler mal lieber 
in C programmieren wollte, und es testete. Wohl bemerkt, nur kleinere 
Programme. In den 12F675 passt ja ohnehin nicht viel ins Flash, der hat 
nur 1kByte. Vereinfachte ich die Ausdrücke schrittweise, funktionierte 
denn auf einmal alles. Tolle Wurst. Wie es bei gekauften Vollversionen 
aus sieht, weiß ich nicht. Aber die sollten in dieser Hinsicht doch in 
Ordnung sein. Wenn man da was selbst basteln muß, dann ist das Ding ganz 
klar "für die Füße".

Bei Keil, sagen sie dir klar, das Demo-Ding ist z.B. auf 16k limitiert, 
macht aber sonst alles. Das ist wiederum ganz nett, und alles ist klar.

von Hans W. (stampede)


Lesenswert?

Jung...
Ich komme mit MPLAB sehr gut zurecht. Ich finde, wenn was kompliziert 
zum Einstellen ist, dann sind es andere Programm wie Visual Studio und 
der ganz MS Kaese. Da motzt keiner!
Tabs gehen, wie schon gesagt.
Dass man verschiedene Complier einbinden kann ist ja an und fuer sich 
nicht verkehrt. Da man die aber aus einem PullDown Menu holt, sollte das 
idiotensicher sein.
>- Compilieren an sich hat funktioniert -> "Linking failed" ->
>ARHGHGHGH!!
Weil du wahrscheinlich die vorkompilierten Libs wie die C18i.o (oder wie 
die heisst) nicht eingebunden hast. Muss im Projekt eingestellt sein.

>Also mal losgelegt. Dann fast eine Stunde einen "; expected, "char"
>found"-Fehler gesucht. Irgenwann drauf gekommen dass der Compiler zu
>dämlich ist um im Quellcode (und nicht nur ganz am Anfang von main)
>Variablen zu deklarieren -> Kreisch + Kopf->Tisch
Haette ich dir sagen koennen.

>Ist das bei euch auch so? Als Vorteil beim PIC wird ja oft erwähnt dass
>alles aus einer Hand kommt -> Hilft auch nichts wenn dann nichts
>funktioniert...
Wenn man sich mal ne Stunde damit beschaeftigt hat kriegt mans hin. Oder 
du gehst ins PIC Forum, und da helfe ich dir gerne 
(www.fernando-heitor.de). Hier erspare ich mir das, da jede Aussage 
bezueglich PIC/AVR unweigerlich in einen Flamewar ausartet, da irgendein 
AVR Fanboy sein Maul nicht halten kann. Daher ist hier meist jede Hilfe 
was das anbelangt vergebens und kostet nur Nerven.

Gruss,
Stampede

von Simon S. (-schumi-)


Lesenswert?

>Dh koennen keinen anderen Compiler wie der der dazu geplant wurde.
Ich arbeite immer mit dem Makefile, und das kann man beliebig verändern. 
Man kann aber auch z.B. in Geany unter "Erstellen"->"Komandos zum 
erstellen konfigurieren" direkt die Angaben für den Compiler (abhängig 
vom Dateityp z.B. ".c" -> "make all" oder ".bas" der FreeBASIC-Compiler) 
eingeben
(Was nicht heißen soll dass ich bis jetzt nur Geany benutzt habe, war 
z.B. lange auch mit Code::Blocks unterwegs. Im Moment schiele ich zu 
Anjuta)

>Ich finde, wenn was kompliziert zum Einstellen ist, dann sind es
>andere Programm wie Visual Studio und der ganz MS Kaese. Da motzt keiner!
Ich motze darüber nicht weil bei mir gilt MS=Käse -> Linux, und da is 
nix mit Visual Studio

>Dass man verschiedene Complier einbinden kann ist ja an und fuer sich
>nicht verkehrt. Da man die aber aus einem PullDown Menu holt, sollte das
>idiotensicher sein.
Ja, natürlich ist das nicht verkehrt, aber wenn ich ihm dann die .exe 
suchen darf ist das weniger toll (Was an der Stelle vielleicht auch 
etwas mit der Win-Architektur zusammenhängt, weil man da ja kein Prog 
ausführeren kann ohne ihm zu erzählen wo es ist)

>[Variablen mitten im Sourcecode geht nicht] Haette ich dir sagen koennen.
GCC hat mir aber z.B.
>for(unsigned char zaehler=0; zaehler<234; zaehler++)
angewohnt.
Und wenn mir der Compiler dann wieder nichtssagende Fehlermeldungen 
entgegenwirft habe ich direkt das Gefühl ich müsste gegen den Compiler 
kämpfen...

>Oder du gehst ins PIC Forum, und da helfe ich dir gerne (www.fernando-heitor.de).
Danke! Werd mich dort mal umsehen :-D

Vielen Dank für die Zahlreichen Rückmeldungen und Meinungen!
Gruß
-schumi-

von Simon S. (-schumi-)


Lesenswert?

ARGHH!! Ich könnt schon wieder dieses SCHEI** PIC-Zeug in der Luft 
zerreissen!!

Controller: 16F887
Compiler: mikroCPIC1618.exe

Code:
1
sbit  SPExpanderCS  at RA2_bit;
2
sbit  SPExpanderRST at RA3_bit;
3
sbit  SPExpanderCS_Direction  at TRISA2_bit;
4
sbit  SPExpanderRST_Direction at TRISA3_bit;
5
6
void wait (void)
7
{
8
  unsigned char zahl;
9
  for(zahl=0; zahl<30; zahl++)
10
  {
11
    Delay_ms(100);
12
  }
13
}
14
15
void main(void)
16
{
17
  ANSEL  = 0;  // Configure AN pins as digital
18
  ANSELH = 0;
19
  C1ON_bit = 0;// Disable comparators
20
  C2ON_bit = 0;
21
22
  TRISD=0b11111110;
23
24
  while(1)
25
  {
26
    PORTD=0;
27
    wait();
28
    PORTD=1;
29
    wait();
30
  }
31
}

Was passiert? -> LED für ca. 3sec. aus, dann flammt sie ganz ganz ganz 
kurz und fast nicht sichtbar auf

===> Ist es nicht mal möglich eine stinknormale blinkende LED zu 
programmieren?!?!?!?

Und mit dem Zeug soll ich Funktionen zur Ansteuerung einer Realtimeclock 
bauen -> Vergiss es

PS: wenn man 100ms als Zeit nimmt gehts (also for(zahl=0; zahl<1; 
zahl++))

von Michael X. (Firma: vyuxc) (der-michl)


Lesenswert?

Wo ist Delay_ms deklariert?

Ich fürchte deine MPLAB-Probleme lassen sich mit einem C-Lehrbuch lösen.

von Simon S. (-schumi-)


Lesenswert?

Das fürchte ich weniger.

1. die Delay_ms ist aus einem Beispielprogramm (dort war auch nichts 
mehr extra eingebunden)

2. 1x >> Delay_ms(100); << ausführen klappt einwandrei. Aber mehrmals 
(siehe for-Schleife) geht nicht. Nachdem ich auch jetzt sehr lange mit 
meinem Ausbilder zusammen herumprobiert habe stellte sich heraus, dass 
der Fehler eindeutig nicht mehr im Quellcode liegen kann (Wenn jemand 
genauer wissen möchte was sich bei der Analyse mit Oszi ergab erläutere 
ich das natürlich gerne).

==> Anderer µController + anderer Compiler wird morgen probiert. Bin ja 
schon mal gespannt...

von C. H. (_ch_)


Lesenswert?

Simon S. schrieb:
> (Wenn jemand
> genauer wissen möchte was sich bei der Analyse mit Oszi ergab erläutere
> ich das natürlich gerne).
Dann erzähl doch mal.

Bei den PICs im allgemeinen ist es eher ratsam das Latch-Register 
anstelle des PORT-Registers zu beschreiben - sprich in deinem Fall 
LATD-Register bzw. LATDbits.LATD0-Bit.

Desweiteren ist es immer gut auch mal ins Disassemblerlisting zu gucken 
und nachsehen was der Compiler so alles aus dem C-Code macht bzw. was 
alles wegoptimiert wird.

Gruß,
Christian

von Wilhelm F. (Gast)


Lesenswert?

Simon S. schrieb:

> 2. 1x >> Delay_ms(100); << ausführen klappt einwandrei. Aber mehrmals
> (siehe for-Schleife) geht nicht.

Untersuche mal den Assembler-Code, der vom Compiler generiert wird.

Ich arbeite oft mit dem SDCC für 8051, und ein Blick in den vom 
C-Compiler generierten Assemblercode bringt immer sehr viel Aufschluß, 
wie die C-Konstrukte genau umgesetzt werden.

von Simon S. (-schumi-)


Lesenswert?

>Dann erzähl doch mal.
Also: Es gibt zwei Funktionen:
1
void wait_aus (void)
2
{
3
  unsigned char zahl;
4
  PORTD=0;
5
  for(zahl=0; zahl<8; zahl++)
6
  {
7
    Delay_ms(100);
8
  }
9
}
und
1
void wait_ein (void)
2
{
3
  unsigned char zahl;
4
  PORTD=1;
5
  for(zahl=0; zahl<8; zahl++)
6
  {
7
    Delay_ms(100);
8
  }
9
}
Die sind also exakt gleich, bis auf das "PORTD=0;" <-> "PORTD=1;"

An RD0 wurde ein Oszi gehängt, ich werd mal versuchen jeweils das 
Oszibild zur entsprechenden main dazuzumalen:

================================================================
1
void main(void)
2
{
3
  TRISD=0b11111110;
4
  while(1)
5
  {
6
    wait_ein();
7
    wait_aus();
8
  }
9
}
Als auch:
1
void main(void)
2
{
3
  TRISD=0b11111110;
4
  while(1)
5
  {
6
    wait_ein();
7
    wait_aus();
8
    wait_ein();
9
    wait_aus();
10
  }
11
}
1
##########################
2
#  ____   ____   ____   _#
3
# |    | |    | |    | | #
4
# |    | |    | |    | | #
5
# |    | |    | |    | | #
6
#_|    |_|    |_|    |_| #
7
#                        #
8
##########################
9
=> Signal länger als Pause

================================================================
1
void main(void)
2
{
3
  TRISD=0b11111110;
4
  while(1)
5
  {
6
    wait_aus();
7
    wait_ein();
8
  }
9
}
als auch:
1
void main(void)
2
{
3
  TRISD=0b11111110;
4
  while(1)
5
  {
6
    wait_aus();
7
    wait_ein();
8
    wait_aus();
9
    wait_ein();
10
  }
11
}
1
##########################
2
#_     _     _     _     #
3
# |   | |   | |   | |   |#
4
# |   | |   | |   | |   |#
5
# |   | |   | |   | |   |#
6
# |___| |___| |___| |___|#
7
#                        #
8
##########################
9
=> Signal länger als Pause

Im Endeffekt kann man sagen, dass sich der Puls zur Pause (bzw. 
andersherum, je nach dem was als erstes in der Schleife kommt) >> IN 
ETWA << so verhällt:
Pause = Wartezeit
Puls  = 1/Wartezeit

Außerst verwirrend also wie man sieht...
In das ASM-File werd ich mal gucken, auch wenn ich dem Assembler bist 
jetzt noch kaum mächtig bin

Gruß
-schumi-

von Hans W. (stampede)


Lesenswert?

Moin,

wie sieht die Config aus? Speziell: sind Watchdog (danach sieht es mir 
fast schon aus) und LVP deaktiviert?
Mist, ich wollte doch hier nix mehr schreiben... :)

Gruss,
Stampede

von Vlad T. (vlad_tepesch)


Lesenswert?

Simon S. schrieb:
> Irgenwann drauf gekommen dass der Compiler zu
> dämlich ist um im Quellcode (und nicht nur ganz am Anfang von main)
> Variablen zu deklarieren -> Kreisch + Kopf->Tisch

das ist nun mal laut der ANSI C Sprachdefinition so

Variablendeklarationen zwischen Anweisungen gibts erst seit C99.

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.