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


von Sebastian _. (Firma: keine) (s3sebastian)


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.
1
.include "m169def.inc"
2
3
.org 0x0000
4
.DEF register = R16 ;Standardregister
5
.DEF mregister = R20 ;Maskenregister
6
.DEF zregister = R21 ;Zwischenspeicherregister
7
8
   ldi register, 0xF3
9
   out DDRE, register ;PORTE.2 und 3 als Eingang setzen
10
   ldi register, 0xFF
11
   out DDRD, register
12
 ;PORTD als Ausgang setzen
13
   ldi register, 0x01
14
   out PORTD, register ;Testweise eine LED anschalten, an der man erkennen kann, dass noch nichts gerdückt wurde
15
   rjmp START
16
17
START:
18
   in register, PINE ;Joystick-Ausrichtung (links/rechts) aus PINE einlesen
19
   mov zregister, register ;eine Kopie der eingelesenen Daten anlegen
20
   andi register, 0x08 ;Bit3 mit AND maskieren
21
   ldi r16,0x00 ;Sollte Bit3 an gewesen sein kommt hier !=0 heraus
22
   brne LED1ON ;Verzweigung, LED1 einschalten
23
   mov register, zregister ;Die bereits maskierten Daten wieder durch die Originaldaten erstzen
24
   andi register, 0x04 ;Bit2 mit AND maskieren
25
   ldi r16,0x00 ;Sollte Bit2 an gewesen sein kommt hier !=0 heraus
26
   brne LED2ON ;Verzweigung, LED2 einschalten
27
   rjmp START ;Sollte kein Schalter gedrückt worden sein
28
29
LED1ON: ;LED1 einschalten, dabei wird LED2 automatisch ausgeschaltet
30
   ldi register, 0x80
31
   out PORTD, register
32
   rjmp START
33
34
35
LED2ON: ;LED2 einschalten, dabei wird LED1 automatisch ausgeschaltet
36
   ldi register, 0x40
37
   out PORTD, register
38
   rjmp START

Danke schon einmal für Tipps!

von Andreas K. (a-k)


Lesenswert?

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

von Sebastian _. (Firma: keine) (s3sebastian)


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-Tutorial:_IO-Grundlagen 
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.

von Andreas K. (a-k)


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...

von Sebastian _. (Firma: keine) (s3sebastian)


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.

von Andreas K. (a-k)


Lesenswert?

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

von Sebastian _. (Firma: keine) (s3sebastian)


Lesenswert?

Mit diesem Code habe ich es probiert:
1
.include "m169def.inc"
2
;-----------------------------------------------------
3
.org 0x0000
4
.DEF register = R16 ;Standardregister
5
;-----------------------------------------------------
6
   ldi register, 0xFF ;Pullups setzen und PORTE zu Eingängen machen
7
   out DDRE, register
8
   out PORTE, register
9
   ldi register, 0x00
10
   out DDRE, register
11
;-----------------------------------------------------
12
   ldi register, 0xFF
13
   out DDRD, register ;PORTD als Ausgang setzen
14
   rjmp START
15
;-----------------------------------------------------
16
START:
17
   in register, PINE ;Von PINE einlesen
18
   com register ;Negieren
19
   andi r16,0x0C ;Mit and maskieren, dass nur PIN2 und 3 übrig bleiben
20
   ldi register, 0x00 ;Schalte ein LED an PORTD an
21
   breq OFF ;Verzweigung
22
   out PORTD, register ;
23
   rjmp START
24
25
OFF: ;LED abschalten
26
   ldi register, 0x00
27
   out PORTD, register
28
   rjmp START
Dabei soll ein LED angehen wenn entweder nach links oder rechts gedrückt 
wird.

von Andreas K. (a-k)


Lesenswert?

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

Will sagen: In beiden Verzweigungen passiert das Gleiche.

von Sebastian _. (Firma: keine) (s3sebastian)


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.

von Andreas K. (a-k)


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.

von Sebastian _. (Firma: keine) (s3sebastian)


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.

von Sebastian _. (Firma: keine) (s3sebastian)


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.

von Martin T. (mthomas) (Moderator) Benutzerseite


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

von Sebastian _. (Firma: keine) (s3sebastian)


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.

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
Noch kein Account? Hier anmelden.