Timer Probleme?

OP #4177051
Lesenswert?
• ▲
▼
DDRD |= (1 << DDD6);
 // PD6 is now an output

 OCR0A = 128;
 // set PWM for 50% duty cycle


 TCCR0A |= (1 << COM0A1);
 // set none-inverting mode

 TCCR0A |= (1 << WGM01) | (1 << WGM00);
 // set fast PWM Mode

 TCCR0B |= (1 << CS20);
 // set prescaler to 8 and starts PWM

Mein Controller läuft mit ext. 16MHZ (ATMega328) - Arduino Uno

Wo habe ich den Fehler gemacht, dass mir nur ca 1KHZ ausgegeben werden? 
es müssten doch eigentlich 8KHZ sein.

Das Gleiche habe ich auch, wenn ich ohne Teiler arbeite, dann müsste ich 
ca 62,5KHZ haben und habe nur ca 8KHZ

FUSES habe ich schon überprüft, sollten alle passen.
Gast #4177078
Lesenswert?
• ▲
▼
X. Y. schrieb:
> Klaus schrieb:
>> X. Y. schrieb:
>>
>>> schon spät ;) seit 5 uhr wach
>>
>> Dann würde ich Dir sehr empfehlen mal zu schlafen.
>> Morgen guckst Du dann in's Datenblatt. Und falls nötig postest Du Code
>> bitte mit Copy&Paste.
>
> ich bin noch neu auf diesem Gebiet. Wenn ich 100% ig Bescheid wüsste,
> was da so alles passiert, würde ich nicht fragen

Na dann halt nicht. Schönes Leben noch.
OP #4177081
Lesenswert?
• ▲
▼
Klaus schrieb:
> X. Y. schrieb:
>> Klaus schrieb:
>>> X. Y. schrieb:
>>>
>>>> schon spät ;) seit 5 uhr wach
>>>
>>> Dann würde ich Dir sehr empfehlen mal zu schlafen.
>>> Morgen guckst Du dann in's Datenblatt. Und falls nötig postest Du Code
>>> bitte mit Copy&Paste.
>>
>> ich bin noch neu auf diesem Gebiet. Wenn ich 100% ig Bescheid wüsste,
>> was da so alles passiert, würde ich nicht fragen
>
> Na dann halt nicht. Schönes Leben noch.

ich habe ja nicht gesagt, das ich mich nicht damit auseinander setzen 
möchte. ich will ja verstehen was passiert. das Datenblatt lesen ist ja 
kein Problem, die Tabellen und so verstehe ich ja auch, nur das setzten 
der einzelnen bits, da habe ich meine Probleme mit
Gast #4177104
Lesenswert?
• ▲
▼
X.Y schrieb:
> Ist aber nicht der Fall, es fehlt immer Faktor 8

Und das liegt eben an deinen Fuses. Wie die eingestellt sind hast du 
doch schon geschrieben und die von dir ebenfalls bereits verlinkte 
Webseite dekodiert dir das.

Und da steht dann eindeutig dass CKDIV8 aktiv ist!
Gast #4177109
Lesenswert?
• ▲
▼
S. Landolt schrieb:
> die low
> byte fuse steht nicht auf 0xFF.

Tut sie nicht. Er hat nicht gesagt was die Reihenfolge ist ;)

Aber da der mega328 nur drei Bits in efuse hat, habe ich einfach mal 
0xff als efuse angenommen, weil 0x05 für efuse nicht sein kann (nicht 
vorhandene Bits müssten gecleart sein)

Er hat lfuse=05 hfuse=da efuse=ff.
Gast #4177130
Lesenswert?
• ▲
▼
S. Landolt schrieb:
> Kann ich mir nicht vorstellen, das hieße 'Low Frequency Crystal
> Oscillator'.

Hast recht. Das würde nur dann nicht auffallen, wenn der Takt extern 
erzeugt wird. Die Unos haben aber nur Quarz oder Keramik.
(Auch scheints wohl Programme zu geben die die nicht vorhandenen Bits 
als 0 statt 1 ausgeben. Dann passt 0x05 wieder.)

S. Landolt schrieb:
> Kann man in C nicht noch 'F_CPU' oder so was ähnliches definieren?

