Hallo Koertis!
Ich kann dir nur ein Hardware-Vorschlag machen: ULN200X und/oder ULN280X Treiber.
Hallo,
ich würde gerne eine Stoppuhrbauen mit 9x 100mm große 7Segment anzeigen(hh.mm.ss.ttt). Diese Anzeigen benötigen 10V und die üblichen 20mA pro Segment. Ich würde diese gerne mit einem Atmel Atmega ansteuern.
Mittels externen Interrupt wird die Stoppuhr gestartet bzw. gestoppt.
Meine Frage wäre nun, wie gehe ich das am Sinnvollsten an und gibt es eine elegantere Methode als 17 Transistoren auf di Platine raufzuknallen?
LG Koertis
Hallo Koertis!
Ich kann dir nur ein Hardware-Vorschlag machen: ULN200X und/oder ULN280X Treiber.
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!
Hallo,
im RN-Wissen hab ich vor kurzem mit dem Artikel Siebensegmentanzeigen angefangen, dort wird auch auf die Ansteuerung eingegangen: http://www.rn-wissen.de/index.php/Siebensegmentanzeige
Es werden viele Varianten gezeigt, u.a. auch mit ULN2003, Multiplexing, Dezimalzähler, BCD-7Segment-Decoder, ...
Das könnte schon mal eine Orientierung sein.
Grüße, Bernhard
Super Danke,
Die Lösung mit dem ULN2803 ist sehr verlockend, so spar ich mir schon mal die 8 bzw. 9 Transistoren(für die Kathoden), aber für die 8 Segmente werde ich wohl gezwungen sein, die 8 Transistoren zu nehmen(10V)...
Danke für die schnellen Antworten,
lg Koertis
Dafür eignen sich UDN2981 bis 4 Treiber.
Geändert von PICture (12.04.2011 um 12: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 18: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
Lesezeichen