- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从一周以来,我遇到了一个问题,当我的 PIC 16LF1829 测量选定的 adc channel 时,它会自行重置。我和几位同事谈过,但没有人能帮我解决这个问题。我尝试更改 adc 频率、更改电压引用和所选 channel 。
当 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.
}
如果有人能帮助我理解它不起作用的原因,那就太好了。
最佳答案
PIE1 = 0b01000110;
您启用了 ADC 中断。使用您当前的代码,无论您在其他地方编写什么,都将无法工作。您的代码要么在尝试跳转到不存在的处理程序时崩溃,要么永远卡在中断中。
由于您没有使用 ADC 中断,因此不要启用它们; PIR1bits.ADIF
是独立的,即使禁用中断也会被设置(或者您可以轮询 ADCON0bits.GO_nDONE
以获得相同的效果)。
关于c - PIC 16LF1829 在 adc 测量期间自行复位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37586907/
我有一个 ATMega8515我正在尝试设置一个计时器中断,以便如果一个进程花费的时间太长,它将关闭。 我设置定时器: void init_software_interupt(double time)
我正在尝试详细了解计算机如何启动。 我遇到了两件事让我更好奇, 1. RAM放置在ROM的底部,以避免Z80处理器中的Memory Holes。 2. 使用复位 vector ,它将处理器带到 ROM
我已经启动了一个 Spring Boot 应用程序。我添加了一个像这样的休息 Controller @RestController public class EmailController {
我使用了示例代码 super_resolution.cpp。用于从视频源创建高质量图像。所以这里是super_resolution.cpp的代码 #include #include #includ
我是一名优秀的程序员,十分优秀!