PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche dringend Hilfe beim ADC-Interrupt



RCO
12.12.2004, 18:25
Hallo Forum,

wie der Titel schon sagt, will ich den ADC-Interrupt nutzen. Leider habe ich dazu sehr wenig im Internet gefunden und bin mir deshalb garnicht sicher, ob das so überhaupt möglich ist. Der Punkt, ist, dass über den ADC (4) 6 Bumper mit entsprechenden Vorwiderständen angeschlossen sind (siehe unten). Da die Bumper ja relativ selten genutzt werden, bei nutzung aber sehr schnell reagieren müsssen, dachte ich, dass ein Interrupt dieses Problem am besten lösen würde. Hier erstmal der bisher verwendete Code:


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 2400

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Admux = &B01100100
On Adc Onadc
Config Pind.3 = Output
Config Pind.4 = Input
Portd.3 = 1

Dim Switch As Word
Start Adc

Do
Switch = Getadc(4)
Print Switch
Loop
End

Onadc: 'ADC-Interrupt-Routine
If Getadc(4) < 1023 Then
Print "interrupt"
End If
Return

Wem das ganze irgendwie bekannt vor kommt, der liegt nicht falsch, es geht dabei um den Asuro ;-)

Zum Code: Im Normalfall, also ohne pressen eines Bumpers, liefert der ADC, dank "Portd.3 = 1", einen Wert von 1023. Beim Pressen einen Wert von ca. 800 bis 1020 je nach Bumper. Leider wird nur der INterrupt nie aufgerufen, woran könnte das leigen bzw. was müsste geändert werden?

Nun tun sich ein par Fragen bei mir auf:
Entspricht
Reference = Avcc dem angegebenen
Admux = &B01100100 etc.
Leider bin ich mit dem Reigster Admux eben sehr wenig vertraut, also entschuldigt bitte grobe Fehler :-)

Ich bitte um Mithilfe und danke schonmal im Voraus.

MFG Moritz

x-ryder
12.12.2004, 20:16
du hast glaube ich nen "Enable Interrupts" vergessen...

was bekommt ihr eigentlich immer so bei den einzelnen werten raus?

ich habe:

- Recht Außen: 670
- Rechts Mitte: 502
- Rechts Innen: 318
- Links Innen: 195
- Links Mitte: 105
- Kins Außen: 55

Hast du auch sowas?

Martin

RCO
12.12.2004, 20:40
Also leider bringt "enable interrupts" auch nicht mehr, wäre auch zu einfach gewesen ;-)
Nein, meine Werte liegen höher, vielleicht liegt das daran, dass ich Pind.3 auf 1 gesetzt habe.

1010
994
965
915
819
678
(von Rachts nach links)

Womit hast du die Werte gemessen? Mit meinem Script?

MFG Moritz

RCO
12.12.2004, 22:29
Mit:

Portc.4 = 1
Portd.3 = 0

Komme ich auf diese Werte, sind ja fast deine:

672
497
335
210
118
68

MFG Moritz

12.12.2004, 22:49
Hallo

Enable Adc
Enable Interrupts

sollte dein Problem lösen.

MFG
Dieter

RCO
12.12.2004, 23:12
;-) Es kann so einfach sein ;-)
Darauf wäre ich echt nie gekommen, da der Adc ja schon Werte lieferte!
Danke!

Also wen es interessiert, hier dann mal das funktionierenden Script:


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 2400

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Admux = &B01100100
On Adc Onadc
Config Pind.3 = Input
Config Pinc.4 = Input
Portc.4 = 1
Portd.3 = 0
Dim Switch As Word
Start Adc
Enable Interrupts
Enable Adc


Do
Switch = Getadc(4)
Print Switch

Waitms 100
Loop
End

Onadc:
If Getadc(4) < 1023 Then
Print "i"
End If
Print Getadc(4)
return

Eine Frage stelle ich mir gerade:
Wie mache ich es, wenn ich einen 2. ADC-interrupt haben nöchte?
Einfach noch ein Admux dahinterhengen, oder was bedeutet das genau, ist das überhaupt möglich? Brauche ich admux überhaupt, oder reicht das "on adc"?
und löst "on adc" bei jeder änderung an egal welchem ADC aus?

MFG Moritz

x-ryder
13.12.2004, 13:03
was ist denn der hintergrundgedanke beim 2. adc-int?

Martin

RCO
13.12.2004, 13:12
Hintergedanke... keiner... Noch keiner, aber vielleicht kommt da ja noch was, ich will ja nur mal wissen was möglich ist.
Aber wenn ich das jetzt richtig verstehe, habe ich nur einen ADC-interrupt der mit admux angegeben wird, oder?
Und der löst auch nur bei dem im Admux angegebenen Adc aus, oder?

Bitte um Klarstellung ;-)

MFG Moritz

RCO
13.12.2004, 20:17
Ok, hat sich jetzt geklärt, aheb einen Interrupt für alle ADCs.
Admux braucht man da nicht!

MFG Moritz