Int0 -> ADC triggern?

LotadaC

Sehr aktives Mitglied
22. Jan. 2009
3.547
70
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Hallo,
ich möchte den ADC automatisch durch das INT0-interrupt flag triggern lassen. Im AVR-Assembler wird die ADCC-ISR aber nie angesprungen - die entsprechende INT0-ISR schon (und ja, ich habe gewartet)
verwendet wird ein ATmega88. Gesetzt sind bei den ADC-Registern:
ADMUX: ADLAR und MUX2 (nur obersten 8bit und Quelle)
ADCSRA: ADEN, ADATE, ADIE, ADPS2, ADPS1 und ADPS0 (ADC an, autotriggern, interrupt enabled und prescaler auf 128)
ADCSRB: ADTS1 (steigende Flanke am int0-interrupt-flag sollte den ADC starten)
DIDR0: ADC4D (digitaler input buffer für C4 deaktiviert)

Wenn ich das dann im Simulator laufen lasse, und manuell das interrupt-flag von INT0 setze, wird folgerichtig die Int0-ISR angesprungen. Ich lande aber nie in der ADCC-ISR...

Hmm... hat jemand 'n Rat?
 
Hallo LotadaC,
Hmm... hat jemand 'n Rat?

hmmm leider nicht. Ich sehe in der Initialisierung des ADC keinen Fehler, der INT0 funktioniert ja, so wie du geschrieben hast. Es sollte also der ADC getriggert werden, wenn das INT0-Anforderungsflag INTF0 gesetzt wird, der wandelt dann und wenn er fertig ist, wird das ADC-Anforderungsflag ADIF gesetzt und zum ISR-Vektor gesprungen.

Vielleicht ist es einfach ein Problem mit dem Simulator. Kannst du es in dem Zielsystem probieren? Vielleicht auch einmal mehr Sourcecode posten, vielleicht hast du dich auch nur irgendwo verschrieben und der ADC wird falsch initialsiert.

Grüße,
Dirk
 
