Zusätzlichen Timer trotz alle Timer verbraucht?

Gast #2275377
Lesenswert?

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
Persönliche Seite #2275411
Lesenswert?

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
#2275439
Lesenswert?

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.
Gast #2275458
Lesenswert?

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.
Persönliche Seite #2275530
Lesenswert?

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...
#2276551
Lesenswert?

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.
Gast #2277028
Lesenswert?

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.
Gast #2277084
Lesenswert?

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 ;-)
#2277211
Lesenswert?

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
Gast #2277433
Lesenswert?

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.
Gast #2277444
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren