Forum: Mikrocontroller und Digitale Elektronik Betriebsarten beim Atinny 841-Normal,CTC,PWM


von Fritz (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

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?

von Fritz (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Veit D. (devil-elec)


Lesenswert?

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.

von Fritz (Gast)


Lesenswert?

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.

von Fritz (Gast)


Lesenswert?

Meinte das hier aus dem AVR Studio:

- Timer0_OVF_vect
- Timer1_COMPA_vect
- Timer2_CAPT_vect
- Timer2_CAPT_vect_num

usw.

von Veit D. (devil-elec)


Lesenswert?

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.

von Fritz (Gast)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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
Noch kein Account? Hier anmelden.