...Vielleicht ist es einfach ein Problem mit dem Simulator....
hoffe ich ja auch
...Kannst du es in dem Zielsystem probieren?...
is kalt im Keller - mal sehen, morgen...
...vielleicht hast du dich auch nur irgendwo verschrieben und der ADC wird falsch initialsiert....
wenn ich ADSC in ADCSRA setze, macht er ja die eine conversion - aber wenn ich das in die Hardware auslagern kann...
andere Frage: man soll ja an dem Port (C) dann möglichst wenig schalten - das betrifft aber nur den Zeitraum der Conversion, oder? (also da sollten die Pegel konstant bleiben, zwischen 2 Conversionen kann ich die Pins tanzen lassen, oder?
achso: muß ich eigentlich den zu messenden pin irgendwie festlegen (PORT und DDR), oder wird das durch das ADCenable und ADMUX getan? (andererseits sollte der ja default eingang und lo (tristate) sein.
 
andere Frage: man soll ja an dem Port (C) dann möglichst wenig schalten - das betrifft aber nur den Zeitraum der Conversion, oder? (also da sollten die Pegel konstant bleiben, zwischen 2 Conversionen kann ich die Pins tanzen lassen, oder?
achso: muß ich eigentlich den zu messenden pin irgendwie festlegen (PORT und DDR), oder wird das durch das ADCenable und ADMUX getan? (andererseits sollte der ja default eingang und lo (tristate) sein.

Es gibt ja mehrere Regeln, die man einhalten sollte, damit möglichst wenig Störgrößen das ADC-Ergebnis beeinflussen.
  • während der Wandlung möglichst keine IOs vom ADC-Port schalten
  • Impedanz der Quelle möglichst niederohmig
  • Frequenzen > fadc/2 vermeiden (low-pass filter verwenden)
  • "saubere" Signalführung, möglichst über AGND, nicht in die Nähe schnell schaltender Signale
  • AGND nah an die ADC-Channels (Sternpunkt)
  • vor AVCC ein C nach GND und L vor VCC
  • ggf. ADC Noise Canceler verwenden
Bei der Initialisierung des ADC läßt du einfach PORT und DDR im Resetzustand, also Pins als Input und hochohmig. Du hast ja bereits den IO-Pin vom Input-Buffer "abgehängt" (Register DITR0), so verringerst du die Stromaufnahme.

Wenn du nur 8Bit ADC Auflösung nutzt, wirken Störquellen natürlich nicht so stark auf das ADC-Ergebnis, wie bei einer 10bit Wandlung.

Noch einen schönen Abend,
Dirk
 
Hi
Wenn du in Assembler programmierst und möchtest wissen, ob dein Programm so arbeitet, wie vorgesehen, dann schau mal, ob du mein OpenEye hier irgendwo findest. Dieses Ermöglicht dir über RS 232 einen Blick auf die Variablen zur Laufzeit zu werfen. Mir ist der Simulator in AVR Studio da zu langsam.:cool:
Grad bei Anwendungen, die auf externe Signale reagieren müssen, ist es müßig, diese im Simulator vorzugeben.

Die notwendigen Routinen findest du in der Doku, beschieben ist es auch in den FAQ unter meinem Beitrag "keine Angst vor Assembler". Es sollte mit ein wenig Anpassung auch unter C-laufen, aber das hab ich noch nicht probiert.
Gruß oldmax
 
So...
man soll sich halt nicht immer vom Simulator wuschig machen lassen - in der Realität läuft das ganze...
(Phasenanschnittsdimmer für 2 Membranpumpen, antiparallel geschaltet)
index.php

Achso, Danke trotzdem...
 
Hallo LotadaC,

schöne Platine - selbst gemacht? Falls ja, hast du chemisch verzinnt oder mit Fitting-Paste?

Zum Simulator: hatte selbst gerade das Problem, dass ein Interrupt scheinbar nicht getriggert wurde. Das geht auch nicht im Einzelschritt Modus (F8 bzw. Shift F8). Du musst das Programm laufen lassen ('Run Program' bzw. F5) und dann den Interrupt auslösen (pulsen).

LG
Werner
 
Seno Glanzzinn (also chemisch) - allerdings hat die ganze Platine nicht meine gewohnte Qualität, ich denk mal die Salpetersäure war zu heiß (vllt auch der Entwickler... egal - nächstes mal wirds besser.)
zum Topic: Das ist ein ( genau genommen 2) Phasenanschnittsdimmer für die beiden Pumpen. Int0 setzt den Timer0 bei jeder Flanke (= Spannungsnulldurchgang) so, daß er sicher innerhalb von 10ms überläuft. Jede Pumpe wird über je ein Optotriac -> Triac angesteuert. Timer0 läuft im FastPWM-mode mit beiden Output Compares (-> Optotriacs). Die OCR-Pins gehen hi beim OC-Match, und lo beim Timer-Überlauf (deswegen können die Triacs sicher verlöschen).
Um 'ne grobe Hausnummer für die sinnigen Anschnittswinkel zu bekommen, hatte ich jeden 256ten Phasendurchgang den Anschnittswert seriell ausgegeben (in der Int0-ISR ein Register incrementiert, bei Carry ein OCR nach UDR geschrieben). Zur einfachen Einstellung des Winkels ein Poti an 'nen ADC-Pin, und das 8bit Ergebnis (ADLAR) in der ADC-ich-hab-fertig-ISR in die OCR geschrieben. Blieb also nur noch das Triggern des ADC - und da bin ich halt auf das Autotriggern durch den Timer-Überlauf (steigende Flanke des TOV-Flag) gestoßen.
Und das ging halt im Simulator so scheinbar nicht - wenn ich das Interrupt-Flag gesetzt habe, wurde zwar die entsprechende ISR angesprungen, aber egal wielange ich das Programm dann durchlaufen ließ (run to cursor oder so), die ADC-ISR wurde nie erreicht.
Der Witz ist aber, daß es fast auf Anhieb lief, im Mega... (ein Kanal lief irgendwie nicht so richtig, der andere schon. Auf der Platine war da nix zu erkennen. Beide Kanäle hätten identisch sein sollen. Also hab ich mal'n Oszi (anderer Mega88 -> DSO) an die beiden OCRs gehalten - der eine lief halt nicht invertiert. Nach einiger Such hab ich dann bei der Initialisierung der Pins gesehen, daß dort statt "LDI Register, (1<<bitname)..." halt "LDI Register, (bitname)..." stand:banghead:
Der Assembler kann da halt trotzdem 'ne Zahl draus machen.)
 
Hallo lotadaC,

danke für die Rückmeldung.

Ich hatte auch mal chemisch verzinnt, nur war die Zinnchloridlösung nicht allzu lange stabil. Wenn ich mal wieder dazukomme, werd' ich mal das Verzinnen mit Fittingslot probieren.

Ist ja lustig, dass ich auch gerade ein Speicheroszi-Funktion (einkanalig) zusammenprogramiert habe. Läuft über CTC des Timer2 der den Wandlerwert ausliest und gleich danach eine neue Wandlung startet. Ich bekomme bei 16 MHz und einer Auflösung von 8 Bit eine Samplingrate von 67 KSPS zusammen. Getestet hab' ich das mit einem Rechtecksignal (was auch herauskam).
Fand ich ganz beachtlich, was man alles so mit den Käfern machen kann :p .

Schönen Abend noch
Werner
 
Hallo,

...werd' ich mal das Verzinnen mit Fittingslot
probieren...

hab ich mal mit Rosol3 aus dem Baumarkt ausprobiert. Mit ca. 600Grad drüberblasen. Beim späteren Löten floss das Lot schön die Bahnen lang (leichte Schieflage); so liessen sich die SMD- IC's gut aufbringen. Ein Foto dazu hab ich leider nicht mehr gefunden. Verwende ich vielleicht wieder bei der nächsten Platine.


Grüsse,

Michael
 
Offensichtlich machts meine Lorche schon seit fast 2 Jahren - wichtig ist allerdings, daß der Photolack auch WIRKLICH runter ist, und die Platine sauber. Bei mir übernachten die Platinen dann nach dem Bohren und Durchkontaktieren dadrin. Und ich behandel jede Platine so.
@Oszi: Ich hatte das Oszi aus der Elektor nachgebaut, die Firmware aber dann weitgehend als Assembler vorbereitet, und die PC-seitige Software wollte ich in VB umsetzen - irgendwann hab ich mir meinen Empfang verprogrammiert (irgend'n Laufzeitfehler - auf dem BastelPC (Keller) konnte ich das Programm wegen mangelnder IDE nicht debuggen (kein Internet) - dann hatte ich bisher wegen anderen Baustellen keine Zeit ... aber das wird schon noch;) .) Obwohl ich das jetzt nochmal komplett überarbeiten würde. (mein Konzept hätte schonmal den kompletten RAM (-2 Register für Stack) für Samples verwendet (Elektor nur ~500) - jetzt würde ich versuchen, die Samples im Hintergrund schonmal an den UART weiterzugeben -> effektiv noch mehr samples... und wenn man sich auf einen Kanal beschränkt, könnte man den ADC auch mal frei durchlaufen lassen...
 
Hi,

Hallo,
hab ich mal mit Rosol3 aus dem Baumarkt ausprobiert............Verwende ich vielleicht wieder bei der nächsten Platine.

nein, wohl doch nicht. Bei der Reihenfolge: Toner aufbringen -> Ätzen -> Bohren müste ich erst den Bohrungsgrat entfernen. Diese Reihenfolge hat den Grund, dass die Bohrer sich v. H. besser zentrieren lassen.
Wozu auch. Im Kästle sieht es niemand; mein Programmierboard läuft schon seit ca. 2 Jahren problemlos; der LPT- ISP- Programmer noch länger.


Grüsse,

Michael
 

Ü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)