Suche möglichst kleine Schaltung (SMD) für µC-Takt: 4MHz -> 16MHz (PLL) oder 16MHz -> 4MHz (Teiler)

Oh Mann, das ich das nicht gesehen hab... Naja, man sollte halt sowas n= icht um 2:00 Nachts machen ...

1 Clk gespart bringt immerhin etwas mehr Aufl=F6sung, aber trotzdem sin= d 8MHz das n=E4chsth=F6here Vielfache von 4Mhz (A/D Wandler), wenn man von den= f=FCr diesen Code mindestens notwendingen 5,5MHz ausgeht. (Ich rechne bei sow= as immer mit 10% Toleranz, immerhin sind die ADXL202 auch in der N=E4he da= von)

Wolfgang

Reply to
Wolfgang Draxinger
Loading thread data ...

muss heissen:

sbis PinA,0 ^^^^

Reply to
Jens Dierks

Wolfgang Draxinger schrieb:

8 MHz können doch fast alle AVRs, deswegen ist der eine Takt ja auch relativ wurscht.

Was mir noch einfiel: Falls du für die anderen A/Ds pro Wandlung zB nur 16 Takte mit 4 MHz brauchst und dabei nichts berechnen musst, kannst du mit 8 MHz AVR auch folgendes machen: ldi r16,1 ; Bit0 auf 1 ldi r17,0 ; Bit0 auf 0

out PortB,r16 ; 1 clk out PortB,r17 out PortB,r16 out PortB,r17 ...usw

Bei anderen Bits und zusätzlicher Belegung müssen die Register halt entsprechende Werte haben.

Jens

Reply to
Jens Dierks

nur 16

mit 8

Ne, l=E4uft a bisserl anders:

Bei den A/D muss man zun=E4chst per SPI den zu sampelnden Kanal im Mult= iplexer ausw=E4hlen, danach zieht man ein zus=E4tzliches ENABLE Signal auf LOW = und muss dann 8192 Takte (4MHz) warten bis die A/D Wandlung fertig ist. In diese= r Zeit messe ich den DutyCycle der ADXL (insgesammt 16 Durchl=E4ufe) und = nehme den Mittelwert davon.

In der Schaltung befinden sind 2 A/D, die ich jeweils (fast) gleichzeit= ig auslese. Anstatt dem SPI vom AVR programmiere ich die Ports A und C sel= ber entsprechend. Auf der winzigen Leiterplatte auf der ich das Zeug unterbringen muss, konnte ich leider die Leitungen nicht anders verlegen :-(

Nach der Messung der ersten 2 Kan=E4le passiert das gleiche Spiel mit d= en anderen beiden.

Um den DutyCycle zu messen, lasse ich alle =C4nderungen auf den betroff= enen Signalleitungen einen Interrupt ausl=F6sen. F=FCr jede Signalleitung wi= rd dann aus dem timer/counter der Wert in eine entsprechende Variable hinzu addiert(*), je nach Status des Ports, anschlie=DFend wird der Counter w= ieder auf 0 gesetzt. Ausserhalb der Interruptroutine werden dann die einzelne= n Werte zusammengerechnet. So gesehen w=FCrde das dann sicher auch mit ne= m geringeren Takt funktionieren, aber =FCber deinen Vorschlag bleibt mein=

System sp=E4teren =C4nderungen in der Firmware gegen=FCber flexibel.

(*) die Datenstrukturen definiere ich alle in C, die Messroutinen gehen= in ASM. Die Variablen f=FCr die DutyCycle Messung sehen so aus: unsigned int dty[2][4]; Die Spalten stehen f=FCr die 4 DutyCycle Kan=E4le, die Zeilen nehmen di= e jeweilige Zeit auf, die f=FCr den Status gemessen wurde.

Wie gesagt, das Ganze ist 'ne ganz sch=F6ne Frickelei und ich hab auch = so das leichte Gef=FChl, dass mir die Leute von PCB-Pool dem Vogel zeigen, wen= n ich denen das Platinenlayout schicke. Aber mehr Platz habe ich leider nicht= :-( Die Aussenma=DFe den Geh=E4uses sind schon am Limit und der Innenraum w= ird fast vollst=E4ndig von den Gyroskopen beansprucht. Der winzige Rest muss f=FC= r die Platine, den AVR, Quarzozillator, MAX202, 3 Molex Steckverbinder und 'n= e handvoll Kondensatoren herhalten. Ich kann's immer noch nicht fassen da= ss ich das ganze Zeug sogar in meinem Layout _und_ sogar die Leitung auf gerade mal 2 Layern untergebracht habe.

Jetzt m=F6chte ich mich aber doch noch mal f=FCr deine Tips bedanken.

Gr=FC=DFe

Wolfgang

Reply to
Wolfgang Draxinger

Hi!

Ääh, misst Du die ADXL jetzt gleichzeitig? Was passiert, wenn zwei davon kurz hintereinander ihren duty cycle beenden?

Hoffentlich hast Du trotzdem ein gutes GND-Konzept hinbekommen.

Oszillator? Ein Quarz + 2 Kondensatoren wäre ungünstiger gewesen?

Gruß, Michael.

Reply to
Michael Eggert

i

Hehe, wenn man schon mal am Linux Kernel rumprogrammiert hat sind einem= sog. "Bottom Halfs" bekannt. Das sind seeeehr kurze Interruptroutinen, die einfach nur schnell auf den Interrupt reagieren und danach wieder die Kontrolle abgeben. Bei meinem Programm l=E4uft das so (C Code)

unsigned int const adxl[4] =3D { ... }; unsigned int integrator [2][4];

void interrupt() { for(unsigned int i =3D 0; i < 4 ; i++) { integrator[ (*PORTA & adxl[i])?0:1 ] [ i ] +=3D counter= (); } }

Vor der Messung wird die Interruptroutine aktiviert, danach deaktiviert= . Dazu kommt noch eine =DCberpr=FCfung ob die Messung gerade erst begonne= n wurde, oder bereits abgebrochen.

Durch das Integrationskonzept ist es eigentlich egal zu welchem Zeitpun= kt ich in die Interruptroutine springe, da ich nur die Gesamtzeit messe, d= ie ein Signal auf einem bestimmten Pegel verbracht hat.

Bei 8MHz sind die handels=FCblichen Kl=F6tzchen auch nicht sehr viel kl= einer als das SMD montierbare Teil, das es da von FOX gibt. Hm, da f=E4llt mir ge= rade auf: Es gibt ein pinkompatibles Kl=F6tzchen von C-MAC mit etwas geringe= ren Geh=E4usedimensionen.

Ausserdem w=FCsste ich nicht, wo ich die XTAL2 Leitung verlegen sollte.= War schon schwierig genug die XTAL1 Leitung so zu verlegen, dass sie nicht abstrahlt...

Mal sehen, das ist zum Gl=FCck nur ein "proof of principle" Prototyp, a= lso spielen im Moment EMI noch nicht die ausschlaggebende Rolle. Insgesamt flie=DFen gerade mal 150mA, ist also nicht das zentrale Problem. Ich ha= b das Teil gerade durch die DRU File von PCB-Pool gecheckt. Die einzigen Prob= leme treten beim Abstand der Pads vom MAX202 und vom AVR zu den Aussenkanten= des PCB auf. Im Notfall geb ich da etwas mehr Luft und feile das sp=E4ter p= er Hand ab.

Wolfgang

Reply to
Wolfgang Draxinger

Wolfgang Draxinger schrieb:

Das wäre auch mein zweiter Ansatz gewesen, und mit dem Mitteln ist die durch den Interrupt bedingte Ungenauigkeit vernachlässigbar.

:-) das habe ich auch schon oft gedacht, aber solange der Layout-Test grünes Licht zeigt machen die Alles problemlos.

Gruß Jens

Reply to
Jens Dierks

Wolfgang Draxinger schrieb:

Verstehe ich nicht: die AD-Ports kannst Du doch auch digital benutzen, oder was ist Dein Problem? Sofern Du nicht das externe Speicherinterface brauchst, sollte der ATmega16 als Ersatz also taugen, vorausgesetzt natürlich, das andere Pinout der ,,Analog''-Version stört Dich nicht.

--
Jörg Wunsch

"Verwende Perl. Shell will man können, dann aber nicht verwenden."
				Kristian Köhntopp, de.comp.os.unix.misc
Reply to
Joerg Wunsch

,

Sorry, hab aus versehen das falsche Datenblatt erwischt :-P Tats=E4chlich nehme ich jetzt sogar einen ATMega32.

Der Pinout war ein kleines Problem, aber 2 Stunden Entflechterei und ic= h hab das Teil in die Schaltung integriert.

Wolfgang

Reply to
Wolfgang Draxinger

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.