Hallo, ich stehe vor dem Problem, dass ich noch einen zusätzlichen Timer bräuchte. Ich arbeite an einer Motorsteuerung mit einem ATtiny261. Der hat alle Timer bis jetzt für eine Brushlesssteuerung belegt, ich bräuchte aber noch einen, um eine weitere Aufgabe erfüllen zu können. Gibt es da Möglichkeiten über Tricks an einen 3. Timer zu kommen? Der muss nicht einstellbar sein, oder extrem feine Zeitschritt haben. Wichtig ist nur, dass seine Zeitbasis konstant ist. Ist es nicht möglich per Software iwas zu machen oder andere Tricks zB per Port-Interrupts zu mahcen? Grüße, COLUSA
Nimm doch einfach nur einen Timer und stelle ihn so ein, dass du dir alle anderen Zeiten davon per Software-Prescaler ableiten kannst. Dann brauchst du bloß 1 Timer. So habe ich auch das Timer-System in meiner Spielekonsole gelöst. Und in den Spielen kann man bis zu 32 Timer benutzen. Also anstatt: Timer0 Prescaler = Bla Timer1 Prescaler = Blubber Überlauf0: ... Return Überlauf1: ... Return Besser so: Timer0 Prescaler = 1 Überlauf0: Erhöhe Zähler0 Erhöhe Zähler1 Wenn Zähler0 = Bla Dann Zähler0 = 0; ... Wenn Zähler1 = Blubber Dann Zähler1 = 0; ... Return Sonst könntest du noch den Watchdog nehmen oder per NE555 Pin-Interrupts generieren. Gruß Jonathan
Jonathan Strobl schrieb: > Nimm doch einfach nur einen Timer und stelle ihn so ein, dass du dir > alle anderen Zeiten davon per Software-Prescaler ableiten kannst. Dann > brauchst du bloß 1 Timer. So habe ich auch das Timer-System in meiner > Spielekonsole gelöst. Und in den Spielen kann man bis zu 32 Timer > benutzen. das geht aber nicht, wenn man die Timer alle braucht, um einen Motor anzusteuern.
Ja, wenn er die Zählerwerte braucht, geht es nicht... Aber er braucht ja bloß eine weitere, konstante Zeitbasis. Da kann er ja in einem seiner Timer einen Zähler mitlaufen lassen, der das dann erledigt. Gruß Jonathan
Auch im PWM-Mode können die Timer Interrupts erzeugen, es muß nur der TOP-Wert konstant sein, d.h. die PWM-Frequenz konstant. Ansonsten geht noch den ADC frei laufen zu lassen und als Timer nehmen. Oder der Watchdoginterrupt. Peter
Dein IBM PC hat(te) nur einen Timer, und kann trotzdem beliebig viel Dinge blinken lassen und timen. Es liegt also nur an der Programmierung, nicht an der Hardwareausstattung. Meist wird argumentiert, daß aber ab einer gewissen Geschwindigkeit nicht mehr alles in Software zu machen ist. Guckt man sich solche Programme an, sieht man meist, daß die Interrupt-Bearbeitung eher mehr Rechenzeit kostet, als wenn man es ordentlich in Software implementiert hätte mit nur einem Timer.
1 | volatile unsigned long ticks = 0; |
2 | ISR(10ms_timer) { |
3 | ticks++; // alle 10ms |
4 | if((ticks%10)==0) { // alle 100ms |
5 | |
6 | }
|
7 | if((ticks%100)==0) { // alle 1000ms |
8 | |
9 | }
|
10 | ...
|
11 | ...
|
12 | }
|
>NE555 Pin-Interrupts LOL, ein NE555 lässt mein Strobo im Wohnzimmer blinken, da merkt man die ungenauigkeit im Augenwinkel, was meinste wie genau das Programm ablaufen wird... Dann musste dauernd auf irgendwelche Flags zum Synchronisieren warten... Wofür du dann auch wieder einen Timer brauchst...
manchmal reicht auch der ADC-Interrupt (wenn nicht schon verwendet)...
>RC Glied zwischen 2 Portpins. Dürfte in etwa so ungenau wie die NE555 Lösung sein, da der NE555 nur so genau ist wie R und C an ihm...
setz dir einen Tiny13 daneben, der Interruptcontroller spielt eine strippe zum 13, zum Starten/Anhalten 1,2 oder 3 Strippen zurück, die interupts auslösen können.
Vlad Tepesch schrieb: > das geht aber nicht, wenn man die Timer alle braucht, um einen Motor > anzusteuern. Ach? Warum denn nicht? Ob du nun die Register des Hardwaretimers oder irgendwelche selbstdefinierten Zählvariablen des Softwaretimers nutzt, ist recht egal.
gaast schrieb: > Ach? Warum denn nicht? Ob du nun die Register des Hardwaretimers oder > irgendwelche selbstdefinierten Zählvariablen des Softwaretimers nutzt, > ist recht egal. weil die PWM6-Mode Hardwarevariante explizit zur BLDC-Motor-Ansteuerung gedacht ist und um Längen besser ist. Ich seh aber gerade, dass Timer0 davon völlig unberührt ist. Somit sollte man auch hier eine Stabile Zeitbasis bereitstellen können.
Ja ich verwende den timer1 als pwm6 mode. timer0 ist auch belegt, da er die 30 Grad Verschiebung der Phasen im sensorless mode des BLDC Motors steuert. Inwieweit ist es denn möglich den watchdog dafür zu missbrauchen? Ich möchte ja keinen reset verursachen.
Typischer Fall von falschem µC ausgewählt. Das passiert wenn man mit Hardware / Software anfängt bevor man im Detail weiß was man so alles brauch. Gutes Beispiel wie man es nicht machen sollte.
Der Watchdog lässt sich dafür, glaube ich, nicht missbrauchen. Vielleicht doch noch der ADC?
COLUSA schrieb: > ich bräuchte aber noch einen, um eine weitere Aufgabe erfüllen zu können Was soll man dazu sagen, wenn nicht mal klar ist, wie zeitkritisch die Aufgabe ist, wie oft da was passieren soll, ob da irgendetwas synchron zum Motor passieren soll oder ob der eine Atomuhr ersetzen soll ;-)
COLUSA schrieb: > Ja ich verwende den timer1 als pwm6 mode. Dann kannst Du doch nen Interrupt verwenden: "The Timer/Counter Overflow Flag (TOV1) is set each time the counter reaches the TOP" Peter
COLUSA schrieb: > Inwieweit ist es denn möglich den watchdog dafür zu missbrauchen? Datenblatt: 8.4.2 WDTCR – Watchdog Timer Control Register Table 8-2. Watchdog Timer Configuration Peter
Nils S. schrieb: > Der Watchdog lässt sich dafür, glaube ich, nicht missbrauchen. Dann läßt Dich ein Blick ins Datenblatt aber vom Glauben abfallen. Peter
Ralph schrieb: > Typischer Fall von falschem µC ausgewählt. Nur ruhig Blut. Erstmal ins Datenblatt schauen, dann klappts auch mit dem AVR. Peter
Oder ADC Interrupt: "A normal conversion takes 13 ADC clock cycles."
1 | Interruptrate = F_CPU / ADC_Prescaler / 13 |
Peter
Peter Dannegger schrieb: > Erstmal ins Datenblatt schauen, dann klappts auch mit dem AVR. Ich sag ja gar nicht das er keinen AVR verwenden soll. Nur wenn man einen µC mit 2 Timer auswählt und später feststellt das 3 Timer gebraucht werden, dann hat man etwas falsch gemacht.
Ralph schrieb: > Nur wenn man einen µC mit 2 Timer auswählt und später feststellt das 3 > Timer gebraucht werden, dann hat man etwas falsch gemacht. Das Problem ist, daß Atmel für viele AVRs ein spezielles Timersüppchen kocht. Man kann daher nicht einfach einen ATmega nehmen, weil der nicht alle Features des ATtiny hat. Ich hätte eigentlich auch erwartet, daß ein ATmega2560 abwärtskompatibel zu kleineren AVRs wäre, aber dem ist nicht so. Peter
Wenn ich doch ein Projekt machen will, und das mit minimalem Aufwand dann sollte die Arbeitsreihenfolge doch so sein. 1. Überlegen WAS dieses Projekt alles können muss 2. Überlegen WIE das Projekt die Punkte aus 1. erfüllen kann 3. Überlegen WAS müssen meine Bauteile dafür können um 2. zu erfüllen. und DANACH fange ich an die Bauteile auszuwählen und die Software zu programmieren. Wer mit der Programmierung anfängt auf irgendetwas was da gerade rum liegt wird mit absoluter Sicherheit viel Arbeit in irgendwelche Tricks investieren müssen um fehlende Fähigkeiten der Hardware auszugleichen. Oder wird die Arbeit mehrfach machen müssen bis endlich mal alle Teile so sind das es funktioniert. Das meinte ich mit > Typischer Fall von falschem µC ausgewählt Wenn dabei raus kommt das ein AVR eben nicht passt, na dann ist das so. ==> Projektumfang ändern bis es in den AVR passt, oder mal über den Tellerrand nach einem anderen µC sehen.
Ralph schrieb: > 2. Überlegen WIE das Projekt die Punkte aus 1. erfüllen kann > 3. Überlegen WAS müssen meine Bauteile dafür können um 2. zu erfüllen. > und DANACH fange ich an die Bauteile auszuwählen und die Software zu > programmieren. Das ist etwas zu kurz gedacht, weil 2. und 3. je nach gewähltem Bauteil unterschiedlich aussehen können. Die starre Reihenfolge gibt es also nicht. Mancnmal hilft ein bisschen Kreativität, um abseits vom Main Stream eine Lösung zu finden.
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.