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
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
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.
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
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.
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?
Der Timer wurde bereits genannt.
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
> ich meinte das eher so Monoflop mäßig, shoot n' forget.
Ausgang setzen, Timer starten, der nach definerter Zeit abschaltet.
mfg.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.