Forum: Mikrocontroller und Digitale Elektronik MPLAP und C18


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Bin Neuling bei der Programmierung von Microchip PIC's mit MPLAP 7.60 
und C18 Compiler.
.
Ich suche eine Option/Schalter, die mir die Zeilen auf dem Bildschirm 
nach dem starten des Programms wieder anzeigt. Also dort, wo ich das 
Programm beendet habe.
.
Besteht eine Möglichkeit, in MPLAP einen anderen Editor einzubinden?

Gruß Siegfried

von C. H. (_ch_)


Lesenswert?

Hallo,

du hast die Option den letzten "workspace" zu speichern, so dass dieser 
nach dem Programmneustart wieder geöffnet wird.
Ob dieser sich die Editor-Zeilen merkt kann ich nicht beantworten.

Mir persönlich gefällt der Mplab-Editor nicht - ich verwende MPLAB nur 
zum Kompilieren und flashen/debuggen.

Gruß
Christian

von Siegfried S. (dieleena)


Lesenswert?

Hallo Christian,
Welchen Editor verwendest du?
Gruß Siegfried

von C. H. (_ch_)


Lesenswert?

Hallo,

Firma: UltraEdit (Win)
privat: geany (Win+Linux), programmer's notepad (Win)

Editoren sind Geschmackssache. Der eine arbeitet lieber mit X, der 
andere mit Y... darüber kann man streiten :) Einfach ausprobieren.

Gruß
Christian

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Danke für die Info.
Habe aber ein Problem mit einem Bit testen.
Folgende Zeile

#define bit_set(var,bitnr)   ((var) |= 1 << (bitnr))
#define bit_clear(var,bitnr) ((var) &= ~(1 << (bitnr)))
#define bit_test(var,bitnr)  ((var) & (1 << (bitnr)))

unsigned char Testen;
unsigned char Count_1;

OE_1, SPI1_EN,LED_RUN und LED_DATA sind IO Pin zugeordnet.
..
Testen = 0xF0;

if (bit_test(Testen, 4) == 1)
{
OE_1 = 1;
Count_1++;
}
if (bit_test(Testen, 5) == 1)
{
SPI1_EN = 1;
Count_1++;
}
if (bit_test(Testen, 6) == 1)
{
LED_RUN = 1;
Count_1++;
}
if (bit_test(Testen, 7) == 1)
{
LED_DATA = 1;
Count_1++;
}

Versuche verzweifelt ein Bit zu testen. Dieses funktioniert nicht.
Testen habe ich 0xF0 zugewiesen, und somit müßten die Bit 4 bis 7 eine 1 
haben.
Habe warscheinlich meinen schlechten Tag oder soll es mit dem Free C18 
zu tun haben?
Setzen und löschen funktionieren.
Es werden die Zeilen zwischen den {  ..  } nicht ausgeführt

Gruß Siegfried

von C. H. (_ch_)


Lesenswert?

Hallo,

ich vermute, dass dein Problem folgendes ist:

mit "bit_test(Testen, 4)" verundest du die Variable 'Testen' mit 
0b00010000;
als positives Ergebis würdest du 0b00010000 bzw. 0x10 erhalten;
da der Compiler bei der if-Abfrage die '1' auf den anderen Typ castet 
(nämlich auf den von 'Testen') vergleichst du 0x10 mit 1, also 
0b00000001 / 0x01 -> das Ergebnis ist FALSE;

also entweder:
1
if (bit_test(Testen, 4) == 0x10)

oder
1
if ( (bit_test(Testen, 4) >>4) == 1)

Gruß
Christian

von C. H. (_ch_)


Lesenswert?

oder du machst es ganz anders:
1
#define TEST_BIT    &
2
#define BIT_0       0b00000001
3
#define BIT_1       0b00000010
4
//..etc
5
6
7
if (Testen TEST_BIT BIT_0)
8
{ ...}

sollte funktionieren.

Gruß, schönes Woe
Christian

von Siegfried S. (dieleena)


Lesenswert?

Hallo Christian,
Danke für die schnelle Infos.
Habe auf die schnelle ein neues Projekt erstellt.
Folgende Zeilen mit verschiedene Varianten:
Jetzt funktioniert es(es wieder). Weiß der Teufel, was ich zerschossen 
habe, obwohl der Compiler nicht meckert. Ist vieleicht zu heiß?

void myTest(void)
{
myCount = 0;
Testen = 0b00001000;

if ((Testen & 0b00001000) >= 1)
{myCount++; }
if (Testen & (1 << 3))
{myCount++;}
if (bit_test(Testen, 3))
{myCount++;}
if (Testen TEST_BIT BIT_3)
{myCount++;}
}

nutze deine letzte Variante. Werde noch sehen, das ich setzen und lösche 
dem anpassen kann.

Gruß und schönes Wochenende
Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo Christian,
Habe weiter

//
#define TEST_BIT    &
#define BIT_0       0b00000001
#define BIT_1       0b00000010
#...
//
#define SET_BIT    |=
#define BIT_0       0b00000001
#define BIT_1       0b00000010
...
//
#define DEL_BIT    &= ~
#define BIT_0       0b00000001
#define BIT_1       0b00000010
...
Testen SET_BIT BIT_4;

Testen DEL_BIT BIT_4;

Code funktioniert.

mit dem mehrfachem deklarieren von BIT_0, ist das so in Ordnung.
Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
die Variante
if (Testen TEST_BIT BIT_3)
{myCount++;}
}
testet ein Bit auf eine '1'
Habe versucht diese umzustellen auf
if (Testen TEST_BIT !BIT_3)
{myCount++;}
}
um ein Bit auf eine '0' zu testen.
leider funktioniert mein Code nicht.

Gruß Siegfried

von C. H. (_ch_)


Lesenswert?

so funktioniert das nicht...
Der '!' Operator macht eine logische Negierung, KEINE bitweise.

what about
1
if ( !(Testen TEST_BIT BIT_3) )
?

oder:
1
if ( (~Testen) TEST_BIT BIT_3) )
sollte auch funktionieren.


Gruß
Christian

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
wie kann ich in der Simulation (am PC) einem Input Pin einen Wert 
zuweisen?
Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo Christian,
Danke für deine Infos. funtioniert.

Besteht die Möglichkeit, den Editor von MPLAP mit dem UltraEdit 
auszutauschen?
Gruß Siegfried

von C. H. (_ch_)


Lesenswert?

Siegfried Saueressig wrote:
> Danke für deine Infos. funtioniert.
Bitteschön.

> Besteht die Möglichkeit, den Editor von MPLAP mit dem UltraEdit
> auszutauschen?
Ist mir nicht bekannt. Kann es mir auch nur schwer vorstellen, dass es 
vorgesehen/möglich ist.

Gruß
Christian

von Siegfried S. (dieleena)


Lesenswert?

Hallo Christian,
Danke für die schnelle Antwort.
Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo guten morgen,

//
#define TEST_BIT    &
#define BIT_0       0b00000001
#define BIT_1       0b00000010
#...

if (Testen TEST_BIT BIT_0)

Besteht die Möglichkeit, das "BIT_0" ein Zeiger ist.
z.B.
for (x=0; x<=7; x++)
{
if (Testen TEST_BIT x)
{
... Code
}
}
Diese überlegung würde mir Codezeilen sparen, da ich dann keine 
switch(x) Anweisung benötigen .

Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo,

Habe folgendes eingebunden.
//
BitVariable[0] = 0b00000001;
BitVariable[1] = 0b00000010;
BitVariable[2] = 0b00000100;
BitVariable[3] = 0b00001000;
BitVariable[4] = 0b00010000;
BitVariable[5] = 0b00100000;
BitVariable[6] = 0b01000000;
BitVariable[7] = 0b10000000;
//
BitVariable sind als Char deklariert.
...
if ((PortPinOutput[Count_1]) TEST_BIT BitVariable[Count_2])
{
...
}

Soweit ich das in Debugger überprüft habe, funtioniert es.

ist diese IF Zeile richtig, oder habe ich gemurkst.?

Gruß Siegfried

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.