-
        

Ergebnis 1 bis 10 von 10

Thema: ATMega2560(Modul), 32 kHz-Quarz an TOSC: will nicht.

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    ATMega2560(Modul), 32 kHz-Quarz an TOSC: will nicht.

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Moin.

    Wieder mal ein neues Problem. An nem ATMega2560-Modul (von Robotikhardware) ist ja an TOSC1/TOSC2 ein 32768Hz-Uhrenquarz. Hab jetzt versucht, den für die Uhr zu verwenden, was aber nicht klappt.

    Hier die relevanten Codeteile:
    Code:
    void Clock_Start(ui8_t timer)
    {
      TIMSK2 |= (1<<TOIE2);
    }
    
    void Clock_Init(void)
    {
      TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2));    // Disable any interrupts from Timer 2
      ASSR |= (1 << AS2);                                 // Select 32768 Hz Clock
      TCCR2A = 0;                                         // Standard timer (No Counting, No PWM)
      TCCR2B = 0 | (1<<CS22) | (1<<CS20);                 // Prescaler = 128
      TCNT2 = TCNT2_REL;                                  // Reload
      while(ASSR & ((1<<TCR2BUB)|(1<<TCR2AUB)|(1<<TCN2UB)));    // wait until clock has switched
      TIFR2 |= ((1<<OCF2A)|(1<<OCF2B)|(1<<TOV2));         // Clear Interrupt flags
      ONBOARD_LED_DDR |= (1 << ONBOARD_LED_PIN);
    }
    
    ISR (SIG_OVERFLOW2)
    {
      TCNT2 = TCNT2_REL;
      ONBOARD_LED_PORT ^= (1 << ONBOARD_LED_PIN);
    }
    Das Programm selbst bleibt bei der "while"-Anweisung stehen; ohne das while läuft zwar der Rest vom Programm; die ISR wird jedoch nicht angesprungen (was man sonst an einer blinkenden LED sehen würde)

    Sieht hier jemand nen Fehler?

    mfG
    #ifndef MfG
    #define MfG

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    ...
    TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); // Disable any interrupts from Timer 2
    ...
    die ISR wird jedoch nicht angesprungen
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Naja, eigenltlich wärs ja logisch, dass in der Main nacheinander Clock_Init() und Clock_Start() aufgerufen werden.
    In der Clock_Start() wird TOIE2 wieder freigegeben.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Naja, eigenltlich wärs ja logisch, dass in der Main nacheinander Clock_Init() und Clock_Start() aufgerufen werden.
    In der Clock_Start() wird TOIE2 wieder freigegeben.
    Tja, logisch wäre es schon. Das bedeutet aber nicht, dass es auch tatsächlich so ist. Ich kann ja nicht Hellsehen. Und so weiß ich z.B. auch nicht, ob du die Interrupts global freigeschaltet hast.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Es folgt zuerst _Init, dann_Start; Interrupts sind global freigeschaltet.
    Aber wie schon gesagt, die relevanten Teile sind oben angegeben, d.h. es muss irgendwo in der dortigen Bitschubserei der Register haken, dass dort eben ein nötiges Bit fehlt oder ein unnötiges Bit gesetzt ist.

    Wird statt dem Quarz an TOSC1/2 der Systemtakt verwendet (also "normaler" Timer) dann gehts ja.
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    die relevanten Teile sind oben angegeben
    Nein, nicht wirklich. Wie ist z.B. TCNT2_REL definiert?
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Die Definition dieser "Variable" ist in dem Fall 0; da der Interrupt aber garnicht erst auftritt, ist der Wert ja egal. Würde er auftreten, wäre das mit 0 halt die max. Zählweite mit den übrigen Einstellungen.
    #ifndef MfG
    #define MfG

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Und auch keinerlei Warnungen vom Compiler? Z.B.:
    In function 'ISR':
    warning: type of '__vector_15' defaults to 'int'
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Naja, "leider" nicht; dann hätt ich ja zumindest nen Anhaltspunkt. Aber der Code lässt sich fehlerfrei kompilieren...
    #ifndef MfG
    #define MfG

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Bleibt eigentlich nur ein Hardware-Problem.
    Schwingt der Quarz überhaupt?
    MfG
    Stefan

Berechtigungen

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