PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie bekomme ich die Backleds ganz aus?



H3llGhost
10.10.2007, 17:05
Hallo Leute,

ich suche schon einige Zeit nach einer Möglichkeit die Backled's vollständig abzuschalten.
Folgende Codeidee habe ich:



cbi DDRC, DDC0
cbi DDRC, DDC1
cbi DDRD, DDD7
cbi PORTC, PD0
cbi PORTC, PD1
cbi PORTD, PD7


Leider funktioniert die nicht!
Kann mir einer bitte sagen warum?!
Was habe ich falsch gedacht?

asuroer
10.10.2007, 17:23
hi H3llGhost

was meinst du mit BackLEDs vollständig abschalten? das geht doch einfach mit BackLED(OFF,OFF)

damaltor
10.10.2007, 17:42
du meinst vermutlich in assembler-code.

die backleds hängen am gleichen port wie die radsensoren, eshalb sind sie meist nicht 100%ig auszuschalten. entweder der strom fliesst über den port des prozessors, dann sind sie eingeschaltet, oder der strom fliesst über die widerstände der radsensoren (siehe schaltplan am ende der bauanleitung), dann sind sie "aus", aber glimmen eben noch ein wenig.

H3llGhost
10.10.2007, 17:43
Gut das wollte ich wissen ...
Schade ... :(

damaltor
10.10.2007, 17:47
hmm aber ist doch nicht so schlimm... wenn du etwas glück und mut hast, versuche, die widerstände an den radsensoren durch größere zu ersetzen. dann wären die leds schonmal deutlich dunkler. allerdings wird das die werte der odometrie stark verändern, also musst du diese danach unbedingt überprüfen.

radbruch
10.10.2007, 19:30
Hallo

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32070
(ganz unten steht, warum die LEDs noch glimmen)

In der Forensuche "rote AND StatusLED AND haengt" eingegeben und schon gefunden. Aber so würde es google (http://www.google.de/search?hl=de&q=%22rote+StatusLED+haengt%22&btnG=Google-Suche&meta=) auch finden.*lol*

Gruß

mic

H3llGhost
10.10.2007, 21:15
Ah danke ...
Gut dann kann man wohl nichts machen ... ;)

DANKE!

damaltor
10.10.2007, 21:43
um die statusled gehts gar nich... =)

H3llGhost
10.10.2007, 22:08
Aber ein Versuch wars wert ... :D

radbruch
11.10.2007, 18:48
Hallo

Manchmal frage ich mich, ob alle die hier schreiben auch lesen können:


Die BackLEDs liegen mit der Kathode an PD7, deshalb gehen die aus, wenn man diesen Ausgang setzt



DDRD|=(1 << PD7); // Kathoden der BackLEDs haengen auf PD7
PORTD=(1 << PD7); // high an PD7 schaltet die BackLEDs aus


Das sind Zitate aus dem letzten Beitrag des von mir genannten Thread:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=296022#296022

Die StatusLED weiter oben diente nur als Suchbegriff weil sie im Quellcode eines der Codeschnippsel auftaucht und so der Thread gefunden werden kann.

H3llGhost
11.10.2007, 22:47
Hallo

danke erstmal für den Code!

Muss aber der | da wirklich hin?
Und was für eine Funktion hat der dann?

radbruch
11.10.2007, 23:21
Hallo

Mit dem |= wird das Bit zusätzlich zu den eventuell bestehenden gesetzt, nur mit = würden alle anderen Bits gelöscht.

Der Grund, warum die BackLEDs mit dem Löschen der Daten- und Datenrichtungsregister nicht ausgeht, ist folgender:

Wenn alle Pins hochohmige Eingänge (ohne PullUp) sind, fließt ein geringer Strom von Vcc über R18-D15-R19 bwz. R20-D16-R21 nach IC1-Pin13(PD7) und von dort weiter über R22-D13-D14 (die Odo-LEDs) nach GND. Wenn nun der IC1-Pin13 als Ausgang geschaltet und der Ausgang gesetzt wird, liegt der Pin auf Vcc und es fließt kein Strom mehr über die BackLEDs. Allerdings leuchten dann unsichtbar die Odo-LEDs hell.

Gruß

mic

