PIC 16LF1829在adc-measure期间自行复位

时间:2016-06-02 08:47:08

标签: c microchip mplab adc

由于我有一个问题,我的PIC 16LF1829在测量所选的adc通道时自行复位。我和几位同事交谈过,但没有人可以帮助我。我试图更改adc频率,更改了电压参考和所选通道。

当adc尝试执行adc-measure时出现问题。以下是我的德国评论代码:

int ADC_Messung(int Kanal){
int analog = 0;   //AD-Wert auf 0 setzen.
int analog_total[5]={0, 0, 0, 0, 0};

ADCON0bits.CHS=Kanal;
ADCON0bits.ADON=1;
PIR1bits.ADIF=0;

delay(1);   //Warten bis eingeschalten und ausgewählt.

for(int adc_runde=0; adc_runde<5; adc_runde++)
{
    analog = 0;   //AD-Wert auf 0 setzen.
    ADCON0bits.GO_nDONE = 1;   //AD-Wandler aktivieren.

    while(PIR1bits.ADIF == 0);   //Warten auf AD-Flag, so wird angezeigt, dass die Messung abgeschlossen ist.*/

    analog = ADRESH << 8;   //Messwert muss um 8 Stellen(nach links) geschoben werden, weil der Messwert in 2 8-Bit Register gespeichert wird.
    analog_total[adc_runde] = (ADRESH << 8) | ADRESL;
    ADCON0bits.GO_nDONE = 0;   //AD-Wandler deaktivieren.
    PIR1bits.ADIF=0;   //AD-Flag auf 0 setzen für die nächsten Messung.
}

ADCON0bits.ADON=0;
delay(1);   //Warten, bis ADC ausgeschalten ist.
int analog_return=0;

for(int adc_summe=0; adc_summe<5; adc_summe++){   //Zur Bildung der Summe der Messungen.
    analog_return=(analog_return+analog_total[adc_summe]);
}

return analog_return=(analog_return/5);   //Mittelwert der ADC-Messungen bilden zur weiteren Verwendung.
}

此处我的初学者:

void init(){
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled) -> Maximal 16 MHZ möglich, da Speisung nicht 100% zuverlässig.
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

return;

}

void initdevice(){
OSCCON = 0b01111000;        //PLLEN ist deaktiviert, da der PIC mit den 16 MHz vom internen Oszillator betreibt wird.

//WDTCON = 0b00?????1;        //@Todo Frequenz des Watchdog Timers muss noch festgelegt. Zudem muss er noch im Config1 freigeschalten werden.

APFCON0 = 0b00000000;       //Keine Pinfunktionen gewechselt.
APFCON1 = 0b00000000;       //Keine Pinfunktionen gewechselt.

PORTA = 0b00000000;         //Jeder Pin wird zur Sicherheit deaktiviert.
TRISA = 0b00001000;         //Master Clear (MCLRE) kann nur als Eingang definiert werden.
LATA = 0b00000000;          //Zur Sicherheit wird auch der Latch deaktiviert.
ANSELA = 0b00000000;        //Keine Analogeingänge festgelegt.

PORTB = 0b00000000;         //Jeder Pin wird zur Sicherheit deaktiviert.
TRISB = 0b01000000;         //RB6 ist Eingang für Jumper_VCC. Der Rest sind alles Ausgänge.
LATB = 0b00000000;          //Zur Sicherheit wird auch der Latch deaktiviert.
ANSELB = 0b00000000;        //Keine Analogeingänge festgelegt.

PORTC = 0b00000000;         //Jeder Pin wird zur Sicherheit deaktiviert.
TRISC = 0b01001111;         //@Todo Pinbelegung muss noch beschrieben werden.
LATC = 0b00000000;          //Zur Sicherheit wird auch der Latch deaktiviert.
ANSELC = 0b00001111;        //@Todo Pinbelegung muss noch beschrieben werden.

ADCON0 = 0b00110000;        //Die AD-Wandler wird noch deaktiviert und das Status Bit wurde aus Vorsicht gelöscht. Als erster Analogeingang wird keiner festgelegt, da dieser sowieso vor der Messung festgelegt wird.
ADCON1 = 0b11100011;        //Die Ausrichtung des ADC-Registers ist rechtsbündig, die Arbeitsfrequenz beträgt 250 kHZ (Vierundsechtzigstel von der Grundfrequenz und Referenzspannung kommt von der intern Referenzspannung auf 2,048 BDC.
FVRCON = 0b11000010;        //Es wird die interne 2.048 VDC Referenzspannung für den ADC verwendet.

INTCON = 0b11101000;        //Interrupts werden zur Benützung des Analog-Digital-Wandlers und für die Delay-Funktion benötigt. Extern werden keine Interrupts ausgelöst. Flag Bits werden zur Vorsicht gelöscht.
PIE1 = 0b01000110;          //Gibt die nötigen Interrupts für den Analog-Digital-Converter, den Half-Bridge Mode und der Delay-Funktion frei.
//PIE2 wird nicht benötigt.
PIE3 = 0b00000010;          //Gibt den Timer4-Interrupt frei, um zu erkennen, wann der PWM fertig ist.
//PIE4 wird nicht benötigt.
PIR1 = 0b00000000;          //Alle Flags, welche verwendet werden, werden zur Sicherheit zurückgesetzt.
//PIR2 - PIR4 werden nicht zurückgesetzt, da die PIE2 - PIE4 nicht benötigt werden und so keine Überprüfung der Flags stattfindet.

//Warning PWM-Modul erst freigeben, wenn ein Durchlauf gemacht wurde, sonst könnte Kurzschluss von beiden PWM-Ausgängen auftreten !!!
T4CON = 0b00000101;         //PWM-Timer wird noch ausgeschalten gelassen und mit einer Frequenz von 125 khz betrieben, sobald er eingeschaltet ist.
CCP1CON = 0b10111100;       //PWM-Ausgang als alternativer Half-Bridge-Mode festgelegt, die Duty-Cycle-Bits werden zurückgesetzt und alle Ausgänge auf active-high gestellt.
CCPTMRS = 0b11111101;       //PWM-Signal von PWM-Quelle 1 wird von Timer4 versorgt. Die anderen werden nicht benötigt.
ECCP1AS = 0b00000000;       //Möglich Shut Down Flags werden gelöscht und Shtudown durch externe Einflüsse deaktiviert.
PWM1CON = 0b10001000;       //Falls ein Shutdown eintritt, wird der PWM automatisch neu gestartet und die Dead-Time beträgt 2 us (4*8 Takte Mikrocontroller (32 Takte), da die Ausschaltzeit der FETs bei 16 ns und die der Transistoren bei ungefähr 1 us liegen und dies die tiefste Zeit ist.
PSTR1CON = 0b00010011;      //PWM-Veränderungen werden in der nächsten Periode übernommen und Wellenform wird nach Polarität von CCPxM<1:0> übernommen.
}

如果有人能帮我理解原因,为什么它不起作用,那就太好了。

1 个答案:

答案 0 :(得分:1)

PIE1 = 0b01000110;

您启用了ADC中断。使用您当前的代码,无论您在其他地方编写什么,它都无法正常工作。你的代码崩溃试图跳转到一个不合适的处理程序,或者永远陷入中断 由于您没有使用ADC中断,请不要启用它们; PIR1bits.ADIF是独立的,即使禁用了中断也会设置(或者您可以轮询ADCON0bits.GO_nDONE以获得相同的效果)。