Suche möglichst kleine Schaltung (SMD) für ľC-Takt: 4MHz ->

Jens Dierks wrote:

Ist wahrscheinlich nicht so wichtig, aber das sollte auch mit 5 clks
gehen:

loop:
adiw r25:r24,1 ; 2 clks
sbis PortA,0 ; 1 clk, wenn Bit 0 noch nicht gesetzt
rjmp loop ; 2 clks
...
Oh Mann, das ich das nicht gesehen hab... Naja, man sollte halt sowas nicht
um 2:00 Nachts machen ...

1 Clk gespart bringt immerhin etwas mehr Auflösung, aber trotzdem sind 8MHz
das nächsthöhere Vielfache von 4Mhz (A/D Wandler), wenn man von den für
diesen Code mindestens notwendingen 5,5MHz ausgeht. (Ich rechne bei sowas
immer mit 10% Toleranz, immerhin sind die ADXL202 auch in der Nähe davon)

Wolfgang
 
loop:
adiw r25:r24,1 ; 2 clks
sbis PortA,0 ; 1 clk, wenn Bit 0 noch nicht gesetzt
rjmp loop ; 2 clks
...
muss heissen:

sbis PinA,0
^^^^
 
Wolfgang Draxinger schrieb:
1 Clk gespart bringt immerhin etwas mehr Auflösung, aber trotzdem sind 8MHz
das nächsthöhere Vielfache von 4Mhz (A/D Wandler)
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
 
Jens Dierks wrote:

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
Ne, läuft a bisserl anders:

Bei den A/D muss man zunächst per SPI den zu sampelnden Kanal im Multiplexer
auswählen, danach zieht man ein zusätzliches ENABLE Signal auf LOW und muss
dann 8192 Takte (4MHz) warten bis die A/D Wandlung fertig ist. In dieser
Zeit messe ich den DutyCycle der ADXL (insgesammt 16 Durchläufe) und nehme
den Mittelwert davon.

In der Schaltung befinden sind 2 A/D, die ich jeweils (fast) gleichzeitig
auslese. Anstatt dem SPI vom AVR programmiere ich die Ports A und C selber
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äle passiert das gleiche Spiel mit den
anderen beiden.

Um den DutyCycle zu messen, lasse ich alle Änderungen auf den betroffenen
Signalleitungen einen Interrupt auslösen. Für jede Signalleitung wird dann
aus dem timer/counter der Wert in eine entsprechende Variable hinzu
addiert(*), je nach Status des Ports, anschließend wird der Counter wieder
auf 0 gesetzt. Ausserhalb der Interruptroutine werden dann die einzelnen
Werte zusammengerechnet. So gesehen würde das dann sicher auch mit nem
geringeren Takt funktionieren, aber über deinen Vorschlag bleibt mein
System späteren Änderungen in der Firmware gegenüber flexibel.

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

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

Jetzt möchte ich mich aber doch noch mal für deine Tips bedanken.

Grüße

Wolfgang
 
On Sun, 25 Apr 2004 01:05:39 +0200, Wolfgang Draxinger
<wdraxinger@darkstargames.de> wrote:

Hi!

Um den DutyCycle zu messen, lasse ich alle Änderungen auf den betroffenen
Signalleitungen einen Interrupt auslösen.
Ääh, misst Du die ADXL jetzt gleichzeitig? Was passiert, wenn zwei
davon kurz hintereinander ihren duty cycle beenden?

Wie gesagt, das Ganze ist 'ne ganz schöne Frickelei und ich hab auch so das
leichte Gefühl, dass mir die Leute von PCB-Pool dem Vogel zeigen, wenn ich
denen das Platinenlayout schicke. Aber mehr Platz habe ich leider nicht :-(
Hoffentlich hast Du trotzdem ein gutes GND-Konzept hinbekommen.

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

Gruß,
Michael.
 
Michael Eggert wrote:

Ääh, misst Du die ADXL jetzt gleichzeitig? Was passiert, wenn zwei
davon kurz hintereinander ihren duty cycle beenden?
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äuft das so (C Code)

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

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

Vor der Messung wird die Interruptroutine aktiviert, danach deaktiviert..
Dazu kommt noch eine Überprüfung ob die Messung gerade erst begonnen wurde,
oder bereits abgebrochen.

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

Oszillator? Ein Quarz + 2 Kondensatoren wäre ungünstiger gewesen?
Bei 8MHz sind die handelsüblichen Klötzchen auch nicht sehr viel kleiner als
das SMD montierbare Teil, das es da von FOX gibt. Hm, da fällt mir gerade
auf: Es gibt ein pinkompatibles Klötzchen von C-MAC mit etwas geringeren
Gehäusedimensionen.

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

Hoffentlich hast Du trotzdem ein gutes GND-Konzept hinbekommen.
Mal sehen, das ist zum Glück nur ein "proof of principle" Prototyp, also
spielen im Moment EMI noch nicht die ausschlaggebende Rolle. Insgesamt
fließen gerade mal 150mA, ist also nicht das zentrale Problem. Ich hab das
Teil gerade durch die DRU File von PCB-Pool gecheckt. Die einzigen Probleme
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äter per
Hand ab.

Wolfgang
 
Wolfgang Draxinger schrieb:
Um den DutyCycle zu messen, lasse ich alle Änderungen auf den betroffenen
Signalleitungen einen Interrupt auslösen. Für jede Signalleitung wird dann
aus dem timer/counter der Wert in eine entsprechende Variable hinzu
addiert
Das wäre auch mein zweiter Ansatz gewesen, und mit dem Mitteln ist die
durch den Interrupt bedingte Ungenauigkeit vernachlässigbar.

Wie gesagt, das Ganze ist 'ne ganz schöne Frickelei und ich hab auch so das
leichte Gefühl, dass mir die Leute von PCB-Pool dem Vogel zeigen, wenn ich
denen das Platinenlayout schicke.
:) das habe ich auch schon oft gedacht, aber solange der Layout-Test
grünes Licht zeigt machen die Alles problemlos.

Gruß Jens
 
Wolfgang Draxinger <wdraxinger@darkstargames.de> schrieb:

Leider hat der ATMega16 A/D Wandler Ports die ich beim aktuellen
Projekt aber nicht brauchen kann (zu wenig Auflösung und nicht
Differential). Die dezidierten A/D Wandler sind genau auf die
Gyroskope abgestimmt. Demgegenüber braucht ich aber eine genze
Menge Digitalports.
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
 
Joerg Wunsch wrote:

Verstehe ich nicht: die AD-Ports kannst Du doch auch digital benutzen,
Sorry, hab aus versehen das falsche Datenblatt erwischt :p
Tatsächlich nehme ich jetzt sogar einen ATMega32.

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

Wolfgang
 

Welcome to EDABoard.com

Sponsor

Back
Top