- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: Softwartimer

  1. #1
    Duderinowski
    Gast

    Softwartimer

    Anzeige

    Praxistest und DIY Projekte
    HI,

    Wie mache ich eine Softwartimer der mir genau 10 sekunden liefert?

    Ich meine
    {
    start timer
    1 second
    start function
    10 seconds
    end function
    }

    die Funktion muss innerhalb den 10 sekunden laufen,um werte einzusammeln

    Thx für Eure Hilfe

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Brauchst du den Timer in a) blocking mode (d.h. der PIC friert für die Dauer dieser Zeit ein) oder b) in non-blocking-mode (aso über interrupts und einem Hardware-Timer)?

    Bei a) nimmst du einfach eine verschachtelte For-Schleife die z.B.: 1000 mal NOP aufruft. Der bekanntliche Nachteil dieser Aktion ist, dass, so lange der PIC in diesen Schleifen gefangen ist (und 10s sind eine Ewigkeit, wenn die Dauer eines Befehls in Microsekunden berechnet wird).

    Bei b) schaltest du z.B.: den Timer0 ein, setzt seinen Pre(Post)-Scale auf maximum und aktivierst den Interrupt. Bei 4MHz und 256 Prescale läuft dieser dann alle 25,3 ms über. Das ergibt bei einem 8Bit-Timer ~6,5s. Für die Formeln schau mal auf fernando-heitor.de.

    Es wäre einfacher, wenn du beschreiben könntest, wofür du es brauchst. Oder zumindest eine bessere Problembeschreibung liefern könntest.

    MfG
    Mobius

  3. #3
    Duderinowski
    Gast
    mit Interrupts..

    hab paar Code Schnippel ...aber ich weiss nicht welcher von ihnen richtig wäre

    Code:
    interrupt() 
    { 
    
    if (time_count != 0) 
        time_count--; 
    
    } 
    
    
    
    main() 
    { 
    
    some_function(10); 
    
    } 
    
    
    
    some_function(time_to_run) 
    { 
    
    time_count = time_to_run; 
    
    while (time_count != 0) 
        { 
        do stuff 
        } 
    
    }

    oder

    Code:
    int1  Clock_Been_Initialized=0; 
    
    Int16 Miliseconds; 
    #locate Miliseconds = Registry_Map+6 
    Int16 Seconds; 
    #locate Seconds = Registry_Map+8 
    int1  Second_Tick=0; 
    
    // Global Real Time Clock Information 
    #int_TIMER2                                                 // Clock interrupt adjusted to occurs ~ 1ms 
    void TIMER2_isr() 
    {  Miliseconds++; 
       if(Miliseconds>999) 
       {  Miliseconds=0; 
          Seconds++; 
          Second_Tick=1; 
       } 
    } 
    /*********************************************************** 
    *    Service Hardware Modules                              * 
    ***********************************************************/ 
    #inline 
    void Clock_Service(void) 
    {  if(!Clock_Been_Initialized) 
       {  setup_timer_2(T2_DIV_BY_4,249,1);                     // Set 1mS period 
          enable_interrupts(INT_TIMER2); 
          Seconds=0; 
          Clock_Been_Initialized=1; 
       } 
       if(Second_Tick) 
       {  Second_Tick=0; 
          Registry_Map[6]=Registry_Map[5]; 
          Registry_Map[5]=0; 
          Registry_Map[2]=Registry_Map[1]; 
          Registry_Map[1]=0; 
       } 
       Registry_Map[5]++; 
    }
    Danke für deine Hilfe

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests