Arduino Due ADC Interupt

Hallo,
Laut Datenblatt sollte es möglich sein, den ADC im Hintergrund laufen zu lassen.
Wenn eine Wandlung fertig ist, wird ein Interrupt ausgelöst.

Fände dies bei meinem Projekt sehr praktisch.

Leider wird der Interrupt Handler nie angesprungen.
Im ADC_IER sollte DRDY(24) das Richtige sein ?

....

ADC->ADC_CR |=1; //reset the adc
ADC->ADC_WPMR=0;
ADC->ADC_MR |= (1<<4) | (1<<7);  // 4=10 Bit Auflösung  7= free_run_mode


ADC->ADC_IER |= (1<<24); // Data Ready Interrupt
ADC->ADC_IDR = ~(1<<24);  // Enable interrupts
NVIC_EnableIRQ(ADC_IRQn);  // Interrupt Handler


ADC->ADC_CHER = 0x01; //enable ADC on pin A7
ADC->ADC_COR = 0x00000000 ;   // All offsets off 
ADC->ADC_CGR = 0x15555555 ;   // All gains set to x1

.....

}

void ADC_Handler(void)
{
 
 if ((ADC->ADC_ISR & 0x01)==0) 
                             { 
                             Water_Temp=ADC->ADC_CDR[0]; 

                             ADC_Convert=true;
                             }
                            


}

Vielleicht fragst Du das besser in der Due Abteilung?

DrDiettrich:
Vielleicht fragst Du das besser in der Due Abteilung?

Dachte, auch hier gibt es inzwischen mehr Leute die sich mit dem ARM befassen
Gibt ja auch noch andere Arduino's mit einem ARM. :o

Hallo,

ich habe das vor kurzem für den Uno/Mega mal zu Fuss gemacht. Due habe ich nicht. Nur da C = C ist, auch beim Due, fällt mir ein merkwürdiges Setting auf. Worauf der Interrupt bestimmt nicht enabled wurde. Wenn man das Bit 24 setzen möchte und will die anderen Bits im Register unberührt lassen, dann sollte man verodern, denke ich. |= (1<<24)

ADC->ADC_IDR = ~(1<<24);  // Enable interrupts

Hallo Doc,
Hast schon recht, ich hatte was vergessen... das merkwürdiges Setting sollte ein Löschen des Bit's sein

Denn in dem Register ADC_IDR muß man das betreffende Bit löschen.

ADC->ADC_IDR &= ~(1<<24);

Ich habe durch das fehlende "und" alle dahinter mit auf 0 gesetzt.
Was laut Datenblatt wenig Wirkung haben sollte, denn es funktioniert trotzden nicht :confused:

Der Due hat zwei Register die dafür zuständig sind ADC_IDR (Interrupt Disable Register) und ADC_IER(Interrupt Enable Register)

Dessen Bits wohl einmal auf 1 und 0 stehen sollen, den tieferen Sinn dahinter verstehe ich nicht.

Hallo,

okay, &=~ stimmt ja nun.
Hmm blöd, dann kannste dir nur nochmal das Datenblatt durchlesen, vielleicht müssen noch paar Bits mehr gesetzt werden.
Oder guckst mal in den core Files IDE wie die den DUE anspricht wenn sie den ADC nutzen soll.
Oder guckst mal die App Notes durch, ähnlich wie bei Atmel.

Oder guckst mal im mikrocontroller forum. Die machen ja fast alles klassisch in C.
Mehr kann ich leider nicht helfen.

rudirabbit:
Dachte, auch hier gibt es inzwischen mehr Leute die sich mit dem ARM befassen
Gibt ja auch noch andere Arduino's mit einem ARM. :o

Nur hat der ADC nicht viel mit ARM zu tun. Das macht jeder Hersteller anders. Und der SAM3 auf dem Due wahrscheinlich wieder anders, als die SAMD auf den anderen Arduinos.

Für den Teensy 3.x gibt es die ADC-Library, die macht dort wahrscheinlich was du suchst. Allerdings setzt die den ADC auf kontinuierliches Samplen und liest per DMA.

ArduFE:
Für den Teensy 3.x gibt es die ADC-Library, die macht dort wahrscheinlich was du suchst. Allerdings setzt die den ADC auf kontinuierliches Samplen und liest per DMA.

Genau dies (via DMA) habe ich für den DUE (SAM3) auch gefunden, mal sehen...