16 bit timer

Gast #1275505
hallo,

ich habe mal das folgende programm geschrieben:
1
int main()
2
{
3

4
  //prescaler einstellen
5
  TCCR0 |= (1 << CS01);
6

7
  TCCR1B |= (1 << CS11);
8
  
9
  TCCR2 |= (1 << CS21);
10

11

12
  //timer auf fast pwm mode stellen
13
  TCCR0 |=  (1 << WGM00);
14

15
  TCCR1A |= (1 << WGM10);
16
  TCCR1B |= (1 << WGM12);
17

18
  TCCR2 |= (1 << WGM20);
19

20

21
  //compare output mode 
22
  TCCR0 |= (1 << COM01);
23

24
  TCCR1A |= (1 << COM1A1) | (1 << COM1B1);
25

26
  TCCR2 |= (1 << COM21);
27

28

29
  //hiermit wird der gewünschte pwm wert eingestellt
30
  OCR0 = 0;
31

32
  OCR1A = 0;
33

34
  OCR2 = 0;
35

36

37
  //pins als ausgänge definieren
38
  // PD5 gehört zu timer1, PD7 zu timer2, PB3 gehört zu timer0
39
  DDRD |= (1 << PD5) | (1 << PD7);
40
  DDRB |= (1 << PB3);
41

42
OCR0 = 0;
43
OCR1A = 0;   //UM DIESE STELLE HIER GEHT ES!!!
44
OCR2 = 0;

und zwar weise ich dem OCR1A den wert 0 zu aber die led die am ausgang 
angeschlossen ist ist nicht komplett aus, sondern glimmt noch ein 
bisschen. zu erwähnen ist noch das es sich beim timer 1 um einen 16 bit 
timer handelt. die anderen 2 timer gehen schön auf null wenn ich ihnen 
den wert 0 zuweise. der controller ist ein atmega32. jetzt meine frage: 
warum geht der 16 bit timer nicht komplett auf null, die 8 bit timer 
aber schon? habe ich da irgendwas falsch eingestellt?
Gast
Du betreibst in Timer in Mode5, d.h. 8 Bit fast PWM.
Da bleibt immer ein Pik stehen.

Datenblatt Modes Timer1
1
The extreme values for the OCR1x Register represents special cases when generating a PWM
2
waveform output in the fast PWM mode. If the OCR1x is set equal to BOTTOM (0x0000) the output
3
will be a narrow spike for each TOP+1 timer clock cycle. Setting the OCR1x equal to TOP
4
will result in a constant high or low output (depending on the polarity of the output set by the
5
COM1x1:0 bits.)

So kann der Timer kein "echtes" Low/High erzeugen.

Evtl. Pin drehen (Set statt Clear) und Wert invertieren ~0 (=255).

guß avr
Gast
das hört sich erstma kompliziert an....was muss ich denn dann an der 
konfiguration des timers ändern?
prescaler bleibt oder?
fast pwm mode auch oder?
der output compare mode muss geändert werden oder?

gibt es einen avr mit drei 8 bit timern?

danke für antworten

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.