Bitte um Hilfe.

Gast #2336510
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.
Angehängte Dateien:
#2336532
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.
Gast #2336556
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;
}
}
}
#2336567
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)
#2336570
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
#2336676
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.
#2336679
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren