I2C Bus mit dem Attiny 841

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Deine Idee ist klar. Mache es auch mit anderen Servos so. Unterschied ist nur das ich diesmal mit einem Slave arbeite. Was ist wissen wollte ist, welcher Timer ist für was am besten geeignet und welcher Eingang für ADC am besten ist. Sind ja eigentlich genug vorhanden. Es hat aber jeder seine Eigenart dabei. Deshalb wer ist für was geeignet?
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.281
60
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
20ms sind für einen Mikrocontroller halt recht lang. Von den 20ms interessieren nur die ersten 2ms, deswegen wäre hier ein 16bit-Timer interessant.
Salopp gesagt interessiert nur das erste zehntel - selbst wenn man 8bit voll ausnutzen könnte, lägen im ersten zehntel nur 25 diskrete Werte. Bei einem 16bitter entsprechend etwa 6553. Da wir den 16bitter auch nicht voll nutzen und den 8ter Vorteiler nutzen, können immerhin noch 1101 verschiedene Werte angefahren werden.
Für den Entfernungsmesser willst Du auch 'ne möglichst gute zeitliche Auflösung. Grundsätzlich wäre da erstmal egal, ob 8 oder 16 Bit - da der 8Bitter aber viel öfter überläuft (und die Überläufe mitbehandelt werden müßten), wäre auch hier ein 16bitter vorzuziehen. Der Tiny441/841 besitzt zwei identische 16bitter, Du könntest also beide verwenden. Deine Frage/Annahme in #19 war, ob/daß man dafür zwingend zwei Timer braucht. Und meine Antwort war, daß es auch mit einem gehen sollte, falls die Auflösung für den entfernungsmesser dann noch hinreichend ist.
Erzielbar wäre 'ne Auflösung von 1µs. Schallgeschwindigkeit war etwa 345m/s (Faustregel: 3s für einen Kilometer -> Gewitter, Blitzentfernung abschätzen).
Bzw 345mm/ms. Bzw 0,345mm/µs. Da sich durch die Reflektion aber der Weg (und somit die Zeit) verdoppelt, könnten wir auf 0,1725mm auflösen.

Da die frequenzkorrektur des Timers über KanalA erfolgt, muß die PWM-Ausgabe über KanalB erfolgen. Das Signal kann auf jeden beliebigen TOCCn mit n gerade geschaltet werden. Du kannst Dir also einen aussuchen, der nicht mit anderen Funktionen kollidiert.
Input Capture Pin von Timer1 wäre A7 (einer der extra High Sink Ausgänge), ICP von Timer2 wäre B2.

und welcher Eingang für ADC am besten ist.
Da jedes Bein als single ended Input genutzt werden kann, spielts da keine Rolle. im differential ended mode hingegen ist nur ein Teil aller theoretisch denkbaren Kombinationsmöglichkeiten nutzbar. Meiner Erinnerung nach hatte ich das schon mal irgendwo zusammengestellt - ADC7 war wohl mit den meisten kombinierbar. Aber wenns nur um ein Paar geht, läßt sich sicher auch was anderes finden...
Nicht alle Kombinationen sind umkehrbar...

Also - wenn Du Dir A7 für irgend'ne andere PWM freihalten willst, solltest du Servo und Entfernungsmesser über Timer2 laufen lassen. Damit wäre für den Sensor ICP2 festgelegt, außerdem die beiden Hardware-TWI-Beine. Der zweite extra high sink wäre TOCC4, wenn das Servo den nicht braucht, wären TOCC2 oder TOCC0 vorzuziehen (wenn man den freihalten will).

Die Genauigkeit der Sensormessung wird natürlich durch den Systemtakt bestimmt. Also soll möglicherweise ein Quarz an die XTALs, oder ein externer präziser Oszillator an ClockIn...

Bei ADC-Messungen willst Du vielleicht gegen eine präzisere externe Spannungsreferenz als die internen messen - dann muß Aref entsprechend beschaltet/freigehalten werden.

Wie gesagt: einige Funktionen können bedingt flexibel auf unterschiedliche Beine geschaltet werden - je nachdem, was Du noch alles nutzen willst, werden dann bestimmte Konstellationen ausgeschlossen. Aber ich weiß eben nicht, was Du noch zusätzlich nutzen willst.

Bisher hast Du konkret nur 'n Servo, den Entfernungsmesser und TWI.
Für LEDs und Taster brauchst Du keine speziellen Beine, möglicherweise aber 'n zweiten Timer (obwohl die 20ms auch für Polling+Entprellung herhalten können).
Dasselbe dann beim Drehencoder.
Vielleicht hast Du bei LEDs auch an PWM und/oder 'ne RGB-LED gedacht, hier wären dann weitere Timer und TOCCs festzulegen (möglicherweise insbesondere auch die extra high sink Beine).

Die beiden Potis des Joysticks wären je (abwechselnd) im single ended Mode durch den ADC zu messen - hier wären die Beine also wieder egal.
Sollen Joystick und Encoder zusammen bestückt werden (also gleichzeitig nutzbar), oder alternativ? Bei letzterem könnten ja dieselben Eingänge vorgesehen werden - entweder entsprechend mit zwei alternativen Firmwares, oder mit einer Firmware die beides unterstützt, und wo die tatsächliche Bestückung im Eeprom abgelegt/ausgelesen werden kann (und ggf per TWI vom Master verändert werden kann).
 

achim S.

Premium Benutzer
16 Jan 2010
485
7
18
Nähe Basel
Sprachen
C
Habe das DB angeschaut und die Pinbelegung.
Laut Schema im DB:
- Aref - Pin 13
- OCOB - Pin 8
- OC1A - Pin 7
- OCOB - Pin 6
- OC1A - Pin 5
Nach dem DB hat er 3 Timer
Timer 0 - 8 Bit
Timer 1 - 16 Bit
Timer 2 - 16 Bit

Welcher Timer liegt eigentlich wo? Habe ich das was übersehen?
Aref ist wenn eine externe Spannung kommt, z.B. U Halbe ca. 2,5V um einen Comperator zu machen?
achim
 

Anhänge

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.281
60
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Aref: Das ist neben dem PCINT0, dem remappten MISO oder dem ADC-Eingang ADC0 eine mögliche Alternativfunktion von A0. Möglicherweise lassen sich einige dieser Funktionen sogar gleichzeitig nutzen, da müßte man mal genauer in die Overrides schauen...
Je nach Konfiguration den ADC-Referenzmultiplexers wird entweder Vcc (intern), oder eine der drei internen Referenzen auf den DAC geschaltet, oder das Aref-Bein. Bei den drei Referenzen besteht außerdem die Möglichkeit, die Referenzspannung gleichzeitig mit dem Aref zu verbinden, um die Spannung dort mit einem zusätzlichen externen Kerko zu puffern/glätten/stützen...
Du hast also acht verschiedene Konfigurationsmöglichkeiten für die Referenz:
Die ersten vier verwenden das Bein nicht:
Avcc (intern)
drei Referenzen (intern), ohne Stützkerkos
Die nächsten drei verwenden das Bein (legen dort eine analoge Spannung an):
drei Referenzen (interne) mit Stützkerkos
Die letzte legt intern gar keine Spannung auf den DAC, es wird das verwendet, was extern am Bein hereinkommt. auch hier sollte direkt am Bein gestützt werden.

Mit den beiden Comperatoren hat Aref nichts zu tun - die verwenden eigentlich nur die AIN-Beine oder ggf die interne Bandgap-Referenz. Allerdings kann man auch den Ausgang des ADC-Eingangsmultiplexers auf den AC schalten, und da könnte man laut DB ja auch die interne Referenz als Quelle vorgeben. Im DB wird nur die 1V1 erwähnt, aber laut ADC-Funktionsblockschema sollte es die tatsächlich gewählte Referenz sein...

Welcher Timer liegt eigentlich wo? Habe ich das was übersehen?
???
Wo die auf dem DIE platziert sind? Woher soll ich das wissen, und was soll mir das bringen?
Auf welchen Adressen die entsprechenden I/O-Register liegen? Steht im Datenblatt, aber seit wann interessiert Dich das also Hochsprachler?
Die beiden 16-Bit-Timer sind bis auf die Input Capture Pins und die Takt Eingangs Pins (Counter) meiner Meinung nach absolut identisch.
Laut Schema im DB:
- Aref - Pin 13
- OCOB - Pin 8
- OC1A - Pin 7
- OCOB - Pin 6
- OC1A - Pin 5
???
Welches Datenblatt?
Der Tiny441/841 besitzt gar keine festen OCnx-Beine.
Du hast drei Timer.
Jeder dieser Timer besitzt zwei Output Compare Units (ja A und B, zusammen also sechs OC-Units)
Die Ausgänge dieser OC-Units können in gewissem Maße flexibel auf acht Beine ausgegeben werden (TOCCn mit n=0..7).
A-Ausgänge auf jeden TOCCn mit n=ungerade.
B-Ausgänge auf jeden TOCCn mit n=gerade.
Du kannst also einem Ausgang auch vier TOCCs gleichzeitig zuweisen, an jedem TOCC kann aber immer nur ein Ausgang gleichzeitig anlegen.
Die beiden Extra-High-Sink-Pins sind beides TOCCs mit geraden n (TOCC4 bzw TOCC6), können also nur auf B-Ausgänge geschaltet werden...
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.281
60
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Hmmmm....eine ds3231
???
An den 441/841 anschließen? Geht nicht bei Verwendung der Hardware-TWI, da der Controller nur Slave sein kann. (Software-TWI geht natürlich immer).

Mit dem 441/841 sowas ähnliches wie die RTC umsetzen? Geht natürlich, der Controller sollte nebenbei noch viel mehr können, ABER erstens kann keiner der Timer asynchron betrieben werden (man müßte also den ganzen Controller durch den präzisen (Uhren-)Quarz/Oszillator takten (mit eventuellen Abstrichen bei der Geschwindigkeit); zweitens ist ein Feature der RTC ja die sehr gute Temperaturkompensation (des Quarzes) - das nebenbei in Software zu korrigieren stell ich mir tricky vor; ob man so'n Uhrenquarz irgendwie mit Digitalpotentiometern etc. trimmen kann, weiß ich nicht. Die nötige Messung der Temperatur über den Controller selbst ist auch nicht sehr präzise..
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)