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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.