AVR-Butterfly - Wie auf Joystick zugreifen?

(Firma: keine) #775535
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!
(Firma: keine) #775604
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.
(Firma: keine) #775780
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.
(Firma: keine) #775846
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.
(Firma: keine) #775869
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren