www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Butterfly - Wie auf Joystick zugreifen?


Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bekomme es einfach nicht hin, die Bewegungen des Joysticks mit 
meinen Programmen "einzufangen". Laut dem Datenblatt des Butterflys 
müsste man ja an PORTB auslesen können ob der Joystick nach oben(Bit6), 
unten(Bit7) oder in die Mitte hinein(Bit4) gedrückt ist, und an PORTE 
müsste an den Bits 2 und 3 die Bewegung nach links und rechts ablesbar 
sein. Ich habe schon alles mögliche probiert, wenn man die PINS ausliest 
sind diese in der Praxis immer LOW, am PC lässt sich das wunderbar 
simulieren und funktioniert vom Programm her auch.
Ich würde mich deshalb freuen wenn mir jemand helfen, und dieses 
Programm kurz durchschauen könnte, um mir zu sagen was ich ändern muss, 
dass ich endlich Programme schreiben kann die ich durch meine Eingaben 
von außen beeinflussen kann.
.include "m169def.inc"

.org 0x0000
.DEF register = R16 ;Standardregister
.DEF mregister = R20 ;Maskenregister
.DEF zregister = R21 ;Zwischenspeicherregister

   ldi register, 0xF3
   out DDRE, register ;PORTE.2 und 3 als Eingang setzen
   ldi register, 0xFF
   out DDRD, register
 ;PORTD als Ausgang setzen
   ldi register, 0x01
   out PORTD, register ;Testweise eine LED anschalten, an der man erkennen kann, dass noch nichts gerdückt wurde
   rjmp START

START:
   in register, PINE ;Joystick-Ausrichtung (links/rechts) aus PINE einlesen
   mov zregister, register ;eine Kopie der eingelesenen Daten anlegen
   andi register, 0x08 ;Bit3 mit AND maskieren
   ldi r16,0x00 ;Sollte Bit3 an gewesen sein kommt hier !=0 heraus
   brne LED1ON ;Verzweigung, LED1 einschalten
   mov register, zregister ;Die bereits maskierten Daten wieder durch die Originaldaten erstzen
   andi register, 0x04 ;Bit2 mit AND maskieren
   ldi r16,0x00 ;Sollte Bit2 an gewesen sein kommt hier !=0 heraus
   brne LED2ON ;Verzweigung, LED2 einschalten
   rjmp START ;Sollte kein Schalter gedrückt worden sein

LED1ON: ;LED1 einschalten, dabei wird LED2 automatisch ausgeschaltet
   ldi register, 0x80
   out PORTD, register
   rjmp START


LED2ON: ;LED2 einschalten, dabei wird LED1 automatisch ausgeschaltet
   ldi register, 0x40
   out PORTD, register
   rjmp START

Danke schon einmal für Tipps!

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das Schaltbild grad nicht parat - es könnte sein, dass dafür die 
internen Pullups der Ports eingeschaltet werden müssen.

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> internen Pullups der Ports eingeschaltet werden müssen.

Hm, also bei dem PortB hat das funktioniert, da habe ich die Pullups 
gesetzt (wie hier 
http://www.mikrocontroller.net/articles/AVR-Tutori... 
beschrieben) und dann den eingang negiert und ich konnte so das Signal 
abgreifen. Aber leider sind die Bits für links/rechts nicht in PortB 
sondern in E wo das ganze irgendwie nichts bewirkt hat. Danke aber für 
den Tipp, ich spiele noch etwas an diesen Pullups herum vielleicht finde 
ich durch Zufall worans bei PortE liegt.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im oben gezeigte Code kann ich nirgends erkennen, dass die Pullups 
aktiviert werden. Weder für Port B noch für Port E. Wenn da noch mehr 
ist...

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da oben ist es nicht so, ich habe das ja erst aufgrund Deines 
Kommentars geändert, allerdings funktioniert das irgendwie nur bei PortB 
und nicht mit bei PortE wo ja auch noch zwei der Bits vom Joystick 
belegt sind.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was nichts daran ändert, dass ich nicht gezeigte Code schlecht 
kommentieren kann.

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit diesem Code habe ich es probiert:
.include "m169def.inc"
;-----------------------------------------------------
.org 0x0000
.DEF register = R16 ;Standardregister
;-----------------------------------------------------
   ldi register, 0xFF ;Pullups setzen und PORTE zu Eingängen machen
   out DDRE, register
   out PORTE, register
   ldi register, 0x00
   out DDRE, register