Hat nur Auswirkungen auf _delay_ms/_delay_us, damit die libc weiß, wie 
der Takt eingestellt ist. Verstellen kann man den damit nicht, auch wenn 
manche Leute das gerne tun wollen :-)
Gast #4177145
Lesenswert?
• ▲
▼
Das letzte, was ich vorm Bett prüfen würde, ist, welche Frequenz 
rauskommt, wenn man das nochmal flasht und CKDIV8 setzt. Und dann, 
welche rauskommt, wenn man danach CKDIV8 wieder rausnimmt.

Falls irgendwas falsch gesetzt war, ist es danach vielleicht richtig. 
Und wenn nicht, geben die dann noch vorhandenen Fehlerfaktoren ggf 
weitere Hinweise, wo der Fehler liegt.
#4177281
Lesenswert?
• ▲
▼
foo schrieb:
> Das letzte, was ich vorm Bett prüfen würde, ist, welche Frequenz
> rauskommt, wenn man das nochmal flasht und CKDIV8 setzt. Und dann,
> welche rauskommt, wenn man danach CKDIV8 wieder rausnimmt.

Das erste was ich prfen würde ist, ob ein _delay_ms(1000) auch wirklich 
ca. 1 Sekunde lang dauert, bei einem F_CPU von 16000000.
Das ist der beste Beweis, ob der µC auf 16Mhz läuft oder nicht.

Ehe ich das nicht gecheckt habe, mach ich doch gar nicht erst mit Timern 
weiter und such mir einen Wolf in der Konfiguration.
#4177567
Lesenswert?
• ▲
▼
Route 6. schrieb:
> Ist "CS20" nicht einfach eine andere Schreibweise für "0"???

Nein, das ist eine Definition.
1
#define CS20 0

Genau so ist auch das CS00, das dahin gehört definiert:
1
#define CS00 0

Das ist jetzt aber nicht die Pedanterie eines Oberkorinthenkackers, 
sondern ein Hinweis auf mangelnde Sorgfalt und Copy&Paste ohne Sinn und 
Verstand. An dieser Stelle spielt das zufällig keine Rolle. Wer es aber 
bei diesen paar Zeilen Code nicht richtig hinkriegt, dem kann man 
durchaus zutrauen, dass an anderer Stelle ebensolche Böcke eingebaut 
sind, die nicht zufällig funktionieren.

mfg.
#4177709
Lesenswert?
• ▲
▼
Thomas E. schrieb:

> sondern ein Hinweis auf mangelnde Sorgfalt und Copy&Paste ohne Sinn und
> Verstand. An dieser Stelle spielt das zufällig keine Rolle.

Es spielt insofern eine Rolle, weil das beim Timer 0 keinen Vorteiler 
von 8 ergibt. Weder so noch so.

Was, wie du richtig anmerkst, auch für mich ein Hinweis darauf ist, dass 
hier wieder mal per Copy&Paste programmiert wird.
Wenn Bezeichnungen nicht zusammenpassen und Kommentare falsch sind, 
werde ich stutzig.
OP #4179473
Lesenswert?
• ▲
▼
1
/*
2
 * PWM_Test.c
3
 *
4
 * Created: 26.06.2015 21:16:01
5
 *  Author: x.y.
6
 */ 
7
#define F_CPU 16000000UL // 16 MHz
8
#include <util/delay.h>
9
#include <avr/io.h>
10

11

12
int main(void)
13
{
14
  DDRD |= (1 << DDD6);
15
  
16

17
  OCR0A = 1;
18
  
19
  int x = 100;
20
  TCCR0A |= 10000011;
21
  TCCR0B |= 00000001;
22

23
  
24
  while (1)
25
  {
26
    
27
    _delay_ms(1000);
28
    
29
    OCR0A = x;
30
    
31
    
32
  }
33
  return 0;
34
}

hat sich erledigt. keine ahnung was es war aber jetzt wo ich es ohne 
bootloader vom arduino gemacht habe sondern es  im atmel studio gemacht 
habe hat es geklappt
OP #4179491
Lesenswert?
• ▲
▼
foo schrieb:
> X. Y. schrieb:
>>   TCCR0A |= 10000011;
>>   TCCR0B |= 00000001;
>
> Tut nicht das, was du glaubst, was es tut.
>
> Binärkonstanten werden mit 0b vorne dran angegeben (0b10000011).
>
> (Unabhängig davon, dass es i.A. besser lesbar ist wenn man die
> vorhandenen Defines verwendet.)

also er tut zz genau das was ich will.

ja werde ich gleich noch ergänzen. aber so weiß ich schonmal, dass es im 
Grunde funzt. ich habe direkt mein oszi dran, deswegen weiß ich das es 
funzt.
Gast #4179497
Lesenswert?
• ▲
▼
X. Y. schrieb:
> also er tut zz genau das was ich will.

Das wird als Dezimalzahl interpretiert. Da in das Register nur 8 Bit 
passen werden nur die untersten 8 Bit davon genommen. Du hättest auch 
TCCR0A |= 131 schreiben können.

Dass diese untersten 8 Bit nun rein zufällig 0b10001011 entsprechen 
und es deshalb das selbe Ergebnis bringt (bei den aktuellen Modellen ist 
das vierte Bit noch unbenutzt) heißt nicht dass der Code so korrekt ist.

Würdest du da z.B. 10100011 schreiben (warum auch immer) dann wären die 
letzten 8 Bits davon 0b0101011 ... wie du siehst, passt es manchmal 
zufällig, manchmal nicht.

Das gleiche gilt natürlich auch für 00000001 (hier passt es aus 
naheliegenderen Gründen), beachte hier, dass Zahlen mit führenden Nullen 
in C oktal interpretiert werden (d.h. 010 = 8!)
OP #4179549
Lesenswert?
• ▲
▼
foo schrieb:
> X. Y. schrieb:
>> also er tut zz genau das was ich will.
>
> Das wird als Dezimalzahl interpretiert. Da in das Register nur 8 Bit
> passen werden nur die untersten 8 Bit davon genommen. Du hättest auch
> TCCR0A |= 131 schreiben können.
>
> Dass diese untersten 8 Bit nun rein zufällig 0b10001011 entsprechen
> und es deshalb das selbe Ergebnis bringt (bei den aktuellen Modellen ist
> das vierte Bit noch unbenutzt) heißt nicht dass der Code so korrekt ist.
>
> Würdest du da z.B. 10100011 schreiben (warum auch immer) dann wären die
> letzten 8 Bits davon 0b0101011 ... wie du siehst, passt es manchmal
> zufällig, manchmal nicht.
>
> Das gleiche gilt natürlich auch für 00000001 (hier passt es aus
> naheliegenderen Gründen), beachte hier, dass Zahlen mit führenden Nullen
> in C oktal interpretiert werden (d.h. 010 = 8!)

ok, habe es angepasst :)

hm was jetzt noch mein problem ist, wahrscheinlich wieder simpel, ist 
das ich gerne timer 0 und timer 2 mit gleichen config laufen lassen 
will. was ich noch nicht ganz verstehe wie ich die timer ausgänge extern 
zuweise. es gibt ja für jeden timer 2 externe pins.
#4180325
Lesenswert?
• ▲
▼
X. Y. schrieb:
> keine ahnung was es war aber jetzt wo ich es ohne
> bootloader vom arduino gemacht habe sondern es  im atmel studio gemacht
> habe hat es geklappt

Wenn man Read-Modify-Write Zugriffe macht dann wird der Inhalt nicht 
unbedingt komplett überschrieben.

Damit:
1
  DDRD |= (1 << DDD6);
2
  TCCR0A |= 0b10000011;
3
  TCCR0B |= 0b00000001;

Werden lediglich die angebenen 1-Bits in den Registern auf 1 gesetzt,
die im Register bereits vorhandenen 1-Bits werden aber nicht auf Null 
gesetzt.

Wenn der Bootloader die Register bereits anfasst, die also nicht mehr 
auf Default-Null sind, dann kann es sein, dass dabei was ganz anderes 
raus kommt.

Im Zweifel einfach richtig überschreiben:
1
  DDRD = (1 << DDD6);
#4180364
Lesenswert?
• ▲
▼
Thomas E. schrieb:
> Das Programm muss von einem Bootloader überhaupt nichts wissen. Wenn der
> fertig ist, hat er den Controller besenrein zu übergeben.

Dem kann ich nur zustimmen, ich wollte nur eine mögliche Erklärung für 
das Verhalten mit und ohne Bootloader liefern.

Generell ist es aber auch nicht die schlechteste Idee auf sinnlose 
Read-Modify-Write zu verzichten und einfach nur zu schreiben wo es 
angebracht ist.

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.