Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer1 ATmega32


von Hannes H. (hansl_)


Lesenswert?

Hallo Leute :)

Ich versuche zurzeit meinen Timer des ATmega32 in Betrieb zu bekommen.
Ich würde gerne an den Pin T1 einen externen Clock anhängen und bei 
jeder positiven Flanke soll zum Beispiel auf PORTA ein LED aufleuchten.
Hier mein Source Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <util/delay.h>

void long_delay(uint16_t ms) {
    for(; ms>0; ms--) _delay_ms(1);
}

int main(void)
{
  TIMSK = (1<<TOIE1);

  TCCR1B = (1<<CS12) | (1<<CS11) | (1<<CS10);

  sei();
  while(1)
  {
  }
}

ISR(TIMER1_CAPT_vect)
{
  DDRA=0xFF;
  PORTA=0xFF;
  long_delay(250);
}




Was mache ich falsch? Bitte um Hilfe.

mfg
Hannes

von Karl H. (kbuchegg)


Lesenswert?

Hannes Höttinger schrieb:

> int main(void)
> {
>   TIMSK = (1<<TOIE1);

Aha. Overflow Interrupt Enabled


> ISR(TIMER1_CAPT_vect)
> {

Wieso auf einmal Capture?
Du hast den Overflow freigegeben!


PS: Die gewählte Aufgabenstellung ist so nicht allgemeingültig machbar. 
Du kannst bei einem Timer nur auf bestimmte Ereignisse einen Interrupt 
legen. 'Timerwert hat sich verändert' gehört leider nicht dazu. Man kann 
natürlich mit einem Compare immer auf den nächsten Zählerwert triggern 
lassen und in der ISR den Comparewert um 1 erhöhen. Nur geht das 
natürlich nicht bis allzuhohen Frequenzen, weil ja die ISR auch Zeit 
braucht in der sich am Timereingang möglichst nichts tun sollte.

von Hannes H. (hansl_)


Lesenswert?

Ich möchte ja nicht einen Interrupt auf Timerwert hat sich verändert 
legen sondern einfach zum Beispiel wenn eine positive Flanke kommt den 
Timerwert um 1 erhöhen.
Das wäre schon möglich oder?
Würde das mit dem T1 Pin funktionieren oder benötige ich hier den ICP 
Pin?

mfg
Hannes

von Karl H. (kbuchegg)


Lesenswert?

Hannes Höttinger schrieb:
> Ich möchte ja nicht einen Interrupt auf Timerwert hat sich verändert
> legen sondern einfach zum Beispiel wenn eine positive Flanke kommt den
> Timerwert um 1 erhöhen.
> Das wäre schon möglich oder?

Das wäre möglich.

Aber du hattest ja auch noch den Zusatz, dass du bei jeder positiven 
Flanke auch noch eine LED aufleuchten soll. Und da hilft dir der Timer 
nichts (oder nur sehr bedingt) :-)

> Würde das mit dem T1 Pin funktionieren oder benötige ich hier den ICP
> Pin?

Was willst du eigentlich mit dem Capture?
Stellt den Prescaler so ein, dass der externe Takt den Timer antreibt 
und gut ists.

von Hannes H. (hansl_)


Lesenswert?

Das heißt ich stell einfach das hier ein:

 TCCR1B = (1<<CS12) | (1<<CS11) | (1<<CS10);

und leg mal einen Rechteck an T1 an?
So sollte es klappen? Also das bei jeder positiven Flanke TCNT1 erhöht 
wird.

Wie könnte die Lösung mit dem LED ausschaun?

Schonmal danke für deine Hilfe :)

mfg
Hannes

von Karl H. (kbuchegg)


Lesenswert?

Hannes Höttinger schrieb:

> Wie könnte die Lösung mit dem LED ausschaun?

Das Signal nicht nur an T1 legen sondern auch an einen Interrupt 
Eingang. zb INT0

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.