Hallo, ich bin neu hier und mehr oder weniger zufällig vor einigen Tagen auf dieses Forum gestoßen...für den Fall, dass diese Frage in genau dieser Form schon gestellt wurde, sorry, aber so auf beim "Überfliegen" habe ich nichts gefunden, was mir weiterhelfen konnte. Ich will mit einem Attiny13 ein Servosignal von einem Empfänger auslesen und damit in Abhändigkeit von der Servorstellung (genauer: das Drosselservo) eine Glühkerzenheizung steuern, die sich bei geringer Motordrehzahl zunehmend dazuschaltet. Die Regelung funktioniert auch schon, wenn ich die Eingabe über +/- Taster vornehme. Um das ganze über den Empfänger zu steuern habe ich also eine ISR geschrieben, die über den Timer die Impulslänge misst...und da fängt das Problem schon an :) Ich schau jetzt schon ein paar Stunden in den Code und kann die Ursache, dass die ISR nicht Triggert nicht sehen. Die Register sehen folgendermaßen aus: (Takt ist 4,8Mhz) PCMSK |=(1<<PCINT4); GIMSK |=(1<<PCIE); sei(); Und das ist die ISR: ISR(PCINT_vect) { if (PINB>=16) { TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); TCCR0A = (0<<WGM01)|(0<<WGM00)|(0<<COM0A1)|(0<<COM0A0); TCNT0=0; while(PINB>=16) {} temp=TCNT0; } } Grüße Florian
Ist zwar schon ein paar Tage her, aber weil noch keiner geantwortet hat melde ich mich mal. Du willst also auf bestimmte Servostellungen reagieren. Dazu könntest Du Die mal mein Schaltmodul mit Tiny15 ansehen und an Deine Ansprüche anpassen. http://www.hanneslux.de/avr/mobau/schaltmo/schaltmodul.html Viel Erfolg... ...
> if (PINB>=16) { > TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); > TCCR0A = (0<<WGM01)|(0<<WGM00)|(0<<COM0A1)|(0<<COM0A0); > TCNT0=0; > while(PINB>=16) {} > temp=TCNT0; Dein Controller hängt 1-2ms in der ISR fest. Das ist nicht wirklich schön... Guck lieber nach, welchen Pegel der Pin hat (kann man schön mit "if (PINB & 16)..." machen.), und entscheide dann, ob du den Timer startest oder ihn ausliest. Also so: ISR(PCINT_vect) { if (PINB & (1<<4) { // steigende Flanke detektiert => Timer starten TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00); TCCR0A = (0<<WGM01)|(0<<WGM00)|(0<<COM0A1)|(0<<COM0A0); TCNT0=0; } else { temp=TCNT0; Flags |= PulsendeFlag; } } Flags ist dabei eine Variable, in der man Bits setzen kann, wenn man sich einen bestimmten Zustand merken will und zwischen verschiedenen Programmteilen (sehr kleine) Informationen austauschen will. Im Hauptprogramm kann man dann ganz einfach mit "if (Flags & PulsendeFlag)..." herausfinden, ob ein Impuls aufgetreten ist - natürlich sollte man dann per "Flags &= ~PulsendeFlag;" die Flag zurücksetzen, damit man auch weitere Pulse ausmessen kann...
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.