www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer1 will nicht so wie ich will


Autor: Jürgen Lechermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Forum

probier jetzt schon eine geraume Zeit rum, den Timer1 meines AT90S2313
zum laufen zu bringen.

mein Ziel ist es einen Sekundentakt mit Hilfe des Timers zu erzeugen.
Dazu habe ich micheigentlich schon mit reichlich Beispielcode aus
diesem Forum versorgt, aber dummerweise funktioniert das ganze immer
noch nicht richtig.

Hier der eigentlich recht simple Code:

#define XTAL    4000000L
#define DEBOUNCE  200L

unsigned char second;



SIGNAL (SIG_OUTPUT_COMPARE1A)
{
  static char prescaler;


/*****************************  1 second time base
*********************/
  if( --prescaler == 0 ){
    prescaler = DEBOUNCE;
    second++;        // exact one second over

    PORTD = ~PORTD;
  }
}


int main( void )
{
  DDRD = 0xFF;
  PORTD |= (1<<0);

  TCCR1B = 1<<CTC1^1<<CS10;    // divide by 1
          // clear on compare


  OCR1A = XTAL / DEBOUNCE;    // timer = 5msec
  sei();

  for(;;){
  }
}

Wie gesagt ich habe den Code größtenteils aus diesem Forum - der
Wiedererkennungswert dürfte deshalb bei dem einen oder anderen recht
hoch sein.

Mein Problem mit dem Programm: Die Interruptroutine wird anscheinend
nie ausgeführt. Weder in der Simulation (AVRStudio) noch auf meinem AVR
wird die Variable second hochgezählt und an Port D blinkt es auch
nicht.

Wär nett wenn ihr mir auf die Sprünge helfen könntet

vielen Dank
Jürgen

Autor: Sven S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal wieder ein fal von RTFM (sorry kleiner insider witz konnt ich mier
nicht verkneifen)

da fehlt noch mindestens der eintrag im TIMSK (Timer Interrupt Mask)
register.

weis jetzt nich ob noch mehr fehler drin sind aber es ist spät und ich
seh keine mehr:-)

gruss sven

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, hier zum Vergleich (Funktioniert):

// Output pins disconnected, normal operation
TCCR1A = 0;
// Teiler /8 => 1µs, Compare-Mode 4 (CTC)
TCCR1B |= _BV(WGM12)|_BV(CS11);
TCCR1C = 0;
// 1000µs = 1ms (Timer)
OCR1A = 1000;
// Startinitialisierung
TCNT1 = 0;
// Flag löschen
TIFR |= _BV(OCF1A);
// output-Compare 1A - INT enabled
TIMSK |= _BV(OCIE1A);
// Globalen Interrupt freigeben
SREG |= _BV(SREG_I);

Autor: Jürgen Lechermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch,

Sven hatte schon recht - der Fehler lag wie so oft zwischen den
Kopfhören - wieviel ein Bit manchmal ausmachen kann - jetzt läuft die
Schaltung

Danke
Jürgen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.