Atxmega128B1 If abfrage

Gast #2890652
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
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
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
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)
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
Gast
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
(Firma: matzetronics)
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
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
Gast
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
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;
}
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.