Pages: 1 [2] 3 4 ... 8   Go Down
Author Topic: Led Uhr  (Read 6732 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bei schiebe registern schreibt man ja immer die bytes hintereinander (z.B. 0000000010000010) meine frage ist kann man auch schreiben byte 3 high oder so also das die anderen bytes so bleiben wie davor...
Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das nicht, aber du kannst dir eine passende Funktion schreiben.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wie soll ich das mit dem code machen soll ich für jede stunde, minute und sekunde ein if satz schreiben ?
wenn ja wie soll ich das dann mit den bytes machen weil in dem if satz würde ich ja dann wieder alle bytes verändern .... ich muss es ja so machen das sich die bytes nur so verändern, dass nur die eine passende led leutet und die bytes davor wie z.B. für stunden so bleiben
Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Naja, man sollte schon effizient programmieren. 60 if-Anweisungen sind das nicht. Da programmiert man dann eine Funktion, nennen wir sie mal showMinute(). Dieser Funktion über geben wir die aktuelle Minute. Die Funktion selbst schiebt nur eine Eins und Minute-1 Nullen in die kaskadierten Register. Oder für eine andere Darstellungsart nur Einsen in Anzahl der Minuten.
« Last Edit: May 07, 2013, 03:42:07 pm by sth77 » Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Wien
Offline Offline
Edison Member
*
Karma: 27
Posts: 1849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

die ds1307 gibt Dir jede sekunde ein signal. bei jedem signal schiebst Du den einser für die sekunden um eins weiter und kümmerst Dich nicht um die "richtige" zeit. nach 60 signalen liest Du die 1307 aus und "stellst" die uhr neu ein. damit hast Du stunden und minuten auch erledigt.

nur so als vorschlag...


gruß stefan
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zum Bytes Manipulieren.
Du baust die die Pufferbytes im Programm für Sekunden Minuten und Stunden. und mit der Funktion BitWrite http://arduino.cc/en/Reference/BitWrite kannst du dann ohne das du jedes mal das ganze Byte erzeugen musst einzelne Bits in den Pufferbytes setzten. Das machst du dann innerhalb der Funktion showMinute(Wert). Die Schiberegister würde ich über die SPI schnittstelle mit Daten füttern da die SPI-Funktion auch nix anderes ist als ein ShiftOut(). Nur eben sehr viel schneller. Wenn du es geschickt anstellst im Code kannst du mit dem SPI-Shift die LED sogar dimmen. Zwr nicht 0-255 aber mindestens 10 Stufen bekommst du hin.
Gruß
Der Dani
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du es geschickt anstellst im Code kannst du mit dem SPI-Shift die LED sogar dimmen. Zwr nicht 0-255 aber mindestens 10 Stufen bekommst du hin.
Einsteigern würde ich erst die Variante mit shiftOut() empfehlen. Dann bleibt noch immer genug Entwicklungspotential.
Das zeitgleiche Dimmen aller LEDs könnte man doch prinzipiell auch über den Latch-Pin des Schieberegisters realisieren, hat das mal jemand versucht?
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe das öfters gemacht aber dann dimmst du direkt alle LEDs am Ausgang. Mit SPI kannst du dann einzelne LED dimmen also in einem Register sind paar LEDs voll an und andere gedimmt.
Die meisten Schieberegister 74HC595 können 100Mhz!!!!!. Deswegen kann man die locker mit SPi befeuern
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zum dimmen von LEDs mit Schieberegistern gibt es eine super Library.
http://www.elcojacobs.com/shiftpwm/

Diese kann man mit SPI oder ohne nutzen. Ohne SPI geht sie ca. 2,5 mal langsamer.
Die Anzahl der Helligkeitsstufen und PWM-Frequenz kann man selbst einstellen.
Auf der Seite gibt es auch einen Rechner mit dem man sich die CPU-Auslastung ausrechnen kann.

Grüße,
J3RE
Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe das öfters gemacht aber dann dimmst du direkt alle LEDs am Ausgang.
Daher schrieb ich ja vom "gleichzeitigen Dimmen aller LEDs", schon unter Berücksichtigung des hier genannten Anwendungszweckes (=Uhr smiley-wink). Da will man ja je nach Umgebungslicht einheitliche Leuchtstärken aller leuchtenden LEDs.
Wobei man mit dem Dimmen durch die SPI-Anwendung auch optisch nachlegen könnte, indem bspw. die aktuelle Minute heller leuchten lässt als die verstrichenen. Effektspielereien haben aj auch was für sich.

Mal was ganz anderes: Wie wäre es mit einem forumsinternen Uhren-Contest? Hier beschäftigen sich doch nach eigener Aussage einige Leute mit eigenen Kreationen...
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das mit dem dimmen hört sich sehr gut an ich werde heute noch mit dem schiebe register rumprobieren.
Ich habe soeben die leds und die rtc bestellt sih kommen vorrausichtlich montag an smiley
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich habe gerade meine zwei schiebe register mit den leds angeschlossen es funktioniert auch mit diesem Code:
Code:
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
 
// 2^8 = 256 . 0-255 0 , 255 // 1111 1111
// 2^16 = 65536 0 - 65535 0, 65535 // 1111 1111 1111 1111
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop()
{
    int data1 = 256;
    int data2 =1;
    for(int i=0;i<8;i++)
    {
 
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, data1>>8);
    shiftOut(dataPin, clockPin, MSBFIRST, data2 & 255);
    digitalWrite(latchPin, HIGH);
    data1*=2;
    data2*=2;
    delay(500);
    }
}

jetzt wollte ich einfach mal mit bytes rumprobieren. Ich habe gleich am anfang es mit einem 16 stelligen binär code probiert:
Code:
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
 
// 2^8 = 256 . 0-255 0 , 255 // 1111 1111
// 2^16 = 65536 0 - 65535 0, 65535 // 1111 1111 1111 1111

int eingabe= B0000100010100010;
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop()
{
    for(int i=0;i<8;i++)
    {
 
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe>>8);
    shiftOut(dataPin, clockPin, MSBFIRST, eingabe & 0000000011111111);
    digitalWrite(latchPin, HIGH);
    delay(500);
    }
}

aber wieso Funktioniert es nicht und wie muss ich die bits schreiben weil er gibt mir bei der zeile: int eingabe= B0000100010100010; eine Fehlermeldung ??

Ich bin sehr dankbar das ihr schon so zahlreich geantwortet habt

Liebe Grüße
valli
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 2983
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
weil er gibt mir bei der zeile: int eingabe= B0000100010100010; eine Fehlermeldung ??
Eine Fehlermeldung ohne Text ??? Uwes Glaskugel mag da überfordert sein, aber ich fühle dass

B0000100010100010 
einen unbekannten Variablennamen darstellt.

 
Logged

Wien
Offline Offline
Edison Member
*
Karma: 27
Posts: 1849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Du kannst bei einer binärzahl nur acht bit übergeben. eine so lange binärfolge, wie Du sie brauchst, könntest Du in einem array aus acht byte ablegen, dann hast Du hintereinander 64 bit im speicher.
ob es allerdings einen genialen trick gibt, alle 64 bit um eine stelle weiterzuschieben, weiß ich nicht.
wenn es den nicht gibt, würd' ich es auch nicht so kompliziert angehen.

als programmier-anfänger sind grenzgeniale lösungen für Dich gift, weil es dann zwar funktioniert, Du es aber nicht verstehst, und Du machst den eindruck, als möchtest Du etwas lernen.
sagen wir jetzt mal, Du legst ein array namens sek aus byte an.

byte sek[8];

und Du willst, das die led nummer 28 leuchtet. dann mußt Du errechnen, in welchem der acht byte Du maniipulieren mußt. dazu dividiert Du 28 durch 8. ergebnis=3 (wenn Du nur mit ganzen zahlen arbeitest, ist das ergebnis auch eine ganze zahl). Du mußt also sek[3] ändern (achtung: die erste sek ist sek[0], sek[3] ist also die vierte in der reihe, was ja auch klar ist bei 28).

das wievielte bit in sek[3] Du auf 1 setzen mußt, bekommst Du durch den modulo-operator. der macht nicht anderes, als eine zahl durch eine andere zu dividieren und gibt Dir den rest zurück. er schreibt sich %.

also 28 % 8 ergibt 4. Du mußt also bit 4 manipulieren (wiederum achtung: auch hier bei den bits in einem byte wird bei 0 begonnen).

Du weißt also jetzt, bit 4 in sek[3] mußt Du ändern.

verdau' das mal, ich muß jetzt nach hause.

gruß stefan
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

stefan ich habe mich über deinen komentar sehr gefreut aber ich verstehe es leider nicht. Es gibt außerdem einen befehl die bits weiter zu schieben z.B variable>>wie viele stellen nach rechts geschoben werden soll und es gibt such einen befehl von 16 bits nur 8 auszulesen. Also der jeweilige befehl für das jeweilige schiebe register aber ich schaffe es nicht einen 16 stelligen variable zu erstellen. Für die uhr muss sie dann 24 Stellig sein. Denn ich benötige 3 schiebe register trotz multiplexing.

gruß

valli
Logged

Pages: 1 [2] 3 4 ... 8   Go Up
Jump to: