ATtiny25/45/85: Timer0 als Taktquelle des USI: Fehler im Datenblatt?

OP #3202982
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
Gast
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
OP
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.
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.
Gast
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
OP
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?
Gast
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
OP
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.
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.
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.