Forum: Mikrocontroller und Digitale Elektronik c167: Schleifenbedingung


von Jam (Gast)


Lesenswert?

Hallo,

habe an den Pin5.8 des uC167cs, einen Schalter angebracht(schaltet 
normaloff).
Wenn der schalter betätigt wird soll in diese Schleife eingsprungen 
werden.

if(PMenue) // PMenue = P5^8; PMenue =0;
{
...
...
}

Das Prob ist jedoch, daß diese schleife immer als war erkannt wird.
Hab ich da was vergessen zu setzen?? den der Port5 könnte auch als 
AN-Port verwendet werden und ist ein Eingang??

Danke

von Jörg S. (joerg-s)


Lesenswert?

>Hab ich da was vergessen zu setzen??
Ist der Pin als Eingang definiert?

>PMenue =0;
Was willst du damit erreichen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jörg S. wrote:
>>Hab ich da was vergessen zu setzen??
> Ist der Pin als Eingang definiert?
Der ganze P5 ist beim C167 nur Eingang (analog und digital).

> Pin5.8
> PMenue = P5^8;
??
PMenue = P5&0x0100;
wäre bei einem High-aktiven Schalter am Pin P5.8 angebracht.

von Jam (Gast)


Lesenswert?

Hi Jörg,

war ein Tip-Fehler meinerseits, ich meine natürlich:
sbit PMenue = P5^8;
PMenue = 0;

Der Schalter ist vollgendemasen verdratet: c = +5V und no an PIN5.8.

 _/___ P5^8
|
+5V

Ich gucke somit ob an pin 5.8 +5V anliegen oder nicht, ist nicht somit
PMenue = 1; bzw PMenue = P5&0x0000; nicht korrekt??

von Jam (Gast)


Lesenswert?

Was will ich damit??

Wil den Taster als Menue eingang benutzen.
Wird ein High-Pegel an diesen Port erkannt soll in eine Menue Routine 
gesprungen werden.

Der Taster soll in einer Endlosschleife immer Wieder abfragen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> P5^8
Das ^ ist in C ein EXOR.
Und mit dezimal 8 manipulierst du das Bit 3  :-o
Fazit: P5 exor 8  ist nicht P5.8


Mach an deine Schaltung mal noch einen Pulldown hin ;-)
Wie soll denn der Eingangspin sonst auf 0V kommen?

+5V
 |___/_____ P5^8
        |
        R
        |
       GND

von PSchneider (Gast)


Lesenswert?

Ich glaube es wäre besser P5.8 mit ca. 4k7 an +5V hängen und dann mit 
dem Schalter gegen Masse schalten. Gibt dann zwar einen 0 bei Schalter 
EIN, sollte aber kein Problem sein. Du brauchst vernüftige Pegel am 
Port.

von Marco G. (stan)


Lesenswert?

P5_P8 müsst in deinem include-file c167.h schon als P5^8 definiert sein, 
du kannst also P5_P8 direkt abfragen.
(edit: da steht "sbit P5_P8 = P5^8;" drin)

also
1
#define PMenue P5_P8
2
3
if (PMenue) {
4
...
5
}

Allerdings fehlt dir in deinem Mini-Schaltplan noch ein Pull-down 
Widerstand für einen definierten Pegel, falls der Schalter offen ist!

Die C16x haben meines Wissen keine internen Pull-Up/Down Widerstände, 
erst die XC2000 Familie...

von Jam (Gast)


Lesenswert?

mit P5^8; kann ich explizeit den Port ansprechen und ja er ist im 
include-file c167.h definiert.
Hab mir das irgenwie einfacher vorgestellt.
Ist das nicht so das wenn ich den port5.8 auf hight/low setze ich einen 
hohen/kleinen wiederstand am port habe?? und somit den schalter einfach 
an den Port hängen kann??

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ist das nicht so das wenn ich den port5.8 auf hight/low setze ich einen
> hohen/kleinen wiederstand am port habe??
Nein, der P5 ist ein hochohmiger (weil auch ADC) Eingangsport ohne 
schaltbare Pullups/Pulldows.

von Damian (Gast)


Lesenswert?

einen wiederstand zu was?

du ahst einen internen pull up wiederstand an 5V.
hängt nichts am pin, und du liest diesen, wirst du ne 1 lesen...
ziehst du den pin extern auf Masse, wirst du eine 0 lesen...

wofür man da allenfalls wie oben geschrieben externe widerstände 
brauchen soll, ist mir schleierhaft, würde dem sinn interner pull-ups 
widersprechen...

sehe das problem nicht...
sind die pins richtig konfiguriert? (Dave wär ein gemütliches tool für 
den anfang...)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> mit P5^8; kann ich explizeit den Port ansprechen und ja er ist im
> include-file c167.h definiert.
Welcher Compiler?

Ich weiß nicht so recht...
In meinen C-Programmen ist das ^ ein Bit-Operator.

von Marco G. (stan)


Lesenswert?

Damian wrote:
> du hast einen internen pull up widerstand an 5V.

nein hat er nicht.

von Jam (Gast)


Lesenswert?

compiler Keil.
Domian, hab nur den Port5 auf low gesetzt: P5 = 0x0000; wie du bereits 
erwähnt hast ist p5 ja ein Eingang und somit fällt DP5(richtung ja weg).
fehlt da noch was??

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Domian, hab nur den Port5 auf low gesetzt: P5 = 0x0000;
Du kannst auf den P5 auch dein Geburtsdatum schreiben, das wird nichts 
ändern. Nochmal langsam zum mitlesen:
Es gibt kein Ausgangsregister und keine Pulldowns oder Pullups für P5
Mach einen externen 10k Pulldown an den Pin.

> compiler Keil.
Na gut, böses C-Derivat.
Da solltest du deinen Portpin so definieren:
1
sbit PMenue = P5^8;
Diese Compilererweiterung ist übrigens was ganz anderes als wenn du 
schreibst:
1
PMenue = P5^8;
das sbit macht den Unterschied.

von Marco G. (stan)


Lesenswert?

Lothar Miller wrote:
> Da solltest du deinen Portpin so definieren:
1
sbit PMenue = P5^8;
>

besser wäre wohl
1
#define PMenue P5_P8
weil P5_P8 schon mit sbit definiert ist.

von Jam (Gast)


Lesenswert?

also mit dem defenieren(sbit PMenue = P5^8;), klappt es ohne Probleme 
hab schon knapp 900Zeilen code und ich hatte bis jetzt keine prop.
Der c167 sowie und Vorgänger, sind Bitadressierbar und mit
sbit PMenue = P5^8; kann ich bitweise auf jeden port zugreifen(wie eine 
Variable mit der bezeichnung PMenue).
Hab mitlerweile einen Pulldownwiederstand(9.1k) dran. Das Problem ist 
nun, daß wenn ich den Schalter betätige, resetet der uC(Kurzschluß??). 
Wieso passiert sowas?? hat einer eine Idee??

Danke für die vielen Tips

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> resetet der uC(Kurzschluß??).
Ich kenne deine Lötkünste nicht, würde hier aber eher auf ein 
Softwareproblem tippen.
Hast du den Watchdog eingeschaltet?

von H.Joachim S. (crazyhorse)


Lesenswert?

Wird an dem Pin vielleicht irgendein Interrupt ausgelöst? Noch dazu 
einer, zu dem es keinen handler gibt?

von Jam (Gast)


Lesenswert?

Hab die lötstellen bereits geprüft alles i.o.
Den Watchdog habe nicht eingeschaltet aber auch nicht ausgeschaltet.
In wiefern kann der Watchdog den stören??

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> In wiefern kann der Watchdog den stören??
Indem er einen Reset erzeugt?

Auszug aus dem DB:
1
The Watchdog Timer is always enabled after a reset of the chip, 
2
and can only be disabled in the time interval until the EINIT 
3
(end of initialization) instruction has been executed. 
4
Thus, the chip’s start-up procedure is always monitored. 
5
The software has to be designed to service the Watchdog Timer 
6
before it overflows.

von Marco G. (stan)


Lesenswert?

Es könnte sein dass der Watchdog schon in der STARTUP.a66 (die Datei mit 
dem Startup-Code, die µVision einbindet) ausgeschalten wird.

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.