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ß.
DB Tiny13 sagt: COM0Bn schaltet Portvalue durch, aber ändert nicht das zugehörige DDR-Bit. Also DDRB auf Ausgang setzen!
Fck. Dank dir. Ich habe schon rot gesehen :) 1 Mhz / 1024 = 977 Hz << Meint ihr, die Frequenz ist zu langsam für einen Motor?
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.
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.
> Aktuell habe ich noch Probleme mit dem ADC. Scheinbar funktioniert die > ISR doch nicht wie gedacht. hmm. ADCSRA |= (1 << ADSC); ?
Oh, ADCSRA |= (1 << ADSC); (Zeile 49) steht auch in der main. Daran liegt es nicht.
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 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.