-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Einen Programmteil nur alle 5 min. oder 1/Tag aufrufen. Wie?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101

    Einen Programmteil nur alle 5 min. oder 1/Tag aufrufen. Wie?

    Anzeige

    Hallo!
    Ich möchte einen Programmteil nur alle 5 Minuten aufrufen oder auch nur max. einmal pro Tag.
    Hintergrund: Mein AVR soll mir eine SMS schicken. Das soll natürlich nicht dauernd erfolgen, sondern nur nach einer fest angegeben Zeit.

    Ich hab schon was gemacht, aber das ist mit einer WAIT xxx Sekunden, was natürlich Käse ist, denn solange er in dieser Schleife ist macht er nix anderes.

    Das ganze ist in Bascom und mit einem ATMEGA8.

    Wie macht man sowas? Kann mir da jemand helfen?
    Hans

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.12.2007
    Beiträge
    180
    Ein 16 bit Timer benutzen und den passenden Prescaler verwenden. Sobald der Timer übergelaufen ist verzweigt dein µC in die ISR des Timers und dort kannst du dir dann eine SMS schicken lassen
    Gruß

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ich möchte einen Programmteil nur alle 5 Minuten aufrufen oder auch nur max. einmal pro Tag.
    Es gibt zusätzlich die Möglichkeit, die Softclock von Bascom zu aktivieren (Config Clock = Soft).
    Was du dazu noch brauchst: Einen Uhrenquarz 32768 Hz (sind nur ein paar Cent).

    Gruß Dirk

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Danke für die schnelle Antwort!
    Ich werde das mit dem Timer versuchen. Das 32Khz Quarz und die Softclock ist etwas lahm. Oder könnte man die SoftClock auch mit einem 14, xxx Mhz Quarz nutzen? Auf ein paar Sekunden Ungenauigkeit käme es mir nicht an.

    Weiß jemand, wie klein die AREF- beim AVR sein sein darf? Ich habe das Datenblatt schon mehrmals durchsucht und finde nix drüber. Da muss es doch eine Mindestspannung für AREF geben, oder?

    Danke im voraus!
    Gruß
    Hans

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    43
    Beiträge
    377
    Zitat Zitat von Hans55
    Das 32Khz Quarz und die Softclock ist etwas lahm. Oder könnte man die SoftClock auch mit einem 14, xxx Mhz Quarz nutzen?
    Hallo Hans!

    Das ist so gedacht: Man nimmt den internen RC-Oscillator und fährt damit mit 8 Mhz. Den 32768 Hz Quarz schließt man an und taktet damit nur die Zeitfunktionen. Damit hat man ohne großen Aufwand eine ziemlich genaue Zeit.

    Aber wenn du wirklich nur 5 Minuten warten möchtest und dir egal ist, wenn sich das auf den Tag hinaus mehrere Minuten verschieben kann, dann brauchst du das nicht.

    mfg
    Gerold
    :-)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Ach so ist das gemeint!
    Danke Gerold.

    Gruß
    Hans

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo nochmal!
    Also irgendwie krieg ich das nicht hin.
    Ich will eine LED am Port D.2 im Sec Takt Toggeln.
    Ich hab auf internen 8Mhz Takt umgeschaltet damit ich das Beispiel unter "Timer im ROBONETZ" verwenden kann.

    Warum taktet aber nix? Ist da was falsch?

    So hab ichs gemacht:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000            'Interner Takt
    $baud = 9600
    
    ' Ausgang
    Config Pinb.2 = Output        ' Pin B.2 als OUTPUT => LED
    
    Config Timer1 = Timer , Prescale = 256       'Konfig Timer1
    Enable Timer1                 'schaltet den Timer1 ein
    
    On Timer1 Timer1_isr          'Spr. bei T1 Überlauf zu "TIMER1_ISR"
    Enable Interrupts
    Timer1 = 34285                'T1 soll schon von 34285 wegzählen
    
    
    '/// HAUPTPROGRAMM /////////
    Main:
    Do
    
    Loop
    Goto Main
    
    '//// ISR TIMER1 ////////
    Timer1_isr:                   'ISR von Timer1
    Timer1 = 34285             'Timer1 soll wieder von 34285 wegzählen
    Toggle Pinb.2                 'schaltet PortB.2 im Sec Takt                               
    
    return
    End

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    dieser 32.xxkHz Quarz ergibt genau ne Sekunde, wenn man ihn mit irgendwas teilt.. zumindest sher gut angenähert.
    Einige Minuten Verschiebung hat man damit im Monat, aber dann kommt die SMS halt später

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Main:
    und goto Main ist überflüssig.
    ich würde in die leere
    Do
    loop

    noch ein nop setzen und danach ein end

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000            'Interner Takt
    $baud = 9600
    
    ' Ausgang
    Config Pinb.2 = Output        ' Pin B.2 als OUTPUT => LED
    
    Config Timer1 = Timer , Prescale = 256       'Konfig Timer1
    
    On Timer1 Timer1_isr          'Spr. bei T1 Überlauf zu "TIMER1_ISR"
    Enable Timer1                 'schaltet den Timer1 ein
    
    Enable Interrupts
    Timer1 = 34285                'T1 soll schon von 34285 wegzählen
    
    
    '/// HAUPTPROGRAMM /////////
    Do
       nop
    Loop
    end
    
    '//// ISR TIMER1 ////////
    Timer1_isr:                   'ISR von Timer1
    Timer1 = 34285             'Timer1 soll wieder von 34285 wegzählen
    Toggle Pinb.2                 'schaltet PortB.2 im Sec Takt                               
    
    return
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo nochmal!
    Jetzt funzt es!!!
    Super. Ich hatte bei Toggle statt PortB.2 => PinB.2
    das mag er scheinbar nicht.

    so schauts jetzt aus:
    Code:
    '/////////////////////////////////////////////////////////////////////////////
    'Stand: 19.01.2008
    'Name: ""
    ' ATMEGA8- SelbstBauModul
    '/////////////////////////////////////////////////////////////////////////////
    $regfile = "m8def.dat"
    $crystal = 14745600           'ext. Quarz
    '/// DEFINITIONEN ///////////////////////////////////////////////////////
    ' Ausgänge
    Config Pinb.2 = Output        ' Pin B.2 als OUTPUT => Relais+LED
    
    '/// TIMER /////////////////////////////////////////////////////////////////////
    
    Config Timer1 = Timer , Prescale = 256       'Takt: Quarz/256
    ' Bei 14Mhz Quarz => T = 2 hoch 16 x 256/ 14Mhz = 1,13 sec Periode
    ' 1/ 1,3 = 0,879 sec
    
    On Timer1 Ontimer1        'Interrupt-Routine für Timer1-Overflow
    Enable Timer1                 'Timer1-Overflow-Interrupt einschalten
    Enable Interrupts             'Interrupts global zulassen
    '---------------------------------------------------------
    Do
    nop
    Loop
    
    End
    '---------------------------------------------------------
    Ontimer1:                     'Interrupt-Routine
        Toggle Portb.2            ' Ein=> Aus
    Return
    Jetzt hab ich allerdings noch das Problem der extremen
    Ungenauigkeit.
    Gruß
    Hans

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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