Dafür eignen sich UDN2981 bis 4 Treiber.![]()
Dafür eignen sich UDN2981 bis 4 Treiber.![]()
Geändert von PICture (12.04.2011 um 11:02 Uhr)
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Ja super schon bestellt
Softwaremäßig habe ich mir gedacht ich erstellt ein 9x10 Array in denen die Codes für 1,2,3 .. usw. für jedes Segment(9) gespeichert sind.
Somit schreibe ich immer die Zeile aus die gerade notwendig ist... Die Zeilen verändere ich mit einen Timerinterrupt.
Was sagt ihr dazu?
Hallo,
das mit dem Array sollte eigentlich gut funktionieren. Geschickt ist es auch noch, wenn du alle Segmentleitungen auf einen PORT (also z.B. alle auf PORTB) hängst. Dann kannst du mit PORTB=Array[Index] die Daten schnell ausgeben.
Hast du dir schon Gedanken gemacht, wie du die Zeit präzise hochzählen willst? (Timer, Prescaler, Interrupt) und wie hoch die Wiederholfrequenz bei der Anzeige sein soll? (wird wohl auch mit Timer und Interrupt laufen...). Damit die angezeigte Zeit auch stimmt solltest du unbedingt einen Quarz verwenden an XTAL1/2.
Aber bau erst mal deine Hardware auf
Grüße, Bernhard
Wenn dein Microcontroller zwei Timer hat, ist es richtg.
Sonst würde ich endlose Schleife mit entsprechenden Verzögerungsschleifen für Displaysteuerung erstellen, die immer nur für Zeitaktualisierung durch Timer kurz unterbrochen wird.
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Ich habe das mit dem Array heute programmiert und es funktioniert super, ich lasse bei einem Interrupt meine Funktion aufrufen bei der die "Linie" (die ausgegeben wird) um 1 Tausenstel erhöht wird.
D.h. meine Vorgangsweise schaut jetzt so aus, ich werde mit meinen Oszi die genaue Quarzfrequenz messen, daraus errechne ich dann wie oft ich den 16bit Timer überlaufen lassen muss, damit ich 1ms bekomme und ab dann spring meine Funktion ein, diese zählt bis 99h![]()
Dann fehlt nur noch der Ein/Aus Interrupt bzw. reset knopf(könnt ich auch nur den µC resetten)
Bezüglich der Widerholfrequenzen habe ich mir keinen Kopf gemacht, aber die übrige Zeit die der µC hat(bei 16MHz) kann er schreiben, ich werde es aber so machen dass ich unter 1Mhz bleibe, also so ca. 2-10 us...
Meine Funktion ganz simple:
Code:void func(uint8_t *A) { A[t]++; if(A[t] == 9) { A[t]= 0; A[hu]++; if(A[hu] == 9){ A[hu]=0; A[z]++; if(A[z] == 9){ A[z] = 0; A[s]++; if(A[s] ==9){ A[s] = 0; A[ds]++; if(A[ds] == 6){ A[ds] = 0; A[m]++; if(A[m] == 9){ A[m] = 0; A[dm]++; if(A[dm]==6){ A[dm]=0; A[h]++; if(A[h]==9){ A[h]=0; A[dh]++; if(A[dh]==9) A[dh]=0; } } } } } } } } } in main wir dann mittels einer forschleife die Zeile so ausgegeben: PORTA= LINE[i][A[8-i]]; PORTD = 0x01<< i;
Geändert von Koertis (12.04.2011 um 17:05 Uhr)
Hallo,
der Code sieht ja lustig aus mit den vielen Einrückungen
Aber ich glaube, irgendwas passt noch nicht ganz.
Überleg mal was passiert wenn A[t] vor dem Aufruf der Funktion 8 war. Wird dann ja um eins erhöht, wird also zu einer 9. Dann ist aber die if-Bedingung schon erfüllt, die Stelle wird auf 0 gesetzt und die nächste erhöht. Also wird die 9 komplett übergangen !?
Du musst auch noch die Ziffen in Siebensegmentcodes umwandeln. Das kannst du per Software mit einem weiteren Array machen (oder mit switch case... oder if else if...). Alternativ ein IC einbauen, dass BCD-zu-7-Segment wandelt.
Grüße, Bernhard
Ich hatte die 9 eigentlich schon ausgetauscht gehapt zu einer 10, keine Ahnung wie das passieren konnte, aber danke für den Hinweis. In LINE stehen schon die Hexdaten für die Siebensegmentanzeigen.![]()
Ich habe jetzt alles aufgebaut und auf einem Steckbrett getestet mit 5 kleine Anzeigen. Man sieht bei den letzten 2 Anzeigen bezüglich der Verkabelung, dass diese schwach Flackern, und somit stören. Ist das auf die Frequenz zurück zu führen? Induziere ich in den anderen Leitungen schon eine Spg? Je höher ich die Frequenz mache, desto größer werden die Störungen und bei mehreren Anzeigen. -> Entstörkondensatoren?
Upps... habe gerade rausgefunden dass es ein Softwareproblem war, ich habe den Port zu wenig Zeit gegeben,
entschuldigung für die Störung![]()
Aber wenn ich in der Hauptschleife die Daten raussschreibe und die neue Zeile generiere und ein _delay_us reinbringe, sodass mein ausgang genau 1ms ist. Dann brauch ich doch keinen Timer... Was sagt ihr dazu?
Wenn man 9 Stellen muliplexen will, und annähernd die volle Helligkeit braucht, dann braucht man für die Segmente etwa 150-180 mA an Strom. Bei einer 8 wäre das dann bis knapp über 1 A für eine Stelle. Selbst für die Segmente werden die Treiber ICs uln2003 oder UDN2981 knapp, denn der gesamte Strom pro IC ist auch begrenzt (ca. 180 mA bei 7 Kanälen am ULN2003, beim UDN2981 nur etwa 120 mA). Die Treiber ICs haben kein Problem mit 10 V oder 12 V. Für die Auswahl des Stellen braucht man aber mehr Strom, also einzelne Transistoren oder MOSFETs.
Wie viel Strom man wirklich braucht, hängt von der Helligkeit ab. Für einen Innenraum können auch 5-10 mA je Segment ausreichen. Dann wären sogar Schieberegister als Treiber ein mögliche Lösung.
Wenn man sehr schnell multiplext kann man leichte Störungen bekommen. Einige Segmente die eigentlich aus sein sollen können dann leicht leuchten. Mit Entstörkondensatoren kann man da nicht viel machen. Das kann man vermeiden wenn man zwischen den Stellen noch einmal die Segmente ausschaltet und erst dann die nächste Stelle aktiviert.
Lesezeichen