Werbung
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 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.
Aber die Segmentanzeigen leuchten ja nicht gleichzeitig, es leuchtet immer nur ein Block der bis zu max. 20mA *8 Segmentteile = 160mA reicht. Und da alle hintereinander leuchten ist der maximale Strom bei 160mA... nicht?
Das stimmt so nicht. Bei Multiplexing sind ja nicht alle Ziffern gleichzeitig an. Du hast 9 Stellen - dann leuchtet eine Stelle auch nur etwa ein Neuntel der Zeit. Um die gleiche Helligkeit wie bei einer "normalen" Ansteuerung zu erhalten, musst du den Strom verneunfachen. Deswegen kommt Besserwessi auf 20mA*9=180mA für ein Segment (also ein Strich der Anzeige), und 180mA*8=ca.1A wenn alle 8 Segmente (Striche) leuchten sollen.
Wenn man doch den ULN... verwenden will, könnte man ja je zwei Ein- und Ausgänge (oder mehr) parallel schalten, um den Strom treiben zu können. Dann braucht man aber auch mehr ICs davon.
Wenn man beim ULN2003 2 Kanäle parallel schaltet, verdoppelt sich der maximale Strom nicht, denn der Strom teilt sich nicht gleichmäßig auf, und wenn mehr Kanäle gleichzeitig aktiv sind, reduziert sich der Strom je Kanal. Mit 2 Kanälen sind es maximal knapp 800 mA - für 1 A bräuchte man schon 4-5 Kanäle.
Da nimmt man doch lieber MOSFETs oder Darlington-transistoren.
Lesezeichen