H3llGhost
12.10.2007, 21:45
Achso danke für den Tipp ...
Werde ich mal ausprobieren ...

Nur das mit dem |= verstehe ich nicht ganz ... :D

damaltor
12.10.2007, 22:10
ich erkläre es dir:

in dem register DDRD wird von allen pins am port d eingestellt in welche richtung die gehen (also eingang oder ausgang).

das sieht dann zB so aus: 00101101

wenn ich jetzt schrfeiben würde DDRD = 1<<3 dann wäre das register danach 00010000. alle anderen pins wären also umgeschaltet worden. schade.
mit dem | werden alle einsen erhalten, und nur die neue hinzugefügt. das ist besser. dann ist das register 00111101

H3llGhost
12.10.2007, 22:17
Achso ...
Aber das mit dem 1<<3 kannte ich nicht mal ... :D
Kannst du das vielleicht nochmal näher erläutern?
Danke im Voraus!

farratt
13.10.2007, 13:57
Hallo H3llGhost!

Diese Operatoren "|=" und "<<" dienen in C der Bitmanipulation. Schau doch einfach mal hier:
http://www.galileocomputing.de/openbook/c_von_a_bis_z/
Im Bereich "Operatoren" gibts einen Unterbereich "Bit-Operatoren".

Gruß farratt

H3llGhost
13.10.2007, 14:51
Aber ich will doch im Moment alles mit Assembler machen oder geht das da auch?

damaltor
14.10.2007, 20:20
1<<3 bedeutet: nimm eine 1, und verschiebe sie 3 stellen nach links. also 00000001 -> 00001000

in assembler gibts dafür einen befehl. ivh kann sehr schlecht asm, deshalb musst du etwas warten...

radbruch
14.10.2007, 21:59
Hallo

Also ihr stellt euch mal wieder unmöglich an. 1<<3 bedeutet schlicht 8. PD7 steht für den siebten Pin des Port D (Zählung beginnt bei 0!) und weil 2^7 zufällig 128 ist, kann man es auch so formulieren:


DDRD|=128; // Kathoden der BackLEDs haengen auf PD7
PORTD=128; // high an PD7 schaltet die BackLEDs aus


Das sollte auch mit wenigen Assemblerkenntnissen umsetzbar sein.

Ob man beim DDRD = oder |= verwendet hängt davon ab, ob man die anderen Pins zusätzlich beeinflußen möchte oder nicht.

Gruß

mic

damaltor
15.10.2007, 00:59
unmöglich... du nuss :P

selbstverständlich ist 1<<3 = 8. allerdings soll H3llGhost ja cuh das prinzip dahinter verstehen, WARUM nun gerade 8.

Sternthaler
15.10.2007, 01:42
Hallo H3llGhost,
um das "DDRD|=128;" mit Assembler-Code zu schreiben muss du folgendes machen:

- Lese das DDRD-Register in ein allgemeines Register
- Mache eine Bit-weise OR-Verknüpfung zwischen dem allgemeinen Register und dem Zahlenwert 128
- Schreibe das allgemeine Register zurück in das DDRD-Register.
(Die Befehle dazu wirst du bestimmt selber finden. Sonst frag einfach nochmal.)

Wahrscheinlich wird nun auch verständlich, was dann mit dem |= eigendlich passiert.
Diese Schreibweise ist eine in C mögliche Abkürzung für "DDRD = DDRD or 128" bzw. richtig in C geschrieben: "DDRD = DDRD | 128"

Gruß Sternthaler.

H3llGhost
15.10.2007, 14:22
Hallo Leute,

danke erstmal für eure Bemühungen ... ;)

@Sternthaler:
Ich habe leider keine Ahnung wie ich das erste schon machen soll ...
Geschweige die anderen Sachen wie "Bit-weise OR-Verknüpfung" auch nicht ... :D

Ja ich weiß ich bin ein Anfänger ... ;)

H3llGhost
17.10.2007, 17:52
Habe es jetzt mit folgendem Code hinbekommen:



sbi PORTD7, PD7
sbi DDRD, DDD7
sbi PORTC1, PC1
sbi DDRC, DDC1
sbi PORTC0, PC0
sbi DDRC, DDC0 ;Back-LEDs wirklich ausschalten