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)
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....
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
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
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
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
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;
}
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.
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).
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
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.