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....
Wird nicht mit
1 | PORTE_DIRSET = PIN0_bp |
der Pin als Ausgang definiert? Müsste den da nicht
1 | PORTE_DIRCLR=0x01U; |
stehen?
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
Hallo Matthias auf, wie würde dann eine Pin-Abfrage auf Pin E0 denn aussehen... Gruß Andi p.s. ich krieg das nicht gebacken
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
|
9 | tu_was(); // hier wird der Tastendruck verwertet |
10 | } // das wars |
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 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
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; }
Hallo Alois, hab jetzt deine Änderung übernommen. aber das ganz geht immer noch nicht... Hilfeeeeeeeee......... Danke Andi
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.