Forum: Mikrocontroller und Digitale Elektronik ATtiny25/45/85: Timer0 als Taktquelle des USI: Fehler im Datenblatt?


von Leo B. (luigi)


Lesenswert?

Hallo,

ich möchte bei einem ATtiny25 das USI-Modul auf möglichst hohe 
Geschwindigkeit trimmen. Bei der Gelegenheit fiel mir auf, dass im 
Datenblatt ein "TIM0 COMP" als mögliche Taktquelle angegeben ist. COMPA 
oder COMPB ist ungeklärt. Die Compare Matches kann man laut Datenblatt 
aber im CTC-Modus so einstellen (0x00), dass diese bei jedem Takt 
auftreten.
Nimmt man nun theoretisch diesen Takt als Quelle des USI, dann kann man 
das USI auch mit f_CPU takten und nicht nur mit f_CPU/4 wie angegeben. 
Das widerspricht sich ein wenig.

Nach ein wenig suche im Internet bin ich allerdings auch nicht 
wesentlich schlauer geworden. Einziger Fund ist, dass irgendjemand in 
den raum wirft, das Datenblatt hätte da einen Fehler:
Beitrag "Re: Attiny 25, USI clock vom Timer 0 compare match"

Da ich leider aktuell keinen dieser ICs bei der Hand habe, kann ich auch 
nichts ausprobieren und muss nun Fragen, ob irgendjemand da draußen eine 
Idee hat was hier richtig und falsch ist.

vielen Dank
Gruß Leo

PS: der Link zum Datenblatt ist eventuell noch interessant:
http://www.atmel.com/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf

von spess53 (Gast)


Lesenswert?

Hi

>ich möchte bei einem ATtiny25 das USI-Modul auf möglichst hohe
>Geschwindigkeit trimmen.

Und in welchem Mode (SPI, TWI, UART)?

>Nimmt man nun theoretisch diesen Takt als Quelle des USI, dann kann man
>das USI auch mit f_CPU takten und nicht nur mit f_CPU/4 wie angegeben.
>Das widerspricht sich ein wenig.

f_CPU/4 ist der maximale Bustakt bei dem ein SPI-Slave noch 
funktioniert. Wenn man zwei AVRs über SPI verbindet muss sich der Master 
daran halten.

MfG Spess

von Leo B. (luigi)


Lesenswert?

spess53 schrieb:
> Und in welchem Mode (SPI, TWI, UART)?

Der Mode ist von meiner Seite her relativ egal, ich benötige eigentlich 
nur eine Methode um einen Portpin für ein paar ns auf 1 zu setzen ohne 
dabei Prozessorlast zu verursachen. Wenn es beim Timer eine Art single 
shot gäbe wäre auch das gut.

von Peter D. (peda)


Lesenswert?

Nimmm doch einfach das Codebeispiel für F_CPU/2 aus dem Datenblatt.

Der Comprate-Match schiebt nur die Daten, erzeugt aber keinen SCK-Puls, 
d.h. eignet sich nur als SW-UART.

Als Master den SCK zu erzeugen, geht nur über 16 * Setzen des 
USITC-Bits.

von spess53 (Gast)


Lesenswert?

Hi

>Der Mode ist von meiner Seite her relativ egal, ich benötige eigentlich
>nur eine Methode um einen Portpin für ein paar ns auf 1 zu setzen

Warum sagt du das nicht gleich und faselst statt dessen von der USI rum?

Wieviel ns sollten es denn sein?

>ohne dabei Prozessorlast zu verursachen.
1
sbi PortB,Bity
2
cbi PortB,Bity

dürfte die geringste Prozessorlast haben. Erzeugt einen Impuls von zwei 
Takten. Eine andere Möglichkeit wäre Timer1, der mit bis zu 64MHz 
getaktet werden kann.

MfG Spess

von (prx) A. K. (prx)


Lesenswert?

Mit 2 OUT-Befehlen geht auch ein Puls von 1 Takt. Wobei unklar ist, 
inwieweit bei kurzen Pulsen von "ein paar ns" noch Zeit einzusparen 
wäre.

von Leo B. (luigi)


Lesenswert?

Ne das ists nicht was ich ausdrücken wollte, ich meinte das eher so 
Monoflop mäßig, shoot n' forget. Ein Byte schreiben und dann wird ein 
Puls der gewählten Dauer ausgegeben...

Aber ich habe schon ein weiteres Problem mit dem USI entdeckt. Wenn man 
es über den Timer taktet, dann stopt der Spaß nicht nach einem 
gesendeten Byte.

Es bleibt wohl wirklich nichts anderes als Anfang und Ende per Software 
zu steuern. Oder habt ihr ideen?

von (prx) A. K. (prx)


Lesenswert?

Der Timer wurde bereits genannt.

von Spess53 (Gast)


Lesenswert?

Hi

>Ne das ists nicht was ich ausdrücken wollte,

Dann drück dich endlich mal verständlich aus und erzähle was du wirklich 
machen willst.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

> ich meinte das eher so Monoflop mäßig, shoot n' forget.
Ausgang setzen, Timer starten, der nach definerter Zeit abschaltet.

mfg.

von Leo B. (luigi)


Lesenswert?

A. K. schrieb:
> Der Timer wurde bereits genannt.

Aber der kann ja kein single-shot. Daher nicht wirklich geeignet.

@Spess53 (Gast): Bist du mit dem falschen Fuß aufgestanden oder drückst 
du dich immer so streitlustig aus? Ich hatte eine frage und habe diese 
im 1. Post gestellt. Und wie die Frage aufkam ist wohl eher 
nebensächlich aber um es genau erwähnt zu haben.
Ich möchte ähnlich wie bei einem Monoflop einen Impuls an einem 
Ausgangspin eines beliebigen möglichst keinen und günstigen µC (hier 
einem AVR) erzeugen. Dieser soll abhängig von ein paar anderweitig 
gewonnenen und über 2 digitale TTL-signale übertragenen Eingangsfaktoren 
im Bereich von 250ns bis 1200ns einstellbar sein (eine Genauigkeit von 
+-50ns ist ausreichend).

Mein Gedanke dazu war ein entprechendes Byte über eine SPI-Schnittstelle 
auszugeben, sodass der Prozessor den Impuls startet und sich direkt im 
Anschluss bereits wieder anderen Aufgaben zuwenden kann. Und beim wühlen 
im Datenblatt entstand dann auch die Frage.

von Thomas E. (thomase)


Lesenswert?

Leo B. schrieb:
> A. K. schrieb:
>> Der Timer wurde bereits genannt.
>
> Aber der kann ja kein single-shot. Daher nicht wirklich geeignet.
Aber Hallo.
Du weisst nicht wie man das macht. Daher bist eher du nicht geeignet.

Table 11-2. Compare Output Mode, non-PWM Mode

mfg.

von Thomas E. (thomase)


Lesenswert?

Copy&Paste Fehler
Table 11-2. Compare Output Mode, non-PWM Mode
Richtig:
Table 11-3. Compare Output Mode, Fast PWM Mode

Ein Beispiel mit Timer2 auf einem Atmega 168. Das kann der Tiny aber 
auch.
Single Shot:
1
int main(void)
2
{
3
 //Init
4
 TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2B1); //Fast PWM
5
 OCR2B = 64;
6
 TCNT2 = 255;
7
 TIMSK2 |= (1 << OCIE2B);
8
 DDRD |= (1 << 3);
9
 sei();
10
 //---
11
12
 while(1)
13
 {
14
   if(button) TCCR0B = (1 << CS20);
15
 }
16
}
17
18
ISR(TIMER2_COMPB_vect)
19
{
20
 TCCR2B = 0;
21
 TCNT2 = 255;
22
}

Per Tastendruck wird der Timer eingeschaltet. Nach einem Takt, Überlauf 
von 255 nach 0 wird der Port, hier OC2B, eingeschaltet und nach 
Erreichen des OCR2B-Wertes abgeschaltet. Gleichzeitig kommt der 
OCIE2B-Interrupt und schaltet in der ISR den Timer wieder ab. Der Impuls 
darf nur nicht so lang sein, daß der Controller den Interrupt nicht 
rechtzeitig abarbeiten kann, um den Timer zu stoppen bevor der nächste 
Überlauf kommt. Die Impulsfolge ist vom Interrupt abhängig. Wenn der 
fertig ist, kann der nächste Impuls starten.

mfg.

von Leo B. (luigi)


Lesenswert?

Danke Thomas Eckmann, dein Vorschlag mit dem FastPWM ist zwar gut, war 
mir aber bekannt und da man den Timer in ner ISR wieder "deaktivieren" 
muss ist das nicht die art single-shot, die ich suche. Ich suche 
wirklich mehr so das fire and forget. Aber den non-PWM-Mode muss ich mir 
mal genauer ansehen, wie der zu bedienen ist. Wenn man den Port direkt 
auf high setzen kann und der timer setzt ihn wieder auf low, dann wäre 
das genau das was ich suche.
Wenn man den Timer allerdings erst umkonfigurieren, dann einen "Force 
Output Compare" auslösen und schließlich wieder rekonfigurieren muss, 
dann schätze ich gehen zu viele Takte drauf, sodass ich sogar mit 
weniger Prozessorlast wegkomme wenn ich den Ausgang per Software 
ansteuere und den Prozessor währenddessen blockiere.

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.