Forum: Compiler & IDEs ATMEGA16 8bit-Timer Problem


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

habe folgendes Problem:
Ich möchte an einem ATMEGA16 ein Signal ausgeben und dann wieder an
einem ATMEGA16 einlesen. Um verschiedene Signale über dieselbe Leitung
schicken zu können, wollte ich das mit dem 8-Bit Timer machen. Nun habe
ich jedoch das Problem, dass am definierten Pin gar kein Signal
herauskommt! Bin um jeden Tip dankbar ^^.

MfG Stefan

von Rolf Magnus (Gast)


Lesenswert?

Deine delay-Funktion wird nicht das tun, was du erwartest, sofern du
Optimierungen einschaltest. Dann wird sie nämlich komplett
wegoptimiert. Das könnte auch dein Problem sein. Das Signal kommt
vermutlich aus dem Port raus, ist aber nur so kurz, daß du es gar nicht
bemerkst. Was hast du gegen die delay-Funktionen der avr-libc?

Übrgiens sind delay-Loops möglichst zu vermeiden. Lange
Interrupt-Funktionen auch. Die Kombination aus beidem ist natürlich
besonders zu vermeiden, da du damit den Prozessor komplett blockierst.
Für einen ersten Test oder wenn der Prozessor eh sonst nichts tun soll,
ist es aber evtl. ok.

von Stefan (Gast)


Lesenswert?

Ich will ja eigentlich 2 pulse schicken und dann den Abstand messen
(also die zeit, in der das Signal low ist).
Wie bekomme ich das am Besten hin? Den ersten Puls wollte ich ja 50000
Takte lang "high" haben, deshalb das delay.

von Dirk (Gast)


Lesenswert?

Hi,

delay's in Interrupts sollt man vermeiden bzw. garnicht anwenden.
Am besten haelt man die ISR so kurz wie moeglich.

Du solltest einfach ein flag setzen und in der Main Routine dieses Flag
abfragen.

Quik & Dirty Example:

ISR(OVF)
{
  timer_cnt++;
  if (timer_cnt == 10)
     { status_byte |= (1<<LEDON);}
}

int main(void)
{
  if (status_byte & (1<<LEDON))
  {
    // DO ANYTHING
    status_byte &= ~(1<<LEDON);
  }
}

Gruß,
Dirk

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.