Atxmega128B1 If abfrage

Gast #2890652
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
#2890679
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
#2890700
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)
Gast #2890721
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....
(Firma: matzetronics) #2891148
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
(Firma: matzetronics) #2891274
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
Gast #2892057
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
#2892229
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;
}
#2892668
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.
Gast #2892716
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).
Gast #2892734
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
Angehängte Dateien:
Gast #2892955
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.

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