PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt ADC



Night_MaKu
25.04.2006, 15:02
Mahlzeit,

ich habe vor, den Interrupt des ADC's zu verwenden, doch leider wird dieser Interrupt nicht durch die Analogports ausgelöst ...

Siehe Code:



$regfile = "m32def.dat"
$crystal = 8000000
$baud = 19200

Config Adc = Free , Prescaler = Auto , Reference = Avcc

Start Adc

Enable Interrupts
Enable Adc
On Adc Auswertung

Do
nop
Loop

Auswertung:
Disable Adc

Print Getadc(0)

Enable Adc
Return
Return


Hat jemand eine Idee, wie ich den Interrupt für Analogeports benutze ?

Danke und Gruß

felack
25.04.2006, 17:31
Hallo Night_MaKu,

ein ADC Interrupt wird dann ausgelöst, wenn eine Analog-Digital-Wandlung abgeschlossen ist. Da du im Hauptprogramm keinen Wandler-Vorgang startest, wird der Interrupt nie ausgelöst. Wenn du den Wandlervorgang in der Interruptroutine für den ADC auslöst, kriegst du eine Endlos-Schleife, da der Interrupt immer wieder sich selbst aufruft, wenn die A/D-Wandlung fertig ist.
Welcher Zustand des Eingangs soll denn den Interrupt auslösen? Oder besser, was willst du denn messen?

felack

Night_MaKu
25.04.2006, 23:30
Hallo felack,

ich habe an einem Analogport einen Druckfühler. Der Druckfühler liefert Pulse im Bereich von 0V / 4V mit einer Frequenz von 0,5Hz - 2Hz. Es sind bereitz alle Digitalports belegt, sodas ich einen AD-Port ähnlich eines Digitalports benutzen möchte. Mit anderen Worten, ich will die Pulse am AD-Port zählen.

Gruß
Matthias

hrei
25.04.2006, 23:39
Hallo felack,

ich habe an einem Analogport einen Druckfühler. Der Druckfühler liefert Pulse im Bereich von 0V / 4V mit einer Frequenz von 0,5Hz - 2Hz. Es sind bereitz alle Digitalports belegt, sodas ich einen AD-Port ähnlich eines Digitalports benutzen möchte. Mit anderen Worten, ich will die Pulse am AD-Port zählen.

Gruß
Matthias

Dann gehe doch den einfachen Weg und konfiguriere den Port einfach als Digitalport und werte ihn z.B. mit PULSEIN aus. Da hat der nix dagegen, auch wenn er ais A/D-Eingang dienen kann.

Grüße
Henrik

Night_MaKu
25.04.2006, 23:46
Hallo Henrik,

leider werden einige AD-Ports auch als AD-Ports genutzt.

Gruß
Matthias

hrei
25.04.2006, 23:49
Hallo Henrik,

leider werden einige AD-Ports auch als AD-Ports genutzt.

Gruß
Matthias

Das stört nicht. Gemischter Betrieb ist ohne Probleme möglich.

Grüße
Henrik

Night_MaKu
25.04.2006, 23:52
Hallo Henrik,

also:



Config Adc = Free , Prescaler = Auto , Reference = Avcc

config porta.0 = input


Richtig so ?

Gruß
Matthias

hrei
25.04.2006, 23:58
Hallo Mathias,

Bingo! - Genau so!

Viel Erfolg und Grüße
Henrik

Night_MaKu
26.04.2006, 12:12
Hallo Henrik,

das war einfach ...

jetzt das nächste Problem. Da leider alle Digitalports belegt sind und diese Messung leider eine zeitkritisch Sache von vielen ist, hab ich jetzt wohl ein "kleines" Problem. Ich habe ich schon versucht "Pulsein" zu verwenden, funktioniert auch, bremst aber leider. Währe auch nicht das Problem, aber andere "Subs" und "Functions" sind Zeitabhängig und müssen jede Sekunde aufgerufen werden, welches den Schwierigkeitsgrad leit erhöht ... :-k

Gruß
Matthias

felack
27.04.2006, 15:35
Wenn das ganze zeitkritisch ist, solltest du den Drucksensor an Int0, Int1 oder Int2 anschließen und den Impuls per Interrupt auswerten. Leider hat der ATmega32 ja keinen Pin Change Interrupt.

felack

Night_MaKu
27.04.2006, 15:41
Hallo felack,

der Code war nur ein Beispiel, es handelt sich um einen M128 und es sind alle INTs belegt und benutzt... sowie alle anderen Digitalports auch... daher das Problem...

Gruß
Matthias

hrei
27.04.2006, 16:09
Hallo Mathias,



der Code war nur ein Beispiel, es handelt sich um einen M128 und es sind alle INTs belegt und benutzt... sowie alle anderen Digitalports auch... daher das Problem...


bei derart umfangreichen Projekten ist ein Forum überfordert. Aus Deiner Beschreibung geht hervor, daß der M128 bis an den Rand seiner Kapazität ausgelastet ist.

Ich bin mir zwar ziemlich sicher, daß bei Programmumstrukturierung einiges an Resourcen freigeschaufelt werden kann, nur müsste man dafür den gesamten Quellcode durchackern.

Das wäre mir deutlich zu mühsam :-( und ich fürchte nicht nur mir.

Bedauernde Grüße
Henrik

Night_MaKu
27.04.2006, 16:25
Hallo Henrik,

ich habe eine Möglichkeit gefunden, ist nicht schön, aber geht ...

ja, der M128 ist bis zum letzten Port ausgelastet, der Code ist noch nicht so groß, ca. 50% des Speichers vom M128. Leider ist bei meiner Programmumstrukturierung nichts mehr, was man freigeschaufelt könnte.
Um ein wenig übersicht zu behalten, habe ich einige Sachen schon mit "include" eingebunden. Denn noch ist es schwer sich zurechtzufinden.
Der Umfang des Programms hat bis jetzt ca. 27 Subs und 13 Funktionen, sowie eine Main-Loop und ca. 120 Variablen vom Bit bis zum Long.

Ich denke nicht, dass das Forum überfordert ist, denn viele Helfer machen dem Problem schnell ein Ende.

In diesem Sinne

Gruß
Matthias

albundy
27.04.2006, 16:42
Hallo Matthias,

du kannst in irgendeinem bei dir vorhandenen Timerinterrupt, der öfter als alle 0,5 Sek (2Hz) ausgeführt wird, den Pegel am Eingang messen und eine Variable hochzählen lassen.


If Pina.0 = 1 And Flag = 0 Then
Incr Puls
Flag = 1
Elseif Pina.0 = 0 Then
Flag = 0
End If

Flag bewirkt, dass die Variable Puls, nur bei jeder Low -> High Flanke am Eingang Pina.0, erhöht wird.

Übrigens:

config porta.0 = input
ist nicht ganz richtig.
config Pina.0 = Input

hrei
27.04.2006, 17:38
config porta.0 = input
ist nicht ganz richtig.
config Pina.0 = Input

Mittlerweile geht beides (1.11.8.2). In früheren Versionen musste wirklich Pinx,y genommen werden, während ein ganzer Byteport schon immer über Portx = Input/Output in seiner Richtung definiert wurde. DDRx geht natürlich auch. Gelesen werden muss aber selbsverständlich immer noch über Pin :-).

Grüße
Henrik

albundy
27.04.2006, 18:05
Mittlerweile geht beides (1.11.8.2).

ich muss gestehen, dass ich wohl nicht mehr auf dem laufenden bin.
Das habe ich nicht gewusst. :-#
Ich programmiere kaum noch mit Bascom.

EDIT: ich sehe gerade, dass die Uhrzeit im Forum mal gestellt werden sollte.