die backleds bekommen die masse vermutlich ebenfalls vom prozessor, wenn dieser sie einschalten will...
die widerstände sind pulups, die sorgen dafür dass die leds etwas glimmen. wie lautet denn die c-funktion für die backleds?
Hallo,
vielen Dank allerseits!
Was mich aber immer noch verwirrt, sind die grossen (1kOhm) Widerstände (R19, R20) bei den BackLEDs.
Kann es sein, dass die noch eine andere Funktion haben?
Jetzt habe ich noch dazu die Widerstände R18 und R20 entdeckt, die ja auch irgendwie da dran hängen?
Sieht für mich so aus, als ob da noch ein bischen Spannung oder Strom? dazu kommt? Deshalb auch die beiden großen R19 und R20?
Dann müsste ich meine neuen Vorwiderstände aber anders berechnen - oder?
Ausserdem verstehe ich nicht, wo die BackLEDs ihre Masse herbekommen.
So einen Schaltplan zu verstehen, fällt mir leider noch ziemlich schwer!
Gruss
M.
die backleds bekommen die masse vermutlich ebenfalls vom prozessor, wenn dieser sie einschalten will...
die widerstände sind pulups, die sorgen dafür dass die leds etwas glimmen. wie lautet denn die c-funktion für die backleds?
Zitat von damaltorCode:void BackLED ( unsigned char left, unsigned char right) { if (left || right) { PORTD &= ~(1 << PD7); // Rad-LED's OFF DDRC |= (1 << PC0) | (1 << PC1); // Port als Output => KEINE Odometrie PORTC |= (1 << PC0) | (1 << PC1); } if (!left) PORTC &= ~(1 << PC1); if (!right) PORTC &= ~(1 << PC0); }
danke.
eigentlich siehts gar nicht so kompliziert aus... mit der zeile
PORTD &= ~(1 << PD7);
wird pd7 auf masse gesetzt sofern wenigstens eine led eingeschaltet werden soll (left || right). somit haben die leds hier eine masse. jetzt werden beide leds eingeschaltet (!) und dann bei bedarf wieder deaktiviert mit den zeilen darunter.
Code:{ if (left || right) //wenn eine led eingeschaltet werden soll... { PORTD &= ~(1 << PD7); // Rad-LED's OFF & masse an DDRC |= (1 << PC0) | (1 << PC1); // Port als Output => KEINE Odometrie PORTC |= (1 << PC0) | (1 << PC1); //beide leds an } if (!left) //wenn nicht links PORTC &= ~(1 << PC1); //dann wieder aus if (!right) //wenn nicht rechts PORTC &= ~(1 << PC0); // dann wieder aus }
danke - wieder ein bischen mehr kapiert!
na ja das ist relativ!Zitat von damaltor
Fragen über Fragen:
Aber warum glimmen (wegen den pullup-Widerständen) die BackLeds nicht, wenn Sie ausgeschaltet werden? Die Masse wird ja nicht wieder abgeschaltet - oder?
Wozu sind die pullups überhaupt notwendig?
Warum hängen die BackLEDs nicht wie die anderen an der "normalen" Masse? - Könnte es sein, dass dann die Odo-Transistoren die BackLEDs einschalten würden?
Gruss
M.
jaaa so ungefähr hast du schon recht. das ist hauptsächlich weil am asuro so extrem prozessorpins gespart wurden dass man die odometrie und die backleds an einem pin hängen. das ist schon für fortgeschrittene =)
Hallo damaltor,
bitte, bitte auch noch erklären:GrussZitat von M1.R
M.
wenn der pin PD7 high ist, bekommen die leds den strom qquasi von der falschen richtung, und glimmen nicht mehr. gleichzeitig leuchten jedoch die odometrie-leds strahlend hell, aber unsichtbar auf.
die pullups r18 und r20 haben folgende bedeutung:
sie sind im grunde so angeschlossen:
VCC---Pullup---Odo-sensor---GND
wenn nun kein licht auf den odo-sensor fällt, hat dieser einen hohen widerstand, nehmen wir an er wäre unendlich groß, und wir könntn den maximal möglichen wert für die odometrie messen (weil der pullup widerstand den prozessorpin auf high zieht - deshalb "pull up"). wenn der fototransistor jedoch viel licht abbekommt, schaltet er durch und der ganze strom fliesst zur masse - wir messen den kleinstmöglichen wert. wenn der fototransistor nun mittelmäßig viel licht bekommt, messen wir auch einen mittleren wert usw, da immer strom über den widerstand kommt und teilweise über den fototransistor abgeleitet wird.
@damaltor
vielen Dank, habs jetzt größtenteils verstanden!
Hab BackLED-Funktionen geschrieben, mit denen man sie auch glimmen lassen kann:
GrussCode://------------------------------------------------------------------ //backled-spielchen //------------------------------------------------------------------ #include "asuro.h" //------------------------------------------------------------------ //backled funktionen um die leds unabhängig voneinander //hell leuchten oder glimmen zu lassen //------------------------------------------------------------------ #define aus 0 #define hell 1 #define glimm 2 //------------------------------------------------------------------ // rechte led void BackLEDrechts(uint8_t status) // aus - hell - glimm { PORTD &= ~(1 << PD7); //odoleds aus if (status == aus) { //rechte backled aus DDRC |= (1 << PC0); //rechts auf out PORTC &= ~(1 << PC0); //rechte aus } if (status == hell) { //rechte backled hell DDRC |= (1 << PC0); //rechts auf out PORTC |= (1 << PC0); //rechte an } if (status == glimm) { //rechte backled glimmt DDRC &= ~(1 << PC0); //rechts auf in } } //------------------------------------------------------------------ // linke led void BackLEDlinks(uint8_t status) // aus - hell - glimm { PORTD &= ~(1 << PD7); //odoleds aus if (status == aus) { //rechte backled aus DDRC |= (1 << PC1); //links auf out PORTC &= ~(1 << PC1); //linke aus } if (status == hell) { //rechte backled hell DDRC |= (1 << PC1); //links auf out PORTC |= (1 << PC1); //linke an } if (status == glimm) { //rechte backled glimmt DDRC &= ~(1 << PC1); //links auf in } } //------------------------------------------------------------------ //------------------------------------------------------------------ uint8_t i; //------------------------------------------------------------------ // hauptprogramm //------------------------------------------------------------------ int main(void) { Init(); BackLEDrechts(aus); BackLEDlinks(aus); StatusLED(GREEN); Msleep(1000); for(i = 1; i <= 5; ++i) { BackLEDrechts(glimm); BackLEDlinks(glimm); Msleep(500); BackLEDrechts(hell); BackLEDlinks(hell); Msleep(500); } BackLEDrechts(aus); BackLEDlinks(aus); Msleep(500); for(i = 1; i <= 5; ++i) { BackLEDrechts(hell); BackLEDlinks(glimm); Msleep(500); BackLEDrechts(glimm); BackLEDlinks(hell); Msleep(500); } BackLEDrechts(aus); BackLEDlinks(aus); Msleep(500); for(i = 1; i <= 5; ++i) { BackLEDrechts(aus); BackLEDlinks(glimm); Msleep(500); BackLEDrechts(glimm); BackLEDlinks(aus); Msleep(500); } BackLEDrechts(aus); BackLEDlinks(aus); StatusLED(RED); while (1); return 0; }
M.
sehr gut offensichtlich hast du es echt gut verstanden. könnte schon fast in die lib, so kann man noch mehr als nur ann oder aus anzeigen. =) nicht schlecht!
Lesezeichen