Dag iedereen,

Vandaag heb ik een tutorial over de ctc timermode gelezen. de gebruikte atmel in de tutorial was een MEGA16. ik heb de code wat proberen aanpassen zodat het zou werken op een attiny2313 door de datasheet er bij te halen, maar ik slaag er niet in het te laten werken.

dit is mijn code:

#include <avr/io.h> 

int main (void) 
{ 
   DDRB |= (1 << 0); // Set LED as output 

   TCCR1B |= (1 << WGM1); // Configure timer 1 for CTC mode 
   OCR0A   = 15624; // Set CTC compare value to 1Hz at 1MHz AVR clock, with a prescaler of 64 

   TCCR1B |= ((1 << CS00) | (1 << CS01)); // Start timer at Fcpu/64 

   for (;;) 
   { 
      if (TIFR & (1 << OCF1A)) 
      { 
          PORTB ^= (1 << 0); // Toggle the LED 

          TIFR = (1 << OCF1A); // clear the CTC flag (writing a logic one to the set flag clears it) 
      } 
   } 
} 

dit zijn de foutmeldingen die ik krijg

Build started 31.8.2010 at 21:27:30
avr-gcc  -mmcu=attiny2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT timer.o -MF dep/timer.o.d  -c  ../timer.c
../timer.c: In function 'main':
../timer.c:7: error: 'WGM1' undeclared (first use in this function)
../timer.c:7: error: (Each undeclared identifier is reported only once
../timer.c:7: error: for each function it appears in.)
../timer.c:8: warning: large integer implicitly truncated to unsigned type
make: *** [timer.o] Error 1
Build failed with 3 errors and 1 warnings...

volgens de waveform generation mode bit tabel moet bit 1 WGM1 nogthans 1 zijn

Iemand een idee wat ik verkeerd heb gedaan.

alvast bedankt

johan

in de datasheet vind ik een WGM10, 11, 12 en WGM13 maar geen WGM1
--> voor de ctc mode zal het dus WGM12 moeten zijn

OCR0A is een 8 bit register wat dus een maximum geeft van 255

Iemand een idee wat ik verkeerd heb gedaan.

Je hebt de datasheet niet helemaal doorgespit. >:)
Als je WGM1 omtovert in WGM01 zal je al een eind verder komen.

Overigens is het nogal ongebruikelijk/tijdrovend om alsmaar een interrupt-flag te pollen. Maak gebruik van de interrupt-routines.

@sven: WGM01? WGM10? Ah, nu zie ik het: ik liet me leiden door OCR0A en ging er van uit dat de TS met Timer0 aan de slag was. Ben voor alle zekerheid maar eens in de manual geduikeld, en zie daar tot mijn verbazing WGM0, WGM1 en WGM2 staan. Een fout van de datasheet-opsteller, dus.

@retro man:

Je hebt de datasheet niet helemaal doorgespit.

Die woorden neem ik --met het schaamrood op m'n wangen-- terug!

[Bericht gewijzigd door pros op (41%)]

Op 31 augustus 2010 21:48:19 schreef pros:
... en zie daar tot mijn verbazing WGM0, WGM1 en WGM2 staan. Een fout van de datasheet-opsteller, dus.

Effe Atmel contacten (www.atmel.com -> contact). Ik heb vandaag 3 "Ack, will fix" over documentatie foutjes gekregen van ze. Hoeft een volgende er niet weer in te trappen....

Te overwegen.... Uit m'n hoofd is timer 1 een 16 bits timer, en timer 0 is 8 bits. Dus als je wilt comparen met 15624, dan moet je timer 1 en niet timer 0 hebben. Maar het kan zijn dat ik het over een atmega heb, en niet over attiny....

Met een beetje pech heb je dus met je attiny geen 16 bit teller, en slechts een 8bit teller. Dan kan je niet direct de 1Hz maken, maar voorlopig bijvoorbeeld alleen maar een 100 Hz teller. De volgende stap is om die in software door 100 te delen.

Op 31 augustus 2010 23:32:48 schreef rew:
[...]
Te overwegen.... Uit m'n hoofd is timer 1 een 16 bits timer, en timer 0 is 8 bits. Dus als je wilt comparen met 15624, dan moet je timer 1 en niet timer 0 hebben. Maar het kan zijn dat ik het over een atmega heb, en niet over attiny....

Is zo bij een MEGA en ook bij de Tiny serie.
Aangezien de TS alle registers van Timer1 gebruikt behalve het OC-register (dat is dan weer van Timer0) denk ik dat dit een typefout is en dat OCR0A -> OCR1A moet zijn.