Hallo,
bin mir sicher das alles stimmt, aber irgendwas muß ich übersehen.
Gehäuse Pin 5 (PB2) oder 7 (PA6) sollte eigentlich mit 500Hz takten.
Macht er jedoch nicht.
Warum?
Bin jedoch nicht sicher ob das überhaupt die richtigen Pins sind vom
OC1A.
Im Datenblatt finde ich keinen Namen mit Pin Funktion OC1A. Habe nur ein
widersprüchliches Pinout gefunden. Aber selbst wenn ich Port.A und
Port.B komplett auf Ausgang setze tut sich nichts.
ATtiny 841
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
#define F_CPU 8000000UL
5
6
/* *** Funktion Deklarationen *** */
7
voidset_Timer1();
8
9
10
intmain(void)
11
{
12
//DDRB |= (1 << PA6); // Timer-Pin OC1A Ausgang
13
DDRA=0xFF;
14
DDRB=0xFF;
15
set_Timer1();
16
17
while(1)
18
{
19
20
}
21
}
22
23
24
/* *** Funktionen *** */
25
26
voidset_Timer1()// CTC, Mode 4
27
{
28
cli();// Interrupts ausschalten
29
TCCR1A=0;// Reset TCCR1A Register
30
TCCR1B=0;// Reset TCCR1B Register
31
TIMSK1=0;// Reset TIMSK1 Register
32
TCNT1=0;// Start 0
33
OCR1A=624;// TOP Wert bestimmt mit Prescaler Takt, 500Hz
34
TCCR1A=(1<<COM1A0);// Toggle OC1A Pin on compare match
So wie ich das auf den ersten Blick dem Datenblatt entnehme, musst du
auch das Timer/Counter Output Compare Pin Mux Selection Registers
entsprechend setzen und mit Timer/Counter Output Compare Pin Mux
Channel Output Enable auch aktivieren.
Kapitel 12.12.4 und 12.12.5 im Datenblatt.
Erst dann wirst du Signale an den TOCCx-Pins sehen können.
Der Tiny841 hat einen etwas andere Timer als üblich.
U.a. kann und muss man das Signal auf einen tatsächlichen Pin routen.
Die betreffenden Register: TOCPMxx
Hi
>Im Datenblatt finde ich keinen Namen mit Pin Funktion OC1A. Habe nur ein>widersprüchliches Pinout gefunden. Aber selbst wenn ich Port.A und>Port.B komplett auf Ausgang setze tut sich nichts.
Wie wäre es mit dem Ausgangsmultiplexer:
Table 12-7. Selecting Timer/Counter Compare Output for TOCCn Pins
auf S.116?
MfG Spess
Hallo,
das habe ich wirklich nicht gelesen. Dachte kennste einen kennste alle,
aber ne, beim ATtiny gibts was neues. Scheint ein Feature zu sein zur
freien Pinauswahl. Auch nicht schlecht.
Danke für den Hinweis. Schau ich mir genau an.
Hallo,
so ganz blicke ich noch nicht durch.
Freie Pinwahl hat man erstmal nicht wie ich dachte.
Ich muß also im Register TOCPMSA0 das Bit TOCC1S1 aktivieren.
1
TOCPMSA0=(1<<TOCC1S1);// OC1A Select
Aber was macht das TOCPMCOE Register?
Vielleicht
1
TOCPMCOE=(1<<TOCC1OE);
Irgendwie alles mehr verwirrend als was es bringt?
Den Pin PA2 muß ich ja dennoch extra auf Ausgang setzen.
Was hat die ganze Selektiererei für einen Vorteil?
Hallo,
okay, bis auf das hier habe/hatte ich das so.
TOCPMSA0 = (1<<TOCC1S1); // OC1A Select
Habe es geändert und sehe 514Hz statt 500Hz
TOCPMSA0 = (1<<TOCC1S0); // OC1A Select
Nur warum das Bit TOCC1S0 und nicht TOCC1S1 für OC1A?
In der Tabelle auf Seite 116 steht OC1A doch in Spalte Bit 01?
Da komme ich nicht mit.
Oder müßte das besser TOCC1S01 heißen?
1
voidset_Timer1()// CTC, Mode 4
2
{
3
cli();// Interrupts ausschalten
4
TCCR1A=0;// Reset TCCR1A Register
5
TCCR1B=0;// Reset TCCR1B Register
6
TIMSK1=0;// Reset TIMSK1 Register
7
TCNT1=0;// Start 0
8
OCR1A=124;// TOP Wert bestimmt mit Prescaler Takt, 500Hz
9
TOCPMSA0=(1<<TOCC1S0);// OC1A Select
10
TOCPMCOE=(1<<TOCC1OE);// TOCC1 Output enable
11
TCCR1A=(1<<COM1A0);// Toggle OC1A Pin on compare match
Du musst offenbar in den TOCPMSA0/1 Registern den Timeroutput auf den
dazugehörigen Pin routen und anschließend noch im TOCPMCOE Register den
Ausgang freigeben... Nettes kleines Feature
Veit D. schrieb:> In der Tabelle auf Seite 116 steht OC1A doch in Spalte Bit 01?
Da steht 01. Die 0 steht für das TOCC1S1 Bit und die 1 für das TOCC1S0
Bit.
Hallo,
vielleicht noch als Ergänzung,
die Pins heißen TOCCn und sind unter S.63f
/Table 10-3. Alternative Functions of Port A/
aufgeführt.
Für Timer1 OC1A ergibt sich dann aus S.116f
/Table 12-7. Selecting Timer/Counter Compare Output for TOCCn Pins/
TOCC1 -- OC1A für TOCC1S[1:0] = 0b01
TOCC3 -- OC1A für TOCC3S[1:0] = 0b01
TOCC5 -- OC1A für TOCC5S[1:0] = 0b01
TOCC7 -- OC1A für TOCC7S[1:0] = 0b01
Über das Register TOCPMCOE muss dann noch einer der TOCCn Pins
eingeschaltet werden:
Ich muss sagen ich finde die neuen Tiny x41 echt cool, SPI kann man
ummappen, Timer kann man ummappen und der ADC ist auch mit mehreren
internen Referenzen ausgestattet. "Echtes" USART und SPI sind auch toll.
Bei mir ersetzt er den Tiny x4 auf jeden Fall in der Bastelkiste.
EDIT: n echtes TWI hat er ja auch noch
Hallo,
verstehe es immer noch nicht.
Die Datenblätter werden scheinbar undurchsichtiger.
Es gibt doch insgesamt 2 Bits. Für 00, 01, 1x
Und OC1A steht in Spalte 01.
Verstehe immer noch nicht wie man dann auf die 0 kommt.
Hallo,
ich hänge nochmal die "nackte Tabelle" ran zum einmalen für euch.
Vielleicht verstehe ich das dann besser.
Edit:
gut, dass umlegen der Timer Ausgänge auf andere Pins habe ich
geschnallt.
Das geht ganz gut aus der Tabelle hervor.
Nur wie kommt man auf 0 in Zeile TOCC1 für OC1A.
Wenn OC1x in Spalte 01 steht?
@ Karl M.
Genauso bin ich auch rangegangen. Ist aber falsch wie sich
herausstellte.
ich muß TOCC1S0 schreiben damit es funktioniert.
Hallo,
nochmal.
Eigentlich steht im Tabellenkopf TOCCnSxx.
xx steht für ... Bit1 Bit0
Jetzt lese ich in der Spalte für OC1A oben "01".
Heißt für mich Bit 0 muß auf 1 gesetzt werden.
Ist aber falsch, dann taktet nichts.
Setze ich alles auf 0 taktet es wie gewünscht.
Kommt jemand hinter diese Logik?
Zudem Atmel Studio nur TOCC1S0 oder TOCC1S1 kennt, also farbig markiert.
Die rechte Spalte für OC2A müßte ja 10 oder 11 sein, kennt es aber
nicht.
Außerdem ist im Register TOCPMSAx jeweils immer nur eine Bitstelle
vorgesehen. Wie will man überhaupt den 3. Timerausgang aktivieren laut
Tabelle unten drunter rechte Spalte?
Veit D. schrieb:> Zudem Atmel Studio nur TOCC1S0 oder TOCC1S1 kennt
Nö. Das kennt TOCCnS0 und TOCCnS1 mit n=0..7.
> Die rechte Spalte für OC2A müßte ja 10 oder 11 sein, kennt es aber> nicht.
Was meinst du mit "kennt es nicht"?
> Außerdem ist im Register TOCPMSAx jeweils immer nur eine Bitstelle> vorgesehen. Wie will man überhaupt den 3. Timerausgang aktivieren laut> Tabelle unten drunter rechte Spalte?
OMG, du hast das Prinzip absolut nicht kapiert, dabei ist es wirklich
ganz einfach.
Also: Es gibt acht Port-Pins, über die man die insgesamt sechs
OC-Signale der drei Timer schicken kann. Da es vielfältig einstellbar
ist, welches davon auf welchem Pin landen soll, gibt es das klassische
Mapping der "alternate port functions" (OCnX) mit n: Timernummer und
X:OC-Kanal) hier nicht, statt dessen werden acht symbolische Signale
eingeführt, nämlich TOCCn. Es gibt eine direkte unveränderliche
Beziehung zwischen jedem TOCCn-Signal und dem dazu gehörenden Port-Pin.
Die findet man sowohl in den Pinouts ab Seite 2 des DB als auch in
Tabellenform ab Seite 63 für Port A bzw. ab Seite 68 für PortB.
Du wolltest im OP entweder PB2 oder PA6 haben, ich vereinfache mir mal
die Erklärung und lege fest, dass du PA6 haben willst. Das entspricht
nach o.g. Quellen dem symbolischen OC-Signal TOCC5.
Nachdem du das nun weisst, gehst du in die MUX-Tabelle, die du schon
gefunden hast und dort in die entsprechende Zeile für TOCC5. Da siehst
du, welche realen Timersignale du auf TOCC5 (und damit auf PA6) routen
kannst. Möglich ist an diesem Pin also jeweils OC-Kanal A der drei
vorhandenen Timer (Kanal B ginge nicht). In deinem OP wolltest du OC1A
haben, das geht also.
> Jetzt lese ich in der Spalte für OC1A oben "01".
Genau. Du musst also TOCC5S1:TOCC5S0 in TOCPMSA1 auf 01 setzen. Beachte:
das sind nicht Bit 0 und 1 in diesem Register, sondern die Bits 3 und
2!!!
Zusätzlich musst du auch noch TOCC5OE in TOCPMCOE setzen.
Also kommen für das Mapping folgende Anweisungen raus:
TOCPMSA1 |= (1<<TOCC5S0)
TOCPMCOE |= (1<<TOCC5OE)
> Außerdem ist im Register TOCPMSAx jeweils immer nur eine Bitstelle> vorgesehen. Wie will man überhaupt den 3. Timerausgang aktivieren laut> Tabelle unten drunter rechte Spalte?
Wenn du meine Erklärung verstanden hast, solltest du dir die Frage jetzt
selbst beantworten können. Nur noch als Anmerkung: Man kann alle sechs
OC-Kanäle gleichzeitig nach aussen führen. Und: man kann auch einen
einzelnen Kanal auf bis zu vier Pins routen. Und nein, das ist nicht
nutzlos, denn damit kann man nämlich den vierfachen Strom treiben...
c-hater schrieb:>> Jetzt lese ich in der Spalte für OC1A oben "01".>> Genau. Du musst also TOCC5S1:TOCC5S0 in TOCPMSA1 auf 01 setzen.
Hallo Assembler Vergötterer,
genau die Schreibweise hat nun bei mir Klick gemacht.
Sieht vielleicht für euch auch nicht anders aus wie die schon
geposteten, aber für mich eben doch.
Wobei ihr aber auch zugeben müßt das diese Tabelle doof gemacht ist.
Ich meine die anderen mit Prescaler und Timer Mode versteht auch jedes
Kind auf Anhieb. Aber ich will jetzt nicht weiter meckern.
Vielen Dank das du dich nochmal erbarmt hast für die Erklärung.
Und Danke auch den anderen für die verzweifelten Mühen.
Habs jetzt gerafft.