Guten Morgen,
ich möchte den integrierten AD-Wandler des AT89C51AC3 nutzen.
Habe mir das Datenblatt des Controllers genau angesehen und auch den
Beispiel-Code zum Betrieb der ON-Chip-ADCs von Atmel zur Hilfe genommen.
Dennoch möchte der AD-Wandler nicht so richtig laufen. Mein Compiler ist
der sdcc. Hier mal mein Code in C:
1 | #include <at89c51ac3.h>
|
2 | #include <stdio.h>
|
3 | #include <stdlib.h>
|
4 | #include <string.h>
|
5 | |
6 | __bit conversion_in_progress=0; /* software flag */
|
7 | //*************************ADC**************************************+
|
8 | void adc_interrupt() __interrupt(8) __using(2);
|
9 | |
10 | void main(void)
|
11 | {
|
12 | CKCON0 = 0x01; //X2 Bit setzen und T1X2 auf FOSC/6
|
13 | spi_init();
|
14 | EA=1; // enable interrupts
|
15 | EADC = 1; /* enable ADC interrupt */
|
16 | |
17 | ADCF |= 0x01; //define P1.0 as analog input
|
18 | ADCLK = 0x00; //Fadsc = XTAL/64 = 22,1184MHz/64=345.6 kHz
|
19 | ADCON = 0x20; /* Enable the ADC */
|
20 | ADCON &= ~0x07; // Clear the channel field ADCON[2:0]-->[000] and thus select channel 0
|
21 | //ADCON |= 0x01; /* Select channel 1 */
|
22 | ADCON &= ~0x40; //stanard 8Bit, no idle mode
|
23 |
|
24 | if(!conversion_in_progress)
|
25 | {
|
26 | conversion_in_progress=1;
|
27 | SPI_send_display_data("conversion not started\r\n"); //das erscheint noch auf dem Display
|
28 | ADCON |= 0x08; //start conversion
|
29 | SPI_send_display_data("conversion started\r\n"); //das erscheint nicht mehr, hier "hängt"
|
30 | //also das Programm
|
31 | }
|
32 |
|
33 | while(conversion_in_progress);
|
34 |
|
35 | SPI_send_display_data(int2string(value_converted));
|
36 |
|
37 |
|
38 | }
|
39 |
|
40 | void adc_interrupt() __interrupt(8) __using(2)
|
41 | {
|
42 | SPI_send_display_data("in interrupt\r\n");
|
43 | ADCON &= ~0x10; //clear ADEOC flag
|
44 | value_converted = ADDH;
|
45 | conversion_in_progress=0; //set software flag
|
46 | }
|
Durch Textausgabe auf einem Display konnte ich nachverfolgen bis wohin
das Programm noch läuft. Wie bereits in den Quelltextkommentaren
vermerkt,
läuft das Programm bis zu der Zeile in welcher das Konvertieren
gestartet wird. Also bis zum Befehl "ADCON |= 0x08;" und bleibt dann
hängen.
Lasst euch nicht von den Zeilen mit "SPI_send_display_data();"
irritieren. Diese sind Teil meiner Debugging Versuche.
Nach mehrstündiger Fehlersuche wende ich mich nun an Euch, mit der Bitte
um Hilfe in diesem Fall.
Kurzum: Was mach ich falsch, was habe ich nicht bedacht?
Grüße und noch eine Gute Nacht
Markus