www.mikrocontroller.net

Forum: Compiler & IDEs ATTiny45 PWM Counter 1


Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus allerseits

ATTiny45 mit internem 1Mhz Oszilator.
Zuerst habe ich die Testschaltung mit Timer0 aufgebaut, da ich dazu 
funktionierende Sourcen hatte. Hat auch wunderbar funktioniert.
Da aber 1MHz nicht gerade dazu geeignet ist, um damit vernünftlich PWM 
zu backen, habe ich den Transistor von Port B0 auf B4 umgelötet und die 
Software auf Timer1 mit PLL umgeschrieben. Das war heute morgen. Jetzt, 
nach 8 Stunden bin ich keinen Schritt weiter.

void Timer_1_init( void )
{ 
 //===========
  PLLCSR = ( 1<<  PLLE);               // enable PLL
  while(BIT_IS_CLEAR(PLLCSR, PLOCK));  // warten bis PLL locked
  PLLCSR |= ( 1<<  PCKE);              // after PLL is locked, use 64MHz as clock source for Timer1
  //============

  GTCCR  = ( 1 << PWM1B);     // enable PWM 
  GTCCR |=( 1 << COM1B1) | ( 0 << COM1B0); // OC1B cleared on compare match

  TCCR1  |= ( 1<< CS13) | (1 << CS12)  | (0 << CS11) | (0 << CS10);      // presc. 64 MHz / 2048

  OCR1C  = 0xFF;   //  max value
  OCR1B  = 0x00;   // compare value

  TIMSK  |= ( 1 << OCIE1B);  // compare match interrupt
}

Die Interrrupt Routine:
ISR(TIMER1_COMPB_vect)
{ 
  OCR1B = adc_value;   // change compare value
  BIT_SET(ADCSRA, ADSC); // start a new ADC conversation
}

Bevor ich Timer_1_init() aufrufe, kann ich die LED mit SWITCH_ON und 
SWITCH_OFF ein- und ausschalten. Nach dem Init bleibt die LED konstant 
ON. Oder, wenn ich COM1B0 und COM1B1 aendere, konstant OFF.
Wenn ich OCR1C verkleinere, wird die Interrupt Rountine dementsprechend 
schneller aufgerufen. Das Gerüst scheint also i.O. zu sein.

Waere dankbar, wenn mit jemand einen Tip geben könnte.

Mfg

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du eine Chance, da mal mit debugWIRE reinzugucken?

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Jörg

Ich habe das Ganze so gelöst, dass ich anstelle von OC1B nun OC1A 
benutze. Und damit klappts. Mit OC1B hatte ich dermassen absurde 
Probleme, dass ich mich gar nicht getraue, sie hier alle aufzuzaehlen. 
:)
Der obige Code ist aber an sich i.O.

Der einzige Ueberlegungs-Fehler im Code ist nur der, dass wenn man den 
Compare-Interrupt mit 64Mhz-Clock aktiviert, dass dieser Interrupt alles 
andere überfaehrt. So im nachhinein in Ruhe nachgedacht, neige ich dazu, 
diesen Fehler als die eigentliche Quelle meines Problems zu sehen. Aber 
sicher bin ich mir nicht.

Danke für die Anteilnahme.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vollstaendigkeitshalber der Code, so wie er z.Zt. bei mir einwandfrei 
laeuft:

void Timer_1_init( void )
{ 

 // PLL einschalten
 PLLCSR = ( 1<<  PLLE);               // enable PLL
 while(BIT_IS_CLEAR(PLLCSR, PLOCK));  // warten bis PLL locked
 PLLCSR |= ( 1<<  PCKE);              // after PLL is locked, use 64MHz as clock source for Timer1
 
  
  // PWM OC1A
 TCCR1  = ( 1<< PWM1A) | ( 1 << COM1A1) | ( 0 << COM1A0);
  
//   TCCR1  |= ( 0<< CS13) | (0 << CS12)  | (0<< CS11) | (1 << CS10);      // presc. 64 MHz / (1 * 256) -> 250kHz
  TCCR1  |= ( 0<< CS13) | (0 << CS12)  | (1<< CS11) | (0 << CS10);      // presc. 64 MHz / (2 * 256) -> 125kHz
  //TCCR1  |= ( 0<< CS13) | (0 << CS12)  | (1<< CS11) | (1 << CS10);      // presc. 64 MHz / (4 * 256) -> 62.5kHz
 //TCCR1  |= ( 0<< CS13) | (1 << CS12)  | (0<< CS11) | (0 << CS10);      // presc. 64 MHz / (8 * 256) -> 31.25kHz

//  TIMSK  |= ( 1 << OCIE1A);  // compare match interrupt. Achtung! Wenn enabled, kann je nach Vorteiler kein anderer Interrupt mehr zum Zuge kommen

  OCR1C = 0xFF;
  OCR1A = 0xFF; 
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.