Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe.


von Wolfgang Steinecker (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

hab ein kleines Problem.

Ich verwende gerade den AN2131, und programmiere ein Programm,dass wenn 
ich am Port-C an einem PIN ( in meinem Fall der Pin 8 ) einen Taster 
gegen 3,3V schalte, am Port-B der Pin-1 eine LED zum leuchten bringt, 
lasse ich den Taster aus soll auch die LED erlischen.

Problem:

LED leuchtet am Anfang nicht, wird der Taster gedrückt leuchtet sie auf 
, aber dabei bleibt es auch. Beim Auslassen des Taster leuchtet sie aber 
weiterhin.

Liegt das an dem Pull down Wdst ? In unserem Fall betrtägt er 1M Ohm.

PS: Hier mein C-Programm:

#define ALLOCATE_EXTERN
#include "ezusb.h"
#include "ezregs.h"

void main (void)
{
  PORTCCFG=0x00;
  PORTBCFG=0x00;
  OEB=0x01;  //nur der PIN 1 am Port B wird als Ausgang definiert
  OEC=0x00;

while(1)
{

if(PINSC&0x80==1) //wenn der 8te PIN am Port-C HIGH ist
{

  OUTB=0x01;   // Ausgabe am Port-B (Pin 1) ( Hier ist die LED)
}
else
OUTB=0x00;
}
}

MFG Wolfgang S.

von Alber (Gast)


Lesenswert?

Ich kenn mich mit C nicht so aus aber...
 muss OUTB=0x00; nicht auch in den geschweiften klammern gesetzt werden 
?

von Karl H. (kbuchegg)


Lesenswert?

Das hier

if(PINSC&0x80==1)

kann niemals erfüllt werden.

Wenn du das eingelesene Byte soweit maskierst, dass nur das linkste Bit 
übrig bleibt, dann kann das Ergebnis nur 0 oder eben 0x80 sein. Aber es 
kann niemals 1 sein.

Mach dir das Leben nicht so schwer. C verlangt nicht, dass du einen 
Vergleich machen musst. Da kann ein beliebiger Ausdruck stehen, der 
ausgerechnet entweder 0 oder nicht 0 ergibt(*). D.h. du musst nicht 
explizit vergleichen

   if( PINSC & 0x80 )

entweder nach dem Maskieren mittels des & bleibt 0 übrig (weil das Bit 
ganz links an der 0x80 Position nicht gesetzt ist), dann wird das 
Ergebnis der Bedingung ebenfalls als FALSE gewertet und der else kommt 
zum Zug.
Oder aber nach dem Maskieren bleibt dieses eine Bit als 1 übrig, dann 
ist das Ergebnis nach der Maskierung ungleich 0. Und das reicht schon. 
Du musst gar nicht wissen, welche Zahl dann nach dem Maskieren übrig 
bliebt, es reicht völlig, dass nicht 0 übrig bleibt. Und dann kommt auch 
der then-Teil des ifs zum Zug.


(*) in diesem Sinne ist in C ein Vergleich auch nur eine 'arithmetische 
Operation', die entweder 0 oder 1 liefert, je nachdem ob der Vergleich 
zutrifft oder nicht.
So wie
    a + b
ein Ergebnis liefert, mit dem weitergerechnet werden kann, genauso 
liefert auch
    a < b
ein Ergebnis (0 oder 1) mit dem weitergerechnet werden kann.
    i = 5 * ( a < b );
ist perfektes, gültiges C.

von Wolfgang Steinecker (Gast)


Lesenswert?

Hallo,

Danke für die schnelle Antwort.

Mein Programm sieht jetzt so aus ( Habe den 8ten PIN am Port C mit PIN 1 
vertauscht. Die if- Abfragen habe ich ebenfalls geändert.
Das Problem bleibt aber trotzdem noch vorhanden, die LED leuchtet auf 
und erlischt nicht beim loslassen des Tasters. Was kanns da haben? Liegt 
es am Pull-Down Wdst ? Ist er zu groß oder zu klein?

#define ALLOCATE_EXTERN
#include "ezusb.h"
#include "ezregs.h"

void main (void)
{
  PORTCCFG=0x00;
  PORTBCFG=0x00;
  OEB=0x01;
  OEC=0x00;

while(1)
{

if(PINSC&0x01) // Hier jeztz nur der erste PIN am Port-C
{

  OUTB=0x01;
}
else
{
OUTB=0x00;
}
}
}

von Karl H. (kbuchegg)


Lesenswert?

Gleich vorweg:
Ich kenn den AN_was_war_das_nochmal nicht.

Aber das hier

  PORTCCFG=0x00;
  PORTBCFG=0x00;

kommt mir komisch vor.

PORTCCFG klingt für mich nach PORTC ConFiGuration.
Da würde ich mal vermuten, dass du die Richtung festgelegt wird. Also 
welcher Pin ist Eingang, welcher Pin ist Ausgang.

Jetzt wird aber in beiden Fällen dasselbe, nämlich 0x00 zugewiesen. 
Dabei sollte doch der Port C auf Eingang und der Port B auf Ausgang 
sein.

Stimmen diese Zuweisungen?
Es kann ja auch sein, dass die Richtung erst hier

  OEB=0x01;
  OEC=0x00;

eingestellt werden.

Wie gesagt: Ich kenn den Chip nicht
(und es zeigt sich, dass es keine so gute Idee ist, mit einem µC 
anzufangen, für den man keinen gscheiten Support zb durch ein Forum hat. 
So ist man dann immer Einzelkämpfer)

von Karl H. (kbuchegg)


Lesenswert?

> Habe den 8ten PIN am Port C mit PIN 1
> vertauscht.

Wie ist die genaue Bezeichnung?
In der Programmierung fangen wir mit 0 zu zählen an. D.h. der erste Pin 
ist der Pin mit der Nummer 0 am Port (und den fragst du auch im Programm 
ab)

Gewöhn dich an die 0. Das vermeidet Misverständnisse. Dein Eingang war 
vorher nicht am 8. Pin vom Port C sondern an PC7

von Dietrich L. (dietrichl)


Lesenswert?

Wolfgang Steinecker schrieb:
> Liegt es am Pull-Down Wdst ? Ist er zu groß oder zu klein?

Wenn intern ein Pull-Up Widerstand eingebaut ist, ist 1MOhm bestimmt zu 
viel. Schau mal ins Datenblatt. Ansonsten probiere es mal mit 10kOhm.

Gruß Dietrich

von Thomas (kosmos)


Lesenswert?

Du prüft einmal wie die Taste steht, wenn sie gedrückt wird geht die Led 
an und das Programm springt weiter. Es erfolgt also keine weitere 
Abfrage ob die Taste inzwischen losgelassen wurde.

Du musst irgend wann einmal die Abfrage nochmal durchführen um zu prüfen 
ob die Taste inzw. losgelassen wurde.

Deutet das while auf eine Schleife hin, kenne mich mit C nicht aus.

von Karl H. (kbuchegg)


Lesenswert?

Thomas O. schrieb:
> Du prüft einmal wie die Taste steht, wenn sie gedrückt wird geht die Led
> an und das Programm springt weiter. Es erfolgt also keine weitere
> Abfrage ob die Taste inzwischen losgelassen wurde.
>
> Du musst irgend wann einmal die Abfrage nochmal durchführen um zu prüfen
> ob die Taste inzw. losgelassen wurde.
>
> Deutet das while auf eine Schleife hin, kenne mich mit C nicht aus.

tut es.

Den Code mal etwas besser eingerückt (übrigens: Wolfgang, gewöhn dir 
dieses Code an den linken Rand picken gleich wieder ab)
1
#define ALLOCATE_EXTERN
2
#include "ezusb.h"
3
#include "ezregs.h"
4
5
void main (void)
6
{
7
  PORTCCFG = 0x00;
8
  PORTBCFG = 0x00;
9
  OEB = 0x01;
10
  OEC = 0x00;
11
12
  while(1)
13
  {
14
15
    if(PINSC & 0x01) // Hier jeztz nur der erste PIN am Port-C
16
    {
17
      OUTB = 0x01;
18
    }
19
    else
20
    {
21
      OUTB = 0x00;
22
    }
23
  }
24
}

von Thomas (kosmos)


Lesenswert?

Mess mal am µC-Pin wo der Taster dranhängt was sich nach dem Drücken und 
Loslassen des Pins tut, also Voltmeter dran und berichten.

von Wolfgang Steinecker (Gast)


Lesenswert?

Hallo Leute,

Habe ned Fehler entdeckt, ich habe einen viel zu großen Pull-Down 
Widerstand verwendet.

Mit einem 15k Ohm funkt es super :)

Danke für eure Antworten, MFG

von Thomas (kosmos)


Lesenswert?

Wie bist du drauf gekommen, einfach einen kleineren ausprobiert oder 
hast du mit dem Multimeter gemessen.

In deiner Zeichnung ist ja 10 kOhm eingezeichnet gewesen, wie groß war 
er denn wirklich. Kann es sein das da interne Pullups aktiviert sind.

von ... (Gast)


Lesenswert?

Thomas O. schrieb:
> Wie bist du drauf gekommen, einfach einen kleineren ausprobiert oder
> hast du mit dem Multimeter gemessen.
Beitrag "Re: Bitte um Hilfe."

> In deiner Zeichnung ist ja 10 kOhm eingezeichnet gewesen, wie groß war
> er denn wirklich.
Stand im ersten Post:
Wolfgang Steinecker schrieb:
> Liegt das an dem Pull down Wdst ? In unserem Fall betrtägt er 1M Ohm.

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.