Hallo,
ich habe hier eine kleine Schaltung mit einem STM8L051F3 (verwende zum
Entwickeln gerade ein STM8L152C6), bei der ich eine analoge Spannung
messen muss und die dann auf einen I2C Bus geben muss. Um das ganze
möglichst einfach zu halten, wollte ich den ADC starten, in der ISR des
ADC den Wert speichern und aus der ISR das samplen wieder starten. In
einer Hauptschleife würde ich den Wert da ab und zu nehmen und auf den
I2C Bus schreiben. Die ISR wird auch ausgeführt, allerdings bekomme ich
in der ISR keine sinvollen Werte (wechselnde Werte im Bereich ~0x7ed bis
0x80d).
Der Dokumentation nach, müsste das "eigentlich" ganz einfach sein: ADC
anschalten, "single conversion mode" auswählen, DMA ausschalten, den
richtigen Kanal wählen und Messung starten. Das ich den richtigen Kanal
gewählt habe, habe ich schon drei mal überprüft (pin PB0, Channel 18).
Was mich ein wenig wundert, dass in der ISR neben, dem "End of
Conversion" Flag, auch das "Overrun" Flag gesetzt ist. Es sollte aber
nur der EOC Interrupt enabled sein.
Hier meine Initialisierung:
1 | void ADC_Init(void)
|
2 | {
|
3 | CLK->PCKENR2 |= 0x01; /* Enable clock to ADC */
|
4 |
|
5 | // Switch on ADC
|
6 | ADC1->CR1 = 1;
|
7 | delay( 2 ); // 2 ms
|
8 |
|
9 | /* reset all interrupt flags */
|
10 | ADC1->SR &= ~0x07;
|
11 |
|
12 | /* disable DMA for single conversion */
|
13 | ADC1->SQR[1] |= 0x80;
|
14 |
|
15 | /* PB0 (channel 18) for STM8L051F3 and STM8L152C6 */
|
16 | ADC1->SQR[2] = 1 << (18 - 16);
|
17 |
|
18 | /* 12 bit resolution
|
19 | Interruptenable for end of conversion
|
20 | single conversion
|
21 | Conversion start
|
22 | ON */
|
23 | ADC1->CR1 = 0x09;
|
24 |
|
25 | /* conversion start */
|
26 | ADC1->CR1 |= 2;
|
27 | }
|
und hier die ISR:
1 | void ADCInterruptHandle (void) __interrupt( 18 )
|
2 | {
|
3 | uint8_t low, high;
|
4 |
|
5 | low = ADC1->DRL;
|
6 | high = ADC1->DRH;
|
7 |
|
8 | voltage = low | ( high << 8 );
|
9 |
|
10 | /* conversion start */
|
11 | ADC1->CR1 |= 2;
|
12 | }
|
Im Moment lese ich den `voltage` Wert in der Hauptschleife einmal in der
Sekunde aus und schreibe Ihn aus Terminal / Uart.
Kann hier jemand helfen? Irgend welche Tipps, hilfreichen Kommentare?
Schönen Dank im Voraus,
Torsten