-         
+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Brauche dringend Hilfe beim ADC-Interrupt

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674

    Brauche dringend Hilfe beim ADC-Interrupt

    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:

    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken anschluss.gif  

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    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
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Mit:
    Portc.4 = 1
    Portd.3 = 0
    Komme ich auf diese Werte, sind ja fast deine:

    672
    497
    335
    210
    118
    68

    MFG Moritz

  5. #5
    Gast
    Hallo

    Enable Adc
    Enable Interrupts

    sollte dein Problem lösen.

    MFG
    Dieter

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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:

    Code:
    $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

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    was ist denn der hintergrundgedanke beim 2. adc-int?

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Ok, hat sich jetzt geklärt, aheb einen Interrupt für alle ADCs.
    Admux braucht man da nicht!

    MFG Moritz

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •