Problem mit PWM - Tiny13

Gast #4407230
Lesenswert?

Guten Abend,

ich möchte mit einem tiny13 über einen Poti eine PWM erzeugen.
Der Poti wird an PB3 genschlossen und zwischen VCC und GND aufgespannt.
Soweit komme ich mit dem testen aber auch gar nicht.

Irgendetwas scheint mit dem PWM nicht zu stimmen. Ich habe testeshalber 
erstmal eine LED an PB1 angeschlossen. Und einen festen Wert an OCR0B 
übergeben.
Die LED leuchtet nicht.

Wenn ich die komplette main bis auf DDRB = 0xFF; PORTB = 0x00; 
auskommentiere, dann geht auch die LED an.

Obwohl ich das Datenblatt relativ gewissenhaft gelesen habe, hat sich 
ein Fehler eingeschlichen.
Die Datei ist trotz vieler Zeilenumbrüche lediglich 60 Zeilen lang und 
gut kommentiert. Ich hoffe, jemand von euch kann eben über die Datei 
fliegen?
Ich bin gerade etwas am verzweifeln.


http://pastebin.com/4z3993E6


Bester Gruß.
#4407301
Lesenswert?

Für irgendeinen sicher.
Andererseits muß man schon alt werden, um einen 1kHz-Pfeifer nicht mehr 
zu hören ;-)

Ob der (Gleichstrom?-)Motor deine PWM mag, sagt er u.A. über seine 
Temperatur. Und falls nicht, hat man es mit deutlich mehr kHz einfacher 
ein LC-Filter davor zu bauen. Ich würde den Prescaler mal von 1024 auf 
64 oder sogar 8 ändern. Dann pfeift nix mehr.
Gast #4407354
Lesenswert?

Danke für die Info. Ich versuche es mal mit einem anderen Prescaler.

Aktuell habe ich noch Probleme mit dem ADC. Scheinbar funktioniert die 
ISR doch nicht wie gedacht.

Ich muss mal UART implementieren, damit ich vernünftig debuggen kann ://
Mit nur einer LED ist irgendwie doof.
Gast #4407562
Lesenswert?

In der setup() richte ich den ADC ein und in der ISR werden die Werte 
aufaddiert. Irgendwie scheint aber in der setup() etwas falsch zu sein.
Über eine Schleife in der Main geht es jedenfalls. Jedoch nicht im Free 
Running. Sieht da jemand einen Fehler?
1
static uint32_t sum;
2

3
ISR( ADC_vect )
4
{
5
  static uint8_t  f;
6
  sum += ADC;
7
  
8
  f++;
9

10
  if(f == 0)
11
  {
12
    // tue etwas mit dem oversampling
13
    sum = 0;
14
  }
15
}
16

17
void setup()
18
{
19
  ADMUX |= (1 << MUX1) | (1 << MUX0); // PB3
20

21
  ADCSRA |= (1 << ADPS1) | (1 << ADPS0);
22
  ADCSRA |= (1 << ADIF) | (1 << ADIE); // Interrupt enable
23
  ADCSRA |= (1 << ADATE);
24
  
25
  ADCSRA |= (1 << ADEN); // ADC enable
26
  
27
  ADCSRA |= (1 << ADSC); // ADC Start Conversion
28
  // Ab hier sollte das Free Running laufen und die ADC ISR aufrufen
29
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren