@PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung Kategorie: CC-Pro Unit & Appl.Board (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); } Bild2 02.jpg: Bild3 02.jpg: | |
Antwort schreiben Antworten: Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von PeterS - 27.06.2014 10:56) Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von Hannes24 - 28.06.2014 19:43) Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von PeterS - 13.07.2014 11:08) Re: @PeterS - AVR32 LCD-Ausgabe stört Interrupt Bearbeitung (von Torsten - 22.01.2014 17:59) 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