PWM mit Attiny 26

Gast #4310775
Lesenswert?
• ▲
▼
HI liebe Leute,

Ich möchte eine PWM-Signal mit Attiny 26 mit intern Oszillator von 8Mhz 
generieren, dabei soll ich das dusty cycle zw. 0% bis 100% einstellen 
könne und die Frequenz des PWM-Signal sollte immer 100Khz betragen, 
jetzt kann ich mit dem bisherigen Programm nur zwischen PWM-Signa mit 
dusty cycle von  65% bis 100%  generieren, wenn ich ein Signal mit dusty 
cycle unter 65% einstellen will, kriege ich gar kein PWM mehr ( am 
Oszilloskope)

Wo könnte das Problem liegen ?? Bitte Hilfe hier mein Code
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4

5
void pwm_init()
6
{
7
  TCCR1A |= ((1<<COM1B1)|(1<<PWM1B));  //clear OCR1B on compare macht and pwm mode enable
8
  TCCR1B |= ((1<<CTC1)|(1<<CS10));      // CTC mode enable (clear timer on compare match OCR1C OCR1A gibt den dutycycle an) and clock the timer withough prescaller (so we can have enough levels for the duty cycle)
9
  TCNT1 = 0;
10
  OCR1B = 50;   // controliert die dusty (ab 30 2.5 Mittelwert.)
11
  OCR1C = 79;  // controliert die Frequenz
12
  TIMSK|= (1<<OCIE1B);    // Timer/counter output compare match with OCR1B interrupt enable
13
  sei();        // Timer/counter global interrupt enable
14
}
15

16

17
int main(void)
18
{   
19
  pwm_init();
20
  
21
  DDRB |= (1<<PB3);  // als Ausgang gesetzt das ist der OC1B PIN für PWM
22
  
23
            
24
  
25
  while(1)
26
  {
27
    
28
  }
29
}
#4310819
Lesenswert?
• ▲
▼
Sixafeud schrieb:

>   TIMSK|= (1<<OCIE1B);    // Timer/counter output compare match with
> OCR1B interrupt enable

Wenn du einen Interrupt freigibst, dann muss es auch eine ISR dazu 
geben!

Wozu willst du den Interrupt eigentlich? Den braucht doch keiner. Der 
Timer erzeugt die PWM ganz von sich aus alleine, ohne dass du in einer 
Interrupt Service Routine nachhelfen musst.

Und PS: Es heist 'duty' und nicht 'dusty'. dusty ist das englische Wort 
für 'staubig/schmutzig'. Hier ist nichts staubig.
Gast #4310842
Lesenswert?
• ▲
▼
Ja alles klar musste ich nicht unbedingt

>> TIMSK|= (1<<OCIE1B);

schreiben, aber daran lag das Problem nicht oder ?

 Karl Heinz schrieb:
 Es heist 'duty' und nicht 'dusty', danke für die Korrektur


MFT
Grüßen
#4310848
Lesenswert?
• ▲
▼
Sixafeud schrieb:
> Ja alles klar musste ich nicht unbedingt
>
>>> TIMSK|= (1<<OCIE1B);
>
> schreiben, aber daran lag das Problem nicht oder ?

Natürlich.

Wenn du keine ISR hast, dann kommt eine Standard-ISR zum tragen die .... 
dein Programm neu startet.
Je nach Verhältnis von OCR1B zu OCR1C geschieht dies daher vor oder 
nachdem der PWM-Puls bereits abgeschlossen wurde. Geschieht es davor, 
dann wirst du am Ausgang nie einen Puls sehen.

Antwort schreiben

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.

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.