- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: problem mit interrupt timer!!!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8

    problem mit interrupt timer!!!

    Anzeige

    Powerstation Test
    hallo!

    ich hätte eine frage zu folgendem programm! und zwar kann ich mir nicht erklären wieso bei SIGNAL der aufruf alle 4096ms erfolgt! bräuschte man da nicht das tccr0 um den takt zu teilen?? und was macht das sei() genau? was ich auch nicht verstehe ist was man mit dem us % 10000 anfangen soll!!

    bitte dringentst um hilfe!!


    SIGNAL(SIG_OVERFLOW0) //Aufruf alle 4.096ms
    {
    // user code here
    us += 4096;
    if(us >= 10000) //0.01s sind abgelaufen
    {
    ++hs;
    us = us % 10000;
    }
    }

    int main( void )
    {
    unsigned char Tasten;
    int cou=0;

    Disp_enable();
    Disp_clear();



    TIMSK |= 0x01; //Timer Interrupt freigeben

    sei(); //Alle Interrupts einschalten

    while(1) //endlosschleife
    {
    Tasten = Get_Tasten();


    sprintf(zeile,"Zeit=%02i:%02i:%02i,%02i",std,min,s ec,hs);
    Disp_write_xy(0,0,zeile);


    }
    }


    danke im voraus!

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    27.06.2006
    Beiträge
    79
    hallo,

    also erstmal solltest du das SIGNAL durch ISR ersetzen - SIGNAL ist veraltet.

    Die Funktion sei() schaltet die Interrupts ein. Ohne diesen Befehl werden die Interrupts nicht ausgelöst. Intern werden wohl einfach paar Bits in ein Register geschrieben. Um es für jeden µC zu vereinheitlichen gibts dann halt die Funktion sei().

    mfg blan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8
    ah danke! und ws mir auch noch komisch vorkommt ist das hier niergedwo ein tccr gesetzt wird! und anscheinend trotzdem eine vorteilung stattfindet!?
    woran kann das liegen?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    27.06.2006
    Beiträge
    79
    welchen µC verwendest du denn?
    ich könnte mir vorstellen, dass das Register TCCR einfach schon bestimmte Bits gesetzt hat und die den prescaler setzen - praktisch so default-zustände. dazu muss man ein blick ins datenblatt werfen.

    mfg blan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8
    einen atmega128!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.06.2006
    Beiträge
    79
    also im datenblatt für den atmega128 auf der seite 103-105 steht, dass alles bits mit 0 initalisiert werden. ein prescaler mit 0 stoppt den timer - er sollte also garnicht erst laufen.

    edit:
    Code:
    TIMSK |= 0x01;
    die codestellt gefällt mir auch nicht. korrekt sollte es so aussehen:

    Code:
    TIMSK |= (1 << TOIE0);
    ein wichtiger grundsatz bei der programmierung lautet: never use magic numbers.

    mfg blan

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8
    heist das also wen ich hier einen vorteiler setzten würde würde der timer gar nicht laufen? und läuft er dann in meinem programm von haus aus mit 4096ms?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    27.06.2006
    Beiträge
    79
    Zitat Zitat von humma6
    heist das also wen ich hier einen vorteiler setzten würde würde der timer gar nicht laufen? und läuft er dann in meinem programm von haus aus mit 4096ms?
    nein, wenn du keinen prescaler setzt dann läuft der timer überhauptnicht. außerdem kommt es noch draufan wie groß deine taktfrequenz ist. wirf doch ein blick in das datenblatt dort ist alles wunderbar beschrieben.

    mfg blan

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8
    also würde das funtionieren?

    unsigned int us; // Zeit in Microsekunden
    unsigned int hs;

    SIGNAL(SIG_OVERFLOW0) //Aufruf alle 4.096ms
    {
    // user code here
    us += 4096;
    if(us >= 10000) //0.01s sind abgelaufen
    {
    ++hs;
    us = us % 10000;
    }

    }

    int main( void )
    {

    TCCR0 |= 0b00000110; //prescaler auf 256 setzten

    TIMSK |= 0x01; //Timer Interrupt freigeben

    sei(); //Alle Interrupts einschalten

    while(1) //endlosschleife
    {
    }
    }

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2007
    Beiträge
    8
    ach und noch eine blöde frage habe ich! und zwar werden in der µc programmierung zeiger auschließlich zum ansprechen von registern benützt?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test