Hallo ich möchte an einem Attiny 841 mit dem Timer0 oder 1 oder 2 weinen Servo mit PWM steuern. Habe mir dazu das DB genommen und versucht es zu verstehen. Der Timer 0 (8 Bit) ist relativ leicht. Nach der Tabelle 11.8 kann ich mit - TCCR0A - WGM 00 und WGM 01 - TCCR0B - WGM 02 auswählen und dadurch die gewünschte Einstellung vornehmen. Die Timer 1 und 2 (16 Bit) kann ich nach den Tabellen 12.5, 12.12.1 und 12.12.2 einstellen. - TCCR1A - WGM 11 und WGM 10 - TCCR2A - WGM 21 und WGM 20 TCCR1B |= (1 << WGM12); // Modus einstellen (CTC) So weit klar. In der Tabelle 12.5 sind die verschiedenen Betriebsarten für die Timer 1 und 2 angegeben. Es sind dabei Normal, CTC und PWM mehrfach angegeben. Wie kann ich für einen gwählten Timer die gewünschte Betriebsart einstellen? LG Fritz
Hallo Fritz, mache dir eine Liste der/ aller Register für die Timer/ Zähler und den möglichen Modi. Dann findest Du über die Bitname in den Registern, eine weg zur Konfiguration der Teiler, Modi und PWM Portpins. Denke auch an die "TOCPMSA1 and TOCPMSA0 – Timer/Counter Output Compare Pin Mux Selection Registers", ohne die keine Routing der Pins möglich ist! Table 12-7. "Selecting Timer/Counter Compare Output for TOCCn Pins" Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet.pdf
Fritz schrieb: > So weit klar. In der Tabelle 12.5 sind die verschiedenen Betriebsarten > für die Timer 1 und 2 angegeben. Es sind dabei Normal, CTC und PWM > mehrfach angegeben. Hallo, Table 12-5. Waveform Generation Modes Ist für Timer1 und Timer2 gültig. Nur die Register und Bitnamen sind anzupassen! Tipp man muss alle Spalten miteinander vergleichen! Beispiel Mode 4: CTC (Clear Timer on Compare) TOP: OCRnA, Update: ... Mode 12: CTC (Clear Timer on Compare) TOP ICRn, Update: ... Die Register für Timer1: OCR1A oder ICR1 Die Register für Timer2: OCR2A oder ICR2 Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet.pdf Ok?
Die Einstellung müsste sein: TCCR1B - WGM 12 für Timer 1 CTC Wenn ich Normalen Modus verwenden möchte brauchte ich keine Eunstellung vornehmen, das beim Start alles auf "0" steht. Karl M. schrieb: > Beispiel > Mode 4: CTC (Clear Timer on Compare) TOP: OCRnA, Update: ... > Mode 12: CTC (Clear Timer on Compare) TOP ICRn, Update: ... Das mit OCRnA und ICRn habe ich nicht verstanden. Die Tabelle 12.7 ist garnicht klar. Was mache ich mit der? Ausgabe Pins einstellen? Noch eine Frage dazu:
1 | ISR(TIMER1_COMPA_vect) |
2 | {
|
3 | PORTA ^= (1 << PINA0); // PIN A0 toggeln |
4 | }
|
Ich habe das Toggeln eines Pins bisher mal so gemacht. Es geht so. Habe in der ISR Timer_COMPA_vect drin. Bei anderen ICs - Timer gibt es eine Tabelle welche Ti.. gibt und welcher was macht. Bisher nicht gefunden oder überlesen.Kennt jemand die Nr dazu?
Hallo, die Namen stehen im Datenblatt dort wo die Pinbezeichnungen ums Gehäuse dokumentiert ist. Meistens am Anfang des Manuals. Auf Grund des Pin Routing Features stehen dort aber nicht Bezeichnungen wie OCnA oder OCnB, sondern alle Routingpins mit TOCCn. Die Routingtabelle 12-7 steht dort an der Stelle für alle Timer. Jeder Timer hat seine Spalte. Alle Timer haben demnach 8 Routingeinstellmöglichkeiten. Das heißt weiterhin das man zum Bsp. für Timer 1 nur das 0.Bit setzen muss für seinen gewünschten Routingpin TOCCn. Das 0. Bit wäre TOCCnS0 Das 1. Bit wäre TOCCnS1 Bsp. du möchtest den Hardwaretimerpin OC1A auf den Pin TOCC7 legen, dann musste das 0. Bit Namens TOCC7S0 setzen. Den Bitnamen suchste in der Registerübersicht darüber und findest ihn im Register TOCPMSA1 auf Bit 6. Danach musste diesen noch separat als Ausgang freigeben. Bsp. inkl. Pinrouting
1 | /*
|
2 | * µC: ATtiny841 mit internen 8MHz Oszillator
|
3 | */
|
4 | |
5 | |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | |
9 | #define F_CPU 8000000UL // Systemtakt in Hz
|
10 | |
11 | |
12 | /* *** Funktion Deklarationen *** */
|
13 | void set_Timer1(); |
14 | |
15 | int main(void) |
16 | {
|
17 | DDRA = (1 << PA4); // Timer1-Pin TOCC3 Ausgang |
18 | |
19 | set_Timer1(); |
20 | sei(); // Interrupts einschalten |
21 | |
22 | while (1) |
23 | {
|
24 | |
25 | }
|
26 | }
|
27 | |
28 | |
29 | /* *** Funktionen *** */
|
30 | |
31 | void set_Timer1() // CTC, Mode 4 |
32 | {
|
33 | TCCR1A = 0; // Reset TCCR1A Register |
34 | TCCR1B = 0; // Reset TCCR1B Register |
35 | TIMSK1 = 0; // Reset TIMSK1 Register (disable Timer Compare Interrupts) |
36 | TCNT1 = 0; // Start 0 |
37 | OCR1A = 39; // TOP Wert bestimmt mit Prescaler Takt, 100kHz |
38 | TOCPMSA0 = (1<<TOCC3S0); // OC1A Select Routing auf TOCC3 Pin |
39 | TOCPMCOE = (1<<TOCC3OE); // TOCC3 Output enable |
40 | TCCR1A = (1<<COM1A0); // Toggle OC1A Pin on compare match |
41 | TCCR1B = (1<<WGM12) | (1<<CS10); // CTC, Prescaler 1 |
42 | }
|
Und für den gewünschten Timermode suchste dir in der Tabelle die erforderlichen WGM Bits zusammen und schaust in welchen Registern du diese setzen musst. Das kann sich durchaus auf 2 Register (A/B) verstreuen.
Danke für deine Info Bleibt noch die Frage nach den Timer. Meine diese: TIMER1_COMPA_vect Habe vor einiger Zeit mal eine Aufstellung dazu gesehen. Leider vergessen wo.
Meinte das hier aus dem AVR Studio: - Timer0_OVF_vect - Timer1_COMPA_vect - Timer2_CAPT_vect - Timer2_CAPT_vect_num usw.
Hallo, alle möglichen Interrupt Vectoren stehen im Manual Kapitel 9. Allerdings stimmt die Schreibweise nicht. Das ist der einzigste Patzer in allen Atmel Manuals wo die Schreibweise von der benötigten abweicht. Entweder denkt man sich das _vect dazu oder schaut im µC Header (iotn841.h) nach. Der schnellste Weg dorthin ist irgendeinen Registernamen in AS markieren und die Implementierung aufrufen.
Veit D. schrieb: > TCCR1A = 0; // Reset TCCR1A Register > TCCR1B = 0; // Reset TCCR1B Register > TIMSK1 = 0; // Reset TIMSK1 Register (disable Timer Compare > Interrupts) > TCNT1 = 0; // Start 0 Warum müssen die Register rück gesetzt werden? Bei starten sind die doch sowieso auf 0.
Hallo, das ist nur eine Angewohnheit vom Arduino programmieren. Muss man 'hier' eigentlich nicht machen. Eigentlich deshalb, weil es beim erforschen der Timer geholfen hat, wenn man zur Laufzeit die Timer Einstellungen ändert. Gesundes Neues.
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.