Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung Kategorie: CC-Pro Unit & Appl.Board (von Torsten - 22.01.2014 17:59) | ||
Als Antwort auf @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung von Hannes24 - 22.01.2014 16:50 | ||
| ||
> Hallo, > > ich möchte von der Netzspannung die beiden Scheitelpunkte nach dem Nulldurchgang > messen. Dabei gebe ich auf den ext.INT4 das Nullspannungssignal (im Bild gelb) > und starte nach Auslösen des IRQ zwei Timer die dann 5ms und 15ms später > (im Bild blau) den ADC auslesen. > Das funktioniert absolut stabil, solange keine LCD-Ausgabe stattfindet. > Findet eine LCD-Ausgabe statt und ein Hard- oder Software IRQ wird ausgelöst, > dann zittert das ADC Signal (blau) wie verrückt und eine präzise Messung ist nicht > mehr möglich. > > Kann man der Abarbeitung eines Hard- oder Software IRQ oberste Priorität geben ? > Eine verzögerte oder unterbrochene LCD-Ausgabe spielt ja sowieso keine Rolle. > > > > > > > > //-------------------------------------------------------------------------------- > #define PORT_LED3 117 // PortBit 117 > #define PORT_LED4 119 // PortBit 119 > > word x; > > > void main(void) > { > > Port_Attribute(10, PORT_ATTR_INPUT); // P15 auf Eingang = Ext_Int4 (Nullsp) > Port_Attribute(PORT_LED1,PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW); // LED 1 > Port_Attribute(PORT_LED2,PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW); // LED 2 > Port_Attribute(PORT_LED3,PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW); // LED 3 > Port_Attribute(PORT_LED4,PORT_ATTR_OUTPUT|PORT_ATTR_INIT_LOW); // LED 4 > > > Irq_SetVect(INT_100HZ, ISR_10ms); // Interrupt alle 10ms > > Irq_SetVect(INT_4, ISR_ZeroCrossing); // Int4 setzen für Nulldurchgang > Ext_IntEnable(4,2); // Int4: Mode 2 = fallende Flanke > > Irq_SetVect(INT_TIMER0, ISR_Timer0); // Timer0 IRQ, 5ms nach Nulldurchg. > Irq_SetVect(INT_TIMER1, ISR_Timer1); // Timer1 IRQ, 15ms nach Nulldurchg. > > LCD_Init(); // Display initialisieren > LCD_ClearLCD(); > LCD_CursorOff(); // Display Cursor ausschalten > > while(1) > { > x++; > } > > > > } > > // -------------------------- IRQ Nulldurchgang (50Hz) ------------------------------ > // > void ISR_ZeroCrossing(void) > { > Timer_Set(0, TIM_128, 2579, TIMFLG_IRQ); // 2579*1,939us = 5ms > Timer_Set(1, TIM_128, 7736, TIMFLG_IRQ); // 7736*1,939us = 15ms > > Irq_GetCount(INT_4); > } > > > // ----------------------- IRQ Timer0, 5ms nach Nulldurchgang ---------------------- > // den ADC0 auslesen (=Scheitelpunkt der 1.Halbwelle) > // > void ISR_Timer0(void) > { > Port_WriteBit(PORT_LED2,PORT_ON); > Irq_GetCount(INT_TIMER0); > Timer_Disable(0); > Port_WriteBit(PORT_LED2,PORT_OFF); > } > > // ----------------------- IRQ Timer1, 15ms nach Nulldurchgang ---------------------- > // den ADC0 auslesen (=Scheitelpunkt der 2.Halbwelle) > // > void ISR_Timer1(void) > { > Port_WriteBit(PORT_LED2,PORT_ON); > Irq_GetCount(INT_TIMER1); > Timer_Disable(1); > Port_WriteBit(PORT_LED2,PORT_OFF); > } > > // ---------------------------System IRQ 100Hz, alle 10ms -------------------------- > // > void ISR_10ms(void) > { > > > Port_WriteBit(PORT_LED1,PORT_ON); > > LCD_CursorPos(0x00); // dauert 1.2ms > LCD_WriteWord(x, 5); > > Port_WriteBit(PORT_LED1,PORT_OFF); > Irq_GetCount(INT_100HZ); > > } > > > Hallo Hannes, um die Störeinflüsse zu verringern ist es auch Möglich die MCU in den ADC-Sleep-Mode zu setzten während die MCU schläft wird gemessen und wenn die Messung fertig ist weckt die MCU über den ADC-Ready-Interrupt wieder auf. Das Modul "ADCapture-0.06" zeigt einige Varianten. Es geht aber auch ohne Assembler. Schau dir mal die Funktionen "Sleep(SMO)" (ADC Noise Reduction) an. Beim Aufruf von "Sleep(SMO)" sollte die AD-Wandlung gestartet werden und wenn fertig hoffentlich der Bytecode-Interpreter-Interrupt "INT_ADC" aufgerufen werden. Ob dann die MCU wirklich während der Messung geschlafen hatt wei� ich aber auch nicht. Gru� Torsten | ||
Antwort schreiben Antworten: Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von Hannes24 - 22.01.2014 19:35) Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von Torsten - 22.01.2014 20:42) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum