Forum: Mikrocontroller und Digitale Elektronik einfacher Polling-Betrieb ?


von D.M.Meyer (Gast)


Angehängte Dateien:

Lesenswert?

Ich arbeite mich gerade in die Programmierung des ATMega16 von Atmel
ein. Dazu habe ich ein Interrupt-gesteuertes Programm erstellt, welches
LED0 auf dem STK500 an(IRQ0) bzw. ausschaltet (IRQ1), realisiert über
die Taster SW2 und SW3. Klappt prima.

Anschließend wollte ich das gleiche mal per Polling durchführen. In der
Simulation gehts auch wunderbar, nur in Realitas nicht... Dort tut sich
gar nichts.
Kann mir jemand einen Tipp geben?

Bin noch blutiger Anfänger im Bereich uP.


Besten Dank


Die wesentlichen Codeteile (voller Quelltext siehe Anhang):

START:  in akku, PIND;  Status der Taster einlesen
    ;wenn Taster SW2 (Pin3) gedrueckt wurde, LED0 AUSschalten
    ldi temp, 0b00000100;
    cp akku, temp;
    breq LED0_AUSschalten;
    ;wenn Taster SW3 (Pin4) gedrueckt wurde, LED0 ANschalten
    ldi temp, 0b00001000;
    cp akku, temp;
    breq LED0_ANschalten;
    rjmp START;    Endlosschleife

;--- Sprunglogik ---
LED0_AUSschalten:  rcall sub_LED0_AUSschalten;
      rjmp START;
LED0_ANschalten:  rcall sub_LED0_ANschalten;
      rjmp START;

;---Eventhandler
sub_LED0_AUSschalten:  sbi PORTB, 0;
      ret;
sub_LED0_ANschalten:  cbi PORTB, 0;
      ret;

von crazy horse (Gast)


Lesenswert?

aus welcher Controller-Familie hast du denn dein vVorkenntnisse? Siehht
irgendwie nach Z80-Programmiererei aus :-), aber das ist ja erstmal
egal.
Wahrscheinlich wirds daran liegen, dass du die pullups an PortD nicht
aktiviert hast.
Also:
ldi r16, 0xff
out PortD, r16

von Irgwer (Gast)


Lesenswert?

Hi,

beim STK500 geben nicht gedrückte Taster den Wert 1 zurück. Nachdem du
PIND komplett in akku einliest, steht dort z.B bei gedrücktem Taster
SW2 der Wert 0b11111011.

Die Überüfung einzelner Bits der I/O-Register geht übrigens mit den
Befehlen SBIC bzw. SBIS wesentlich einfacher. Schaut dir die doch
einfach mal an.

von D.M.Meyer (Gast)


Lesenswert?

Danke Irgwer,

daran langs. Im Simulator liefert ein gedrückter Taster eine 1, daher
kam ich nicht drauf... Oh mann ey, so ein Schitt.. Na ja, Lehrgeld :-)

Besten Dank!

von D.M.Meyer (Gast)


Lesenswert?

Ich habe das Programm nochmal mit dem Befehlen SBIC realisiert. Das
funktioniert auch, nur leuchtet die LED0 nun ständig, der Schalter SW3
schaltet sie nur aus wenn ich ihn gedrückt halte und beim
"anschalten" über SW2 der eh schon leuchtenden LED wird diese nur
heller. Die An-Aus Funktionalität ist nicht mehr gegeben.

Wieso das?

Verständnis: Wie lange bleibt die Portbelegung erhalten? Drücke ich
etwa einen Taster habe ich ja eine Signatur der Art 11110111. Drücke
ich danach einen Taster müsste ich ja 11111110 erhalten, denn ich kann
nur einen Taster zu einer Zeit gleichzeitig drücken, oder nicht? Wird
der Port irgendwann zurückgesetzt (kein Schalter gedrückt --> alles
"1" auf den 8 Leitungen).

Besten Dank.



...
  ldi akku, 0b11111110;  0=0V, 1=VCC --> Dioden schalten bei 0
  out PORTB, akku;
START:  sbic PIND, 2
  rcall sub_LED0_AUSschalten;
  sbic PIND, 3
  rcall sub_LED0_ANschalten

  rjmp START;    Endlosschleife

;---Eventhandler
sub_LED0_AUSschalten:  sbi PORTB, 0;
      ret;
sub_LED0_ANschalten:  cbi PORTB, 0;
      ret;

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.