Hallo Programmierer, ich habe mir eine 7-Segment Uhr mit einem µC aufgebaut und mit C programmiert. Soweit funktioniert das auch alles. Aber leider ist der interne Quarz zu ungenau. Deshalb möchte ich an den T0 Eingang einen Quarzoszillator anschließen der nur dem internen Timer den Takt von 32,786kHz vorgibt. Der Prozessor an sich soll mit 10MHz laufen da ich noch multiplexe. Verwendete Komponenten: - ATtiny 84 - Quarzoszillator 32,786kHz - AVR Studio 6.1 - AVR ISP mkII Main uni / programmer Nun zu den Fragen: Was muss ich beim anschließen beachten? Welche Fuse Bits muss ich umstellen oder muss ich das in diesem Fall nicht? Erkennt der Timer den Takt automatisch? Muss ich Code programmieren der diese Funktion ermöglicht? Kann jemand helfen! Danke Gruß Chris
Hallo Chris, hier bist Du auf dem Holzweg: Es gibt keinen internen Quarz. Ein atTiny hat, wie die atMega auch, einen RC Oszillator der bei 8MHz 'wackelt' und mindestens einen 1:8 Vorteiler erhält. Im Auslieferungsstadium ist der Vorteiler aktiviert und der µC läuft dadurch mit 1MHz Takt. Falls Du so einen 32KHz Oszillator findest, kannst Du dich hier http://www.engbedded.com/fusecalc/ über die möglichen Einstellungen des atTiny84 informieren. Und nein, DU bist der Brain und musst dein Programm schreiben - automatisch geht da nichts.
:
Bearbeitet durch User
Hallo Chris, schön wäre es dein Schaltplan und das Programm hier zu sehen. Ich habe so den Verdacht, dass die Pins Dir nicht ausreichen. 7 Segmente 1 DP + 4 Multiplexleitungen. Die 7-1 Segmente kann man nicht einsparen, aber die 4 Multiplexleitungen ließen sich aus 2 Bit kodieren. So eine Uhr will auch bedient werden, vielleicht mit 2 Tastern ?
Uwe S. schrieb: > Die 7-1 Segmente kann man nicht einsparen, aber die 4 Multiplexleitungen > ließen sich aus 2 Bit kodieren. Mit Schieberegister?
Max H. schrieb: > Uwe S. schrieb: >> Die 7-1 Segmente kann man nicht einsparen, aber die 4 Multiplexleitungen >> ließen sich aus 2 Bit kodieren. > Mit Schieberegister? Mit Logik! 2 Bits = 4 Zustände.
cyblord ---- schrieb: > Mit Logik! 2 Bits = 4 Zustände Das SR wäre für die 7-Segmente Uwe S. schrieb im Beitrag #3598830: > ja ist schon klar Vllt. hat der TO sie ja bereits eingebaut. Bei 14 Pins -> 11 IOs bleiben, wenn er für die Multiplexleitungen nicht in 2 bit codiert hat, ja keine IOs für die Bedienung und den geplanten Quarz mehr übrig: 11-7-4=0 Doppelpost: Beitrag "Timer mit Quarzoszillator"
:
Bearbeitet durch User
Hallo, Danke erstmal für das Interesse. Ich habe nur 2, 7-S.Anzeigen. Ich zeige zuerst für 2 Sekunden die Stunden (0-24) an danach für 2 Sekunden die Minuten(0-60). Also 4 interne Variablen + eine Millisekundenvariable die gezählt wird. Des Weitern sind 2 Taster dran (Uhrzeit zeigen und stellen), das wars. 2 Pins noch für die jeweiligen Anoden der 2 Anzeigen. Macht dann 11 Pins also ist noch einer frei. In dem Fall der PA3/ADC3/T0/PCINT3 den ich dann für die Takeinspeisung am Timer 0 nutzen möchte. Grund ist das das normale Verfahren (Quarz+2 Kondensatoren) an XTAL1 & XTAL2 2 Pins verbraucht und zudem den Takt vom Chip mit ändert. Auch wiel es nicht 100% sicher ist das der Quarz anschwingt. Deshalb lieber Quarzoszillator. Schaltplan kann ich auch malen falls es weiter hilft!? GRuß Chris
Chris Webber schrieb: > Macht dann 11 Pins also ist noch einer frei. Den Reset würde ich nicht wegfusen, wenn du keinen HV-Programmer hast. Du könntest einen fertige Quarzoszillator kaufen oder eine Pierce-Schaltung mit einen 74HC aufbauen.
Hallo,
ja ich möchte einen fertigen Oszillator einbauen der mit einem Pin einen
Takt generiert.
OK stimmt Reset wege machen bedeutet Probleme...naja den lass ich einen
Schalter weg und setelle die Uhr nur mit dem PC was wenn sie erstmal
genau geht nicht oft wäre :-)
>> 2 Pins 4 Anzeigen? Geht denke ich mal nicht...
Dann müsste ich an je 2 Anzeigen die Anode brücken, also doppelte
Leistung und sie wären immer zusammen an!
00= beide Pins kein Massezugang
01= nur 1 Pin gegen Masse
10= nur der andere Pin gegen Masse
11= beide Pins haben Massezugang
<< oder liege ich falsch? :-)
GRuß Chris
:
Bearbeitet durch User
Chris Webber schrieb: > 00= beide Pins kein Massezugang > 01= nur 1 Pin gegen Masse > 10= nur der andere Pin gegen Masse > 11= beide Pins haben Massezugang Ich würd es so machen (für 7-Seg mit gemeinsamer Kathode): 00 -> 7-Seg_1 Kathode auf Masse, der Rest auf Plus 01 -> 7-Seg_2 Kathode auf Masse, der Rest auf Plus 10 -> 7-Seg_3 Kathode auf Masse, der Rest auf Plus 11 -> 7-Seg_4 Kathode auf Masse, der Rest auf Plus
Chris Webber schrieb: > Macht dann 11 Pins also ist noch einer frei. Kannst Du das mal aufdröseln? Bei mir ergibt 2 * 7S schon 14 Pins oder gemultiplext 8 Pins. Man könnte aber einen 74HC595 je Digit nehmen, dann sinds nur 3 Pins.
Nachtrag: Ein mit einem 74HC138 könnte man mit 3+(7+1) 8 7-Seg multiplexen. +1 = Dezimalpunkt. Peter Dannegger schrieb: > Chris Webber schrieb: >> Macht dann 11 Pins also ist noch einer frei. > > Kannst Du das mal aufdröseln? Vermutlich so: 7 + 2 für die gemultiplexten 7-Seg 2 Taster Mit Charlieplexing wären mit 9 Pins bis zu 8 7-Seg (mit DP) möglich: http://www.maximintegrated.com/images/appnotes/1880/DI217Fig02.gif
:
Bearbeitet durch User
Peter Dannegger schrieb: > Chris Webber schrieb: >> Macht dann 11 Pins also ist noch einer frei. > > Kannst Du das mal aufdröseln? > Bei mir ergibt 2 * 7S schon 14 Pins oder gemultiplext 8 Pins. > > Man könnte aber einen 74HC595 je Digit nehmen, dann sinds nur 3 Pins. 7 Segmentanzeige = 7 Elemente = 7 Pins der dp (Punkt) brauche ich nicht. Der ATtiny 84 hat 14 Pins, ohne +VCC und Masse sind das dann 12! 9 Pins für beide Anzeigen da multiplexen, sind also noch 3 übrig. Aber den Reset will ich eventuell nicht weg machen also 2 Pins für Schalter, Quarz usw. Gruß :-)
:
Bearbeitet durch User
Chris Webber schrieb: > 9 Pins für beide Anzeigen da multiplexen Mit Charlieplexing geht's mit 8 Pins, es bleiben noch 3 + Reset übrig.
:
Bearbeitet durch User
Max H. schrieb: > Chris Webber schrieb: >> 9 Pins für beide Anzeigen da multiplexen > Mit Charlieplexing geht's mit 8 Pins, es bleiben noch 3 + Reset übrig. Das ist eine gut Idee aber ich will das ganze so klein wie möglich halten da die Uhr wenn sie mal fertig ist am Arm sein wird. Gut ich mach das ganze später mit SMD Bauteilen. Es ist die erste Übung für mein späters Projekt. >> Die Nixie Armbanduhr die Steve Wozniak trägt << geil das Ding :-)
Chris Webber schrieb: > Das ist eine gut Idee aber ich will das ganze so klein wie möglich Charlieplexing sollte die Schaltung eigentlich nicht nennenswert vergrößern. Wenn die 2 IOs + Reset zu wenig sind, kannst du es so machen oder einen größeren µC nehmen...
Chris Webber schrieb: > da die Uhr wenn sie mal fertig ist am Arm sein wird. Da würd ich erstmal am Stromsparkonzept arbeiten. Der ATtiny saugt Dir ruckzuck die Batterie leer. Ein ATmega48 mit Uhrenquarz ist erheblich sparsamer.
Max H. schrieb: > Mit Charlieplexing ... Nicht jeder mag schwankende Helligkeit, je nach leuchtender Segmentanzahl. Und nicht jeder möchte MCs über die maximalen Betriebswerte belasten.
Peter Dannegger schrieb: > Nicht jeder mag schwankende Helligkeit, je nach leuchtender > Segmentanzahl. Wie kommst du darauf? > Und nicht jeder möchte MCs über die maximalen Betriebswerte belasten. Wenn so viel Strom durch die LEDs fließt, wird er die Batterie oft wechseln müssen. Bei den Pins, die ab die gemeinsame Anode/Kathode schalten könnte man noch einen Buffer (z.B. 2 Transistor oder MCP1416) dazwischen schalten. Und wenn er auch ohne Charlieplexing genug freie Pins hat, kann er natürlich drauf verzichten.
:
Bearbeitet durch User
Hallo, Danke erstmal. Das sind durchaus alles wichtige Dinge (Stromverbrauch, charliplexing usw.) die ich später bearbeiten möchte. Vielleicht nehme ich dann auch einen anderen Chip mal sehen. Aber um auf meine ursprüngliche Frage zurück zu kommen: Was muss ich beim anschließen eines Oszillators beachten? Welche Fuse Bits muss ich umstellen oder muss ich das in diesem Fall nicht? Erkennt der Timer den Takt automatisch? Muss ich Code programmieren der diese Funktion ermöglicht? Gruß und Danke schonmal für euer Interesse an meiner Intention. Chris :-)
:
Bearbeitet durch User
Chris Webber schrieb: > Muss ich Code programmieren der diese Funktion ermöglicht? Na klar, ein MC muß immer programmiert werden. Ohne Programm führt er nur ein 0xFFFF (NOP) nach dem anderen aus und sämtliche Peripherie (Timer usw.) ist inaktiv.
:
Bearbeitet durch User
ich meinet zusätzlicher code....nomalereweise macht man das über fuse bits deshalb die frage...
Chris schrieb: > nomalereweise macht man das über fuse > bits deshalb die frage... Hab ich noch nie gehört, daß Peripherie über Fuses initialisiert werden muß. Wäre auch schön blöd, dann könnte man zur Laufzeit ja nichts mehr umschalten. Schau Dir einfach mal die Fuses im Datenblatt an, soviel sinds ja nicht (max 3 Byte). Und dann schau Dir die Timer an und deren Register.
Hallo, ich habe mal den Schaltplan gemacht. An der blauen Leitung kann der Oszillator angeklemmt werden. @Peter: das ist ja eines der Probleme, dass ich mit dem Datenblatt nicht zurecht komme. Deshalb frag ich ja ob schon jemand erfahrung damit hat und weiß welche Fuse Bits ich verändern muss und was im Progamm dazu muss bzw. ob es eine Befehl gibt der den Timer ein externes Signal zum Takten verwenden lässt statt den internen Taktgeber. So ähnlich wie der Ladebefehl für den Prozessortakt?! :-) Gruß
:
Bearbeitet durch User
Chris Webber schrieb: > @Peter: das ist ja eines der Probleme, dass ich mit dem Datenblatt nicht > zurecht komme. Das musst du lernen. Welchen Absatz verstehst du nicht? Der Timer muss natürlich konfiguriert werden. z.B. dass er durch einen externen Takt getrieben werden soll und den Prescaler. Das macht man im Programm in den entsprechenden Registern die im Datenblatt im Abschnitt für den Timer stehen. An den Fuses musst du da nichts machen.
Chris Webber schrieb: > eine Befehl gibt der den Timer ein externes Signal zum > Takten verwenden lässt Einen Befehl sicher nicht, du wirst aber wahrscheinlich etwas in ein Register schreiben müssen.
Chris Webber schrieb: > @Peter: das ist ja eines der Probleme, dass ich mit dem Datenblatt nicht > zurecht komme. Die AVR-Datenblätter sind mit die besten. Die Timertakteinstellung steht z.B. schön in der Table 11-9. Zum Programmieren gehört Datenblatt lesen einfach dazu. In Deiner Schaltung bringt der Quarz aber nur einen genaueren Zähltakt. Der Stromverbrauch bleibt und wäre mir viel zu hoch.
Es soll doch möglichst klein werden, also erscheint mir der Einsatz eines 2, IC's für den Oszillator sinnlos. Du kannst den 32kHz Quarz direkt an den ATtiny anschließen und damit sowohl CPU als auch Timer takten. 32kHz sind für so eine simple Uhr mehr als genug. Das ist auch für die Stromaufnahme vorteilhaft. Du kannst mehrere Taster an einen Eingang anschließen, wenn du sie mit der LED-Matrix kombinierst:
1 | zehner o--------+---|<|---[===]---o Segment a |
2 | | |
3 | +---|<|---[===]---o Segment b |
4 | | |
5 | ... |
6 | +---|<|---[===]---o Segment g |
7 | | ____ |
8 | +-------- -------o Taster |
Den zweite Taster schließt du an die Leitung für "einer" und "Taster" an. Oder anderer Vorschlag: Schließe die Taster an einen analogen Eingang an:
1 | zum ADC |
2 | | 1k ____ |
3 | Vcc o---[===]---+---[===]--- ----| GND |
4 | 10k | 2k ____ |
5 | +---[===]--- ----| GND |
6 | | 3k ____ |
7 | +---[===]--- ----| GND |
8 | | 4k ____ |
9 | +---[===]--- ----| GND |
10 | | 5k ____ |
11 | +---[===]--- ----| GND |
Hallo :-), ok ich konkretisiere mein Frage. Bisher sieht mein Timer so aus: TCCR0A |=(1<<WGM01); CTC Modus aktivieren TCCR0B |=(1<<CS01); Prescaler 8 OCR0A = 125-1; Vergleicswert TIMSK0 = (1<<OCIE0A);Interupsfunktion einschalten sei(); Nun weiß ich das der externe Takt an T0 nicht mit Prescaler vorgeteilt werden kann. Zudem muss er 2.5mal kleiner sein als der CPU Takt (10MHz & 32,768kHz)was soweit passt. Welches Register ist nun für den externen Takt? Anbei ein auszug aus allen Registern des Chips.
Hallo, @Peter D.: Danke dir. Ich bin wohl blind. Diesen Abschnitt hatte ich nicht gefunden, oh man :-( Das heist wohl: TCCR0A |=(1<<WGM01); CTC Modus aktivieren TCCR0B |=((1<<CS00)&&(1<<CS01)&&(1<<CS02)); externer Takt OCR0A = 125-1; Vergleichswert TIMSK0 = (1<<OCIE0A);Interupsfunktion einschalten sei(); @Stefan: Danke dir. Ich denke die Analogvariante wäre optimal:-) @all: Ok 10000000Hz verbrauchen schon etwas Strom. Aber ich habe die Vermutung, dass die Segmente bei 32kHz leicht flackern werden?! Wenn das mit 32kHz funktioniert, werde ich es so machen...trotzdem ist es gut zu wissen wie man einen externen Takt im Timer verarbeiten kann. Ich werde daher beides mal machen und den Stromverbrauch messen. Was ich vielleicht vergessen habe zu erwähnen ist, dass ich noch Anfänger mit AVR's bin :-)
:
Bearbeitet durch User
Chris Webber schrieb: > Ich denke die Analogvariante wäre optimal:-) Wenn du den gesamten µC mit 32kHz betreibst, kannst du den eingebauten Oszillator mit externem Quarz verwenden. Den dadurch verbrauchten Pin könntest du durch Charlieplexing wieder gewinnen. > Aber ich habe die > Vermutung, dass die Segmente bei 32kHz leicht flackern werden?! Das denke ich nicht. Wenn du die Anzeige mit 50Hz betreibst, flackert nichts. Dann hättest du 10ms für jede Ziffer. Das sind 327 Zyklen bei 2^15=32.768Hz.
> Ich denke die Analogvariante wäre optimal
Mit etwas Nachdenken findest Du sicher auch eine Beschaltung mit weniger
Widerständen.
Hallo, euer Ideen sind gut. Danke euch erstmal. Aber wenn ich den Oszillator mit einem Pin an CLKI (PB0/XTAL1) hänge würde das doch auch funktionieren. Dann wird nur 1 Pin verbraucht und die Frequenz vom Chip ist gleich der des Oszillators. Dann muss ich aber die Fuse Bits ändern!? Blöde Sache den wenn ich was falsch mache kann ich möglicherweis nicht mehr auf den Chip zugreifen also zerschossen....
Chris Webber schrieb: > Dann wird nur 1 Pin verbraucht und ein zusätzlicher IC. Wenn ich mich richtig erinnere sollte die Schaltung mal so klein wie möglich werden. > also zerschossen.... Das ist der Flasche begriff, in dem Fall würde man verfused sagen. Der Chip ist dann nicht kaputt, mit einem HV Programmer kann man ihn retten.
:
Bearbeitet durch User
Hallo, ja sollte klein sein...ich dachte ein oszillator reicht aber man benötigt noch einen uhrenchip. Weist du wo ich etws über die fuse Bits nachlesen kann? Dann versuche ich zuerst 1Quarz mit 2 Kondensatoren an Xtal1 und Xtal2. GRuß
Chris Webber schrieb: > aber man benötigt noch einen uhrenchip. Das kann der µC auch machen. > Weist du wo ich etws über die fuse Bits nachlesen kann? Wissen nicht (mache nur PIC), ich würde sagen, mit an Sicherheit grenzender Wahrscheinlichkeit im Datenblatt des ATtiny 84.
Wenn ich einen Oszillator mit seinem Ausgangspin an CLKI (PB0/XTAL1) hänge würde das nun als Takquell funktionieren oder nicht?
Hallo Chris, warum schreibst Du den andauernd von 10MHz Takt ? Den sehe ich in deiner Schaltung nicht.
Hallo, die 10MHz sind intern im ATtiny84 eingestellt. Die Frequenz gebe ich nicht von außen rein. Der Chip hat einen internen Quarzoszillator. Ich wollte nur wissen ob ich einen Quarzoszillator welcher genauer arbeitet von außen dran hängen kann an CLKI (PB0/XTAL1)? :-) Gruß
Hallo Chris Webber schrieb: > 10MHz sind intern im ATtiny84 Wie das, ich arbeite schon lange mit den atMega und den atTiny, aber das ist mir neu !
Hallo, die 10MHz sind intern im ATtiny84 eingestellt. #define F_CPU 1000000UL // Prozessortakt festlegen Sagt dir die Codezeile was?! Eine Quarzoszillator an CLKI (PB0/XTAL1)wird immerhin hier im AVR-Tutorial vorgestellt sogar mit Vor- und Nachteilen.... Aber dann nicht weiter darauf eingegangen :-( Daher die Frage wie ich dir Fuse Bits einstellen muss? :-) Gruß
Chris Webber schrieb: > Hallo, > > die 10MHz sind intern im ATtiny84 eingestellt. > > #define F_CPU 1000000UL // Prozessortakt festlegen > > Sagt dir die Codezeile was?! Der interne RC-Oszi im Tiny84 läuft mit 8 MHz. Per Fuse auf 1 MHz teilbr. 10 MHz geht niht. Deine Codezeile sagt mir nur, dass du dem Compiler eine falsche Taktfrequenz vorgibst und daher alle deine Zeiten im Programm nicht stimmen. Die tatsächliche Frequenz wird per Fuses vorgegeben oder per externen Oszi. Nicht im Code. gruß cyblord
ah wusste ich nicht... hatte ich aus einem tutorial... erfunden habe ich die zeile ja nicht...Frage mich nur wieso dann alles so wunderbar klappt? //---8 Bit Timer CTC Modus aktivieren--------------------------------- TCCR0A |= (1<<WGM01); // im TCCR0A Register Bit für CTC Modus setzen TCCR0B |= (1<<CS01); // im TCCR0B Register das entsprechende Bit für Vorteiler 8 setzen OCR0A = 125-1; // Überlaufwert festlegen im Register OCR0A max. Wert 255 Bit., entsprechend berechnen für die gewollte Zeit // 1.000.000Hz/8=125.000, 125.000Hz/125=1.000Hz, T=1/f = 1/1000Hz =0,001 Sekunden // Beim erreichen von 125 wird ISR(TIM0_COMPA_vect)ausgeführt, und somit die Variable "millisekunden" um 1 erhöt, nach 1000 Ausführungen ist 1 Sekunde vergangen! TIMSK0 = (1<<OCIE0A); // Interupsfunktion einschalten sei();
Nimm einfach nen ATmega48 mit 32kHz Quarz an T2 im Power-Save Mode, dann braucht er nur 1µA. Und er ist gleich groß, wie der ATtiny84 (4*4mm² im 28M1 Package).
:
Bearbeitet durch User
Chris Webber schrieb: > ah wusste ich nicht... hatte ich aus einem tutorial... erfunden habe ich > die zeile ja nicht... Die Zeile ist auch ok. Aber sie sagt dem Compiler nur, mit welchem Takt der Controller faktisch arbeitet. Sie legt diesen Takt aber nicht fest. Also wäre das erste, dass du rausfindest wie schnell dein Controller wirklich arbeitet. Mit dem internen RC-Oszi wird das 8 MHz, oder bei gesetzter CKDIV8 Fuse, 1 MHz sein. Und das trägst du in diese Zeile korrekt ein. Das wäre mal der erste Schritt. Und bitte lies endlich mal das Datenblatt. Da steht das alles drin. Dann musst du nicht raten was du da überhaupt machst und unreflektiert Zeilen aus dem Netz kopieren. Das bringt nichts.
Chris Webber schrieb: > rage mich nur wieso dann alles so wunderbar > klappt? Weil du in deiner Timerprogrammierung ja vom richtigen Wert ausgehst, nämlich den 1000000 Hz = 1 MHz. Also klappt alles. Du solltest eben nur nicht dem Irrtum unterliegen, das der Tiny mit 10MHz läuft, sondern mit 1 MHz. Falls das mal wichtig werden sollte, ist ein Maschinenzyklus also 1µs und nicht 0,1µs.
:-) ha ja sehe ich, oh man wie dumm kann man sein.....habe ich 1MHz mit 10MHz verwechselt... Aber auch nur weil im Datenblatt 2,7V-5,5V = 0-10MHz steht. Habe übersehen das da steht "active mode= 1MHz system clock" oh man...
Chris Webber schrieb: > :-) ha ja sehe ich, oh man wie dumm kann man sein.....habe ich 1MHz mit > 10MHz > verwechselt... > > Aber auch nur weil im Datenblatt 2,7V-5,5V = 0-10MHz steht. Habe > übersehen das da steht "active mode= 1MHz system clock" oh man... Du verstehst da was falsch...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.