Forum: Mikrocontroller und Digitale Elektronik Atxmega128B1 If abfrage


von andi (Gast)


Lesenswert?

Hallo an alle,
seit heute versuche ich den umstieg von Renesas auf Atmel Controller.
Hab mir dazu ein Mega-B1 Xplained Board gekauft, und nun tauchen viele 
Fragen auf.

habe jetzt einen Code geschrieben der den Eingang PortE0 abfragen soll 
und
dann PortB4 setzen oder loeschen soll ( if...else..).
Aber das ganze geht nicht wie ich meine könnt Ihr mir helfen...

Hier der Code

PORTE_DIRSET = PIN0_bp;

PORTB_DIRSET = PIN4_bm;

 while(1)
 {
     if ( PORTE_IN & 0x00)
  {
       PORTB_OUTSET = PIN4_bm;
  }
  else
  {
       PORTB_OUTCLR = PIN4_bm;
  }
 }

bei den Renesas sa das ganze so aus

pd2_5 = 1;   // Set the port p2_5 be used for output (CONVST)
pd2_0 = 0;        // Set the port p2_0 be used for Input (HighVoltage)
while(1)
{
   if (p2_5 == 1)
     {
         //hier steht dann der Code
     }
    else
     {
         //hier steht dann der else-Code
     }
}

warum geht das bei dem AVR-Studio/ATxmega nicht so einfach...


Danke für euere Hilfe

von Alex S. (thor368)


Lesenswert?

Tach andi,

dein Denkfehler ist die und-Verknüpfung. Wenn du etwas mit 0 verundest 
kann nur null dabei raus kommen. Stell dir das PIn als ein Byte im 
Speicher vor, dass dir bit für bit jeden Eingangswert an jedem Pin des 
Ports abbildet. Möchtest du also das erste bit aus dem Byte (entspricht 
Port Bit 0) per und maskieren musst du auch mit 1 verunden.

Thor

von andi (Gast)


Lesenswert?

Hallo Thor,
wie wuerde die abfrage dann aussehen....


Gruß
Andi

von Karl H. (kbuchegg)


Lesenswert?

Im Prinzip genau so, wie du auch das Bit 4 im Output Register gesetzt 
hast

     if ( PORTE_IN & PIN0_bm)



oder
     if ( PORTE_IN & 0x01 )

oder
     if ( POTRTE_IN & ( 1 << 0 ) )

(und höchst wahrscheinlich ist PIN0_bm nichts anders als ein Makro für 
eine der beiden anderen Schreibweisen, wie man die Maske noch 
formulieren kann)

von andi (Gast)


Lesenswert?

Hallo hab die abfrage jetzt so gemacht,
aber es geht noch nicht.
was ich sicher weis, die ausgänge funktionieren.
Kann es sein das ich den Eingang Port E0, falsch eingestellt habe??

Danke
Andi

P.S. find nur ich diese Art zu Programmieren mit dem AVR-Studio 
umständlich....

von Coder (Gast)


Lesenswert?

Wird nicht mit
1
PORTE_DIRSET = PIN0_bp
der Pin als Ausgang definiert?
Müsste den da nicht
1
PORTE_DIRCLR=0x01U;
stehen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Coder schrieb:
> Wird nicht mitPORTE_DIRSET = PIN0_bp
> der Pin als Ausgang definiert?
> Müsste den da nichtPORTE_DIRCLR=0x01U;
> stehen?

So isses. Ausserdem kenne ich das eher so:
1
PORTE.DIRCLR = PIN6_bm;  // Pin 6 auf Port E ist Eingang
2
// und dann z.B. 
3
PORTE.PIN6CTRL = PORT_OPC_PULLUP_gc; // Pullup ist aktiviert
4
// oder mal einen Ausgang?
5
PORTE.DIRSET = PIN2_bm;
6
PORTE.OUTSET = PIN2_bm; // ist jetzt high
7
PORTE.OUTCLR = PIN2_bm; // ist jetzt low
8
// frag mal einen Pin ab:
9
meinetaste = PORTE.IN & PIN6_bm;
Besser ist es im allgemeinen, sich die bitmasks als #define abzulegen, 
z.B.
#define GREEN_LED PIN2_bm

von andi (Gast)


Lesenswert?

Hallo Matthias auf,
wie würde dann eine Pin-Abfrage auf Pin E0 denn aussehen...


Gruß
Andi


p.s. ich krieg das nicht gebacken

von andi (Gast)


Lesenswert?

Ach ja...Noch eine Frage,
macht es eigentlich einen Unterschied ob ich

PORTE_PIN6CTRL ...so schreibe

oder

PORTE.PIN6CTRL  ...so mit Punkt


Fragen über Fragen


Gruß
Andi

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

andi schrieb:
> Ach ja...Noch eine Frage,
> macht es eigentlich einen Unterschied ob ich
>
> PORTE_PIN6CTRL ...so schreibe
>
> oder
>
> PORTE.PIN6CTRL  ...so mit Punkt

Allerdings. Die Schreibweise mit Unterstrich funktioniert nämlich nicht.

andi schrieb:
> Hallo Matthias auf,
> wie würde dann eine Pin-Abfrage auf Pin E0 denn aussehen...

Jo, bin jetzt auf...
Sieht z.B. so aus, der Taster geht auf Masse, wenn gedrückt. Deswegen 
aktiviere ich noch den Pullup des Pins:
1
#define BUTTON0 PIN0_bm
2
#define BUTTON_PORT PORTE
3
// init des Ports
4
BUTTON_PORT.DIRCLR = BUTTON0;
5
BUTTON_PORT.PIN0CTRL = PORT_OPC_PULLUP_gc; // Pullup ist aktiviert
6
// fertig, nun mal abfragen, ob jemand die Taste drückt
7
if (!(BUTTON_PORT.IN & BUTTON0)) {
8
// yes! jemand drückt die Taste, und das Ergebnis des 'If' ist wahr
9
   tu_was(); // hier wird der Tastendruck verwertet
10
}   // das wars

von Andi (Gast)


Lesenswert?

Hallo an alle,
mein Prg. funktioniert jetzt so weit, bis auf Problem.
Ich möchhte 2 Eingänge abfragen und einen dazugehörigen Ausgang 
schalten.
Das geht so weit, nur wen ich den ersten Eingang drücke, reagiert der 
zweite nicht mehr, wenn ich denn anderen zuerst drücke funktioniert der 
andere nicht mehr. Mein Problem glaube ich liegt in der If 
Abfrage....könnt Ihr mir helfen...Code siehe unten

int main(void)
{
Clock_init();
PLL_init();

PORTE_DIRCLR = PIN0_bm;
PORTE_DIRCLR = PIN3_bm;
PORTE_PIN0CTRL = PORT_OPC_PULLUP_gc;
PORTE_PIN3CTRL = PORT_OPC_PULLUP_gc;

PORTB_DIRSET = PIN4_bm;
PORTE_DIRSET = PIN5_bm;

while(1)
{
  //_delay_ms(1000);
  if (PORTE.IN  & PIN0_bm)
  {
       PORTB_OUTCLR = PIN4_bm;    //Set the led ON
  }
  else
  {
  //_delay_ms(1000);
       PORTB_OUTSET = PIN4_bm;    //Set the led OFF
  }


  if ( (PORTE.IN & PIN3_bm) == 0x08)
  {
      PORTE_OUTCLR = PIN5_bm;    //Set the led ON
  }
  else
  {
             PORTE_OUTSET = PIN5_bm;    //Set the led OFF
  }
}


Gruß und Danke Andi

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

Hallo Andi,
wenn du noch mehr Hilfe zu den Xmegas suchst, dann hilft dir vielleicht 
das Tutorial:http://www.jtronics.de/avr-projekte/xmega-tutorial.html

Dort ist zum Beispiel auch dein Problem erklärt.
siehe: 
http://www.jtronics.de/avr-projekte/xmega-tutorial/xmega-tutorial-io.html

von Andi (Gast)


Lesenswert?

Hallo Martin,
hab die Abfrage geändert wie in der Beschreibung,
ändert aber an meinem Problem nichts....

Weis nicht mehr weiter...verdammte..sch...

Na egal...Probier ich halt weiter.


Gruß
Andi

von Andi (Gast)


Lesenswert?

Hallo...
Weis denn keiner woran es liegen kann...



Danke
Andi

von Alois N. (alois)


Lesenswert?

Hi Andi,

überleg doch mal...

PIN0_bm steht für die Bitmaske 0x01 oder binär 00000001
PIN3_bm steht für die Bitmaske 0x08 oder binär 00001000

Drückst du beide Tasten erhälst du 0x09 oder binär 00001001

if (PORTE.IN & (1<<PIN0_bp))
{
   PORTB_OUTCLR = PIN4_bm;
}
else
{
   PORTB_OUTSET = PIN4_bm;
}

if (PORTE.IN & (1<<PIN3_bp))
{
   PORTE_OUTCLR = PIN5_bm;
}
else
{
   PORTE_OUTSET = PIN5_bm;
}

von Andi (Gast)


Lesenswert?

Hallo Alois,
hab jetzt deine Änderung übernommen. aber das ganz geht immer noch 
nicht...

Hilfeeeeeeeee.........

Danke Andi

von Thomas K. (muetze1)


Lesenswert?

Kleine Frage zum Nachdenken für dich:
1
PORTE_DIRCLR = PIN0_bm;
2
PORTE_DIRCLR = PIN3_bm;
3
//..
4
PORTB_DIRSET = PIN4_bm;
5
PORTE_DIRSET = PIN5_bm;

Du weist zwei unterschiedliche Werte einem Register zu. Welcher Wert 
steht am Ende in dem Register? Wert a oder Wert b?

Das Problem hast du zweimal, siehe Code Auszug.

von xfr (Gast)


Lesenswert?

Thomas K. schrieb:
> Kleine Frage zum Nachdenken für dich:PORTE_DIRCLR = PIN0_bm;
> PORTE_DIRCLR = PIN3_bm;
> //..
> PORTB_DIRSET = PIN4_bm;
> PORTE_DIRSET = PIN5_bm;
>
> Du weist zwei unterschiedliche Werte einem Register zu. Welcher Wert
> steht am Ende in dem Register? Wert a oder Wert b?
>
> Das Problem hast du zweimal, siehe Code Auszug.

In diesem Fall passt das schon. Beim Xmega sind die Register DIRCLR bzw. 
DIRSET dafür da, einzelne Bits mit einer Anweisung zu setzen/löschen.

@Andi: Poste am besten mal dein komplettes Programm, wie es aktuell ist 
und sage genau, was es machen soll und was stattdessen es macht. Der 
Code von Alois Neumann sieht nämlich vernünftig aus.

Eventuell hast Du beim Übernehmen der Änderung nicht den Unterschied 
zwischen PIN0_bp und PIN0_bm bemerkt. Das erste ist die Bitposition, das 
zweite die Bitmaske. PIN0_bm ist also das gleiche wie (1<<PIN0_bp).

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo xfr,
hab das programm angehängt. Es soll auf Logisch ein am Eingang E0 den 
Ausgang auf Logisch null setzen. Und bei E3 soll das selbe auf einen 
anderen Eingang passieren. Das geht auch soweit nur wenn ich einen 
drücke und dann den anderen geht letzterer nicht.

Vielleicht kannst du mir helfen....

Gruß
andi

von xfr (Gast)


Lesenswert?

Andi schrieb:
> Vielleicht kannst du mir helfen....

Leider nein. Ich sehe in dem Code keinen Fehler, der das Verhalten 
erklärt.

Beide Tasten sollten unabhängig voneinander funktionieren. So lange die 
Taste gedrückt bleibt, sollte die dazugehörige LED leuchten (sofern '1' 
bei den Tasten für gedrückt steht und '0' bei den LEDs für 
eingeschaltet). Wenn man beide Tasten gedrückt hält, entsprechend beide 
LEDs.

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.