Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: @Peter S - Timer 0 läuft nicht stabil Kategorie: CC-Pro Unit & Appl.Board (von Werner - 13.09.2008 10:18)
Als Antwort auf Re: @Peter S - Timer 0 läuft nicht stabil von Hannes - 12.09.2008 13:51

Hallo Hannes,
BASCOM gibt es bei MCS-Electronics für Programme bis 4 kB gratis, funktioniert gut.
Dort sind auch Hinweise für Programmiergeräte (am USB-Anschlu�!!).
Verwende eine Ausführung, die mit BASCOM direkt zusammenarbeitet, sonst mu� noch AVR-Studio
(ebenfalls kostenlos) für die Programmierung verwendet werden (ebenfalls auf unterstützten Programmer
 achten!).
BASCOM undAVR- Studio erlauben auch die Simulation des Programmes und dabei die genaue
Laufzeitermittlung von Programm bzw. Programmabschnitten.
Im Internet findet man alle notwendigen Informationen und bei Reichelt den ATMEGA8 sehr preiswert.

Viel Erfolg

> Hallo Werner,
>
> ist eine Möglichkeit. In meinem Fall müsste ich dann auch die Spannung mit dem extra Proz.
> einlesen, und die Daten zum C-Control schicken (ist alles sehr umständlich), oder gleich Bascom verwenden.
> Was braucht man da für ein Programmiergerät?
>
> Gruss
>
>
>
>
> > Hallo Hannes,
> > für zeitgenaue Funktionen mit der C-Control empfiehlt es sich einen extra Processor einzusetzen.
> > Ich verwende gern den ATMEGA8 mit BASCOM (mit eingelagerten Assemblerroutinen),
> > der über RS232 an die C-Control (z.B.Pro 32) angehängt wird. Dann gibt es keine Probleme mehr
> > und vor allem einfache Programme.
> >  
> > > Hallo Peter,
> > >
> > >
> > > ich möchte exakt 5ms nachdem ein Interrupt ausgelöst wurde eine Spannung messen.
> > > Zum Testen habe ich an INT0 ein stabiles Rechtecksignal von einem Frequenzgenerator mit einer
> > > Periodendauer von 20ms angeschlossen. Die positive Flanke triggert den INT0, dieser startet den
> > > Timer0 und nach 5ms wird die Spg. eingelesen.
> > > Zum Messen schalte ich bei der INT0 Routine und der Timer0 Routine eine LED kurz EIN + AUS.
> > >
> > > Zum Problem:
> > > Das INT0 Signal ist stabil vorhanden, und die 5ms Verzögerung passen, nur das Signal das der Timer
> > > auslöst zittert, d.h. die 5ms werden vom Timer nicht exakt reproduziert. Das Signal schwankt rund
> > > 100us hin und her, teilweise setzt es sogar ganz aus.
> > >
> > > Kann man das verbessern?
> > > Weil es bringt mir nichts, wenn man Timer0 mit 67.8ns auflösen kann, der Timer aber die Zeit nicht
> > > stabil reproduzieren kann.
> > >
> > > Gruss
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > word ADCWert_L1;
> > > byte cnt1, Sekunde, Minute, Stunde, Sekunde_alt;
> > >
> > > void main(void)
> > > {
> > >
> > >     SPI_Disable();
> > >     Serial_Init(0,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD38400);       // Schnittstelle 0
> > >     LCD_Init();                             // Display initialisieren
> > >     LCD_ClearLCD();                         // Display löschen
> > >     LCD_CursorOff();                        // Display Cursor ausschalten
> > >     Port_DataDirBit(PORT_LED1,PORT_OUT);
> > >     Port_WriteBit(PORT_LED1,PORT_OFF);
> > >
> > >     Irq_SetVect(INT_0, Nulldurchgang_L1);   // INT0 setzen für Nulldurchgang L1 (Port D.2)
> > >     Ext_IntEnable(0,3);                     // INT0: Mode 3 = steig Flanke
> > >
> > >     Irq_SetVect(INT_TIM0COMP,Timer0_ISR);   // Interrupt Routine Timer 0  definieren
> > >
> > >
> > >     while(1);
> > > }
> > >
> > >
> > > void Nulldurchgang_L1(void)                 // Aufruf bei steigender Flanke
> > > {
> > >     int irqcnt;
> > >
> > >     Timer_T0Time(72,PS0_1024);              // Zeit (5ms) festlegen und Timer0 starten
> > >     Port_WriteBit(PORT_LED1,PORT_OFF);      // LED1 OFF
> > >     Port_WriteBit(PORT_LED1,PORT_ON);       // LED1 ON    Impulsdauer Off-On 50us
> > >
> > >     irqcnt=Irq_GetCount(INT_0);
> > > }
> > >
> > >
> > >
> > > void Timer0_ISR(void)                       // Aufruf 5ms nach Nulldurchgang der Wechselspg.
> > > {
> > >     int  irqcnt;
> > >     Port_WriteBit(PORT_LED1,PORT_OFF);      // LED1 OFF
> > >     Timer_T0Stop();                         // Timer0 anhalten
> > >
> > >     ADC_Set(ADC_VREF_VCC, 0);               // VREF für ADC0(=PortA.0) = VCC (5.000V)
> > >     ADCWert_L1 = ADC_Read();                // Spitzenwert von L1 in den ADC
> > >
> > >     irqcnt=Irq_GetCount(INT_TIM0COMP);
> > >
> > >     Port_WriteBit(PORT_LED1,PORT_ON);       // LED1 ON, Laufzeit LED1 OFF-ON ca. 400us
> > > }
> > >


    Antwort schreiben


Antworten: