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