;-----------------------------------------------------
   ldi register, 0xFF
   out DDRD, register ;PORTD als Ausgang setzen
   rjmp START
;-----------------------------------------------------
START:
   in register, PINE ;Von PINE einlesen
   com register ;Negieren
   andi r16,0x0C ;Mit and maskieren, dass nur PIN2 und 3 übrig bleiben
   ldi register, 0x00 ;Schalte ein LED an PORTD an
   breq OFF ;Verzweigung
   out PORTD, register ;
   rjmp START

OFF: ;LED abschalten
   ldi register, 0x00
   out PORTD, register
   rjmp START
Dabei soll ein LED angehen wenn entweder nach links oder rechts gedrückt 
wird.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie überkommt mich bei diesem Code das Gefühl, dass da eigentlich 
nur
START:
   ldi register, 0x00
   out PORTD, register
   rjmp START
 steht, und der Rest überflüssige Verzierung ist.

Will sagen: In beiden Verzweigungen passiert das Gleiche.

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, sry ich hatte gerade schon wieder was andere Probiert und das dann 
mit strg+z rückgängig gemacht, so dass wieder der Quellcode für PortE da 
ist, dummerweise hab ich es aber nicht weit genug rückgängig gemacht, 
dass es noch vermischt war.
Das muss natürlich ldi register, 0x80 heißen, dass die LED an Pin7 von 
PORTD an ist. Leider reagiert das Programm aber überhaupt nicht auf die 
Betätigung des Schalters nach links oder rechts.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht klinge ich wie eine gesprungene Platte, aber interpolierter 
Code kommentiert sich auch schlecht. Und wenn Code, dann ganz konkret 
der, den du ausprobiert hast. Nicht der, von dem du meinst, dass es der 
war den du vor einer Stunde ausprobiert hattest.

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich das Programm in AVR Studio simuliere klappt das wunderbar, 
wenn ich nur ein Bit (egal ob 2 oder 3) in PinE auf LOW setze, dann 
springt er nicht zu OFF sondern schaltet das LED an, da dann das 
negierte Ergebnis ja ungleich Null ist.

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Und wenn Code, dann ganz konkret
> der, den du ausprobiert hast.
Sry, wollte den eben schnell noch hier pasten, bevor ich zum Abendessen 
gegangen bin, da hab ich das leider übersehen. Mittlerweile habe ich es 
nochmal ausprobiert, also wie gesagt am PC mit dem AVR Studio 
funktioniert der Code wie er soll, aber auf dem Butterfly bekomme ich 
keine Reaktion auf das Bewegen des Joysticks nach links oder rechts. 
Wenn ich den Code nehme und das ganze dann auf PORTB umschreibe und eben 
entsprechend die Maske dann auf die Pins 4, 6 und 7 lege funktioniert es 
damit auch.

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das Programm per vorinstalliertem Butterfly-Bootloader auf den 
ATmega169 übertragen wird: testweise zu Beginn der Anwendung DIDR0 und 
DIDR1 auf Standardwert (0x00) setzten. Der Bootloader schaltet aus 
Stromspargründen einiges ab/um aber schaltet es vor dem Sprung zum 
Anwendungsprogramm nicht wieder zurück.

Martin Thomas

Autor: Sebastian ___ (Firma: keine) (s3sebastian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt geht es, nachdem ich dieses DIDR0 und 1 auf 0x00 gesetzt habe.

Vielen Dank für den Tipp an Martin Thomas und auch für den von Andreas 
Kaiser mit den Pullup-Widerständen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.