mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA: ADC über INT0 anstossen


Autor: Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin auf der suche nach einem passenden uc und bin über den ATMEGA644P 
gestolpert. Ziel soll es sein über einen hardwarepin eine analogmessung 
zu starten.

Soweit ich das datenblatt verstehe gibt es wohl zwei möglichkeiten:

1.)Im External interrupt mask register den INT0 freischalten und in der 
interrupt routine per ADCSRA -> BIT(ADSC) den ADC per software 
anstossen.

2.)Im External interrupt mask register den INT0 freischalten und im 
ADCSRA auto trigger einschalten und als triggersource im ADCSRB über 
ADTS1 den INT0 als triggerquelle auswählen.

Hat die version 2 gegenüber der version 1 eigentlich vorteile? Der jump 
zum ISR(INT0_vect) wird in der version 2 ja sicherlich trotzdem 
ausgeführt. Eine INT0 routine, wenn auch leer wird man hier wohl 
trotzdem vorsehen müssen. d.h. man spart sich effektiv ansich nur das 
anstossen vom ADC, oder gibts da zeitliche vorteile die ich nicht sehe?

Für ein feedback wäre ich sehr dankbar!

Viele Grüße

: Verschoben durch Moderator
Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Eine INT0 routine, wenn auch leer wird man hier wohl
> trotzdem vorsehen müssen. d.h. man spart sich effektiv ansich nur das
> anstossen vom ADC, oder gibts da zeitliche vorteile die ich nicht sehe?


In Version 2 entfällt die Zeit die die ISR benötigt um die Wandlung zu 
starten. Das reduziert die Verzögerung die durch die Interrupt Latency 
entsteht.

Du musst den External INT nur konfigurieren, aber nicht unbedingt 
freigeben. Nur das Interrupt Flag muss irgendwo manuell wieder 
zurückgesetzt werden. Am Sinnvollsten in der ISR(ADC_vect).

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum "anstossen"?

Den ADC im free running mode laufen lassen, und im Int0 den jeweils 
aktuellen Wert auslesen.

Oliver

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Den ADC im free running mode laufen lassen, und im Int0 den jeweils
> aktuellen Wert auslesen.

Schönen Schrank auch, dann kriegst Du zufällige Werte.
Sogar Werte vor dem Triggerpuls sind möglich.

Nimm das Auto-Trigger, dazu ist es gedacht.
Dann stören auch andere Interrupts nicht, die gerade in Behandlung sind.
Der AVR hat ja keine Prioritäten, um sie zu unterbrechen!


Peter

Autor: Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Werner,

vielen dank für den hinweis dass man den int0 gar nicht freigeben muss 
um den adc anzustossen. das hatte ich überlesen!

habe mir nochmal den adc teil angesehen:
sample und hold dauert beim auto trigger 2 adc clocks. bei version 1.) 
dauerts vom auslösen des interrupts bis zum anspringen des vektors 5 cpu 
clks zuzgl. 1 shiftoperation+register schreiben um den adc zu starten 
und dann noch 1.5 adc clks. der adc kann aber nur bis 200khz getaktet 
werden ist also langsam im vergleich zur ausführung vom code, daher ist 
1.) vermutlich sogar wenig schneller wenn auch vom hersteller so nicht 
angedacht. mir ist schnelligkeit wichtiger als präzision. was mir auch 
richtig weh tut sind die insgesamt 13 adc clks für die wandlung ;-(

gibts noch schnellere atmegas als den 644? 8 bit reichen mir aus. hat 
jemand erfahrung mit übertakten vom adc?

ich kaufe mir trotzdem mal das käferchen und schaus mir an. beim atmega 
sieht das gesamtkonzept von der toolkette und der programmierung und dem 
preis ganz gut aus.

viele grüße

Autor: noobuntu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube, dass bei so gut wie fast allen atmegas der AD Wandler 
maximal mit 200 khz betrieben werden kann und dass die Anzahl der CLks 
die für die Wandlung gebraucht werden auch nicht kleiner wird.

Warum benutzt du nicht einen schnellen AD Chip und gibts den über dem uC 
ein Enable Signal und ließt dann den Wert Digital in den uC?

Ist das nicht schneller?

Autor: Karel Marsalek (marsalek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die ADCs in den AVRs sind langsam. Bei 1,0 MHz CPU-Taktfrequenz kann 
man den ADC höchstens mit 125 kHz betreiben und dabei dauert eine 
AD-Umwandlung ca. 140 mikrosekunden. Wenn man den CPU- Takt auf z.B. 1,6 
MHz einstellt, bekommt man den höchsten ADC-Takt (200 kHz) und dabei 
dauert die Umwandlung ca. 88 mikrosekunden. Gerade gestern habe ich den 
ADC bei einem ATMEGA64 versucht mit 500 kHz zu takten und es wurde 
zumindest der ISR(ADC_vect) aufgerufen. Ob aber die umgewandelten Werte 
i.O. waren, habe ich nicht geschaut.

Karel

Autor: Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
externer AD-Wandler - ja das war auch der ursprüngliche plan. dann hab 
ich mich aber doch sehr geärgert einen uC für die aufgabe ausgesucht zu 
haben der dann selber einen internen AD-Wandler hat den man nicht nutzt 
(mal unabhängig vom aufwand im layout der mit einem schnellen externen 
ADC entsteht). harrr

schnelle, preiswerte und einfach zu erhaltende externe (parallel-) 
Wandler sind auch irgendwie schwer zu finden:
8Bit ADC0804 billig variante -> 115us conversion time -> nicht gut
10Bit AD573 -> 30us conversion time -> schon besser aber den käfer 
bekommt man natürlich wieder nirgendwo.

viele grüße

Autor: Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karel,

im datenblatt steht drin dass wenn man nur 8 bit braucht tatsächlich 
übertakten darf. aber was das konkret in zahlen bedeutet steht halt 
leider nicht drin bzw. hab ich nix gefunden. meinte noch gelesen zu 
haben dass beim übertakten die internen kapazitäten sich bei der 
wandlung nicht mehr vollständig umladen können und bei 200khz die grenze 
für die grund genauigkeit ist. in erster linie wird die messung vrmtl. 
ungenau.

viele grüße

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ATXmega's haben "wesentlich" schneller ADCs (bis 2MS/s). Die Peripherie 
ist allerdings für OMs die von den klassischen AVRs kommen eine völlig 
neue Welt.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim AD Wandler der AVRs sind 200 kHz AD-takt (65 µs Wandlungszeit, bzw. 
10 µs S+H) die obere Grenze für volle Genauigkeit. Wenn man mit weniger 
Genauigkeit auskommt, kann der ADC-takt auch höher sein, bis 1 MHz sind 
im Datenblatt vorgesehen. Dabei hat man noch etwa 8 Bit Auflösung.

Autor: Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ulrich,

tatsächlich. steht in der tabelle mit den ADC-characteristics (3.5 LSB 
absolut accuracy). Ich glaub damit kann ich gut leben.

Viele Grüße und nochmal dank an alle für das feedback!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.