Forum: Mikrocontroller und Digitale Elektronik EOR tut nicht, was ich erwarte


von Markus W. (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe angehängten Code zusammengebastelt. Es blinken auch schön die 
LEDs 0,2,4,6. Aber eigentlich will ich mittels des EOR erreichen, daß 
immer abwechselnd die LEDs 0,2,4,6 bzw. 1,3,5,7 leuchten.

Meine Überlegung: Wenn ich mit 0b11111111 ein exklusives ODER (EOR) 
durchführe, müßten ja eigentlich alle Bits umgekehrt werden (analog zu 
COM). Nur passiert das eben nicht.

Verwendet wird das ganze auf einem STK500, Ansteuerung der LEDs über 
Port B eines AT Mega16.

Danke und Grüße
Markus W.

von Philipp B. (philipp_burch)


Lesenswert?

1
out   DDRB,LEDs
->
1
out   PORTB,LEDs

von Markus W. (Gast)


Lesenswert?

Aaargh... Danke für den Hinweis - ich habe jetzt ein paar Stunden 
rumgegrübelt. Kaum macht man es richtig, schon funktioniert es. :-) Das 
war ein typischer Fall von "wenn zwei und drei sieben sind, dann bleiben 
sie sieben, wenn man immer wieder darüber liest."

Danke und Grüße
Markus W.

von Markus W. (Gast)


Angehängte Dateien:

Lesenswert?

Nur der Vollständigkeit halber mit dem korrigierten und verfeinerten 
Code im Anhang. Läuft so auf dem ATmega16 mit dem internen 1MHz-Takt.

Markus W.

von AVRFan (Gast)


Lesenswert?

Auf das Sichern und Wiederherstellen des SREG im Interrupthandler darf 
man aber nur im Sonderfall einer leeren 'main' verzichten - oder wenn 
das SREG im betreffenden Handler garantiert nicht verändert wird (dies 
ist z. B. der Fall, wenn ausschließlich die Instruktionen 'cpse', 'mov', 
'ldi', 'sts'/'lds', 'out'/'in' und 'reti' vorkommen).

In Deinem Programm erfüllt übrigens auch das 'push temp' und das 'pop 
temp' im Interrupthandler keine Funktion.  'temp' wird ja sonst 
nirgendwo benutzt.

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn ich nicht unter akuter Platznot leide, werden bei mir in 
IRQ-Routinen generell SREG und alle dort benutzten Register gesichert.
Hat einen ganz einfachen Grund: ich recycle gern aus anderen meiner 
Programme und es erspart mir, jedesmal den Fehler zu suchen, weil ich in 
Programm A temp nicht, in Programm B aber  eben TEMP_0 doch benutzte...

Ist mit SREG nicht anders, irgendwas eingefügt, daß die Flags ändert und 
dann ewig Fehler suchen.

Kann man sich so durchaus ersparen, wenn man sein eigenes System findet 
und konsequent einhält.

Gruß aus Berlin
Michael

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.