hallo an alle,
ich hab mal ne frage (beschäftige mich noch nicht so lang mit µC und das
ist mein erster Eintrag hier ins Forum):
und zwar hab ich n Atmega16 und hab am PORTD (PD0,PD1,PD2,PD3, PD6) LEDs
und am PD5 (OC1A) nen Speaker. Und jetzt ist es, dass wenn ich Fast PWM
mache (WGM 14) um eben den Speaker mit ner bestimmten Frequenz toogeln
zu lassen dann gehen die LEDs an dem PORT nicht mehr und ich weiß nicht
warum? Folgende Einstellung hab ich genommen:
Port D einstellungen
DDRD = 0b11111111;
PORTD |= 0b00000000;
Timer 1:
DDRD = (1<<PD5); //PD5 (OC1A) auf Ausgang
PORTD &= ~(1<<PD5); //PD5 (OC1A) auf low
TCCR1B = (1<<CS12) | (1<<WGM13) | (1<<WGM12); //Prescaler 8, WGM
TCCR1A = (1<<WGM11) | (1<<COM1A1); //WGM 14 (FAST ICR1 TOP
ICR1 = 142; //16Mhz/8/440Hz (A4)
OCR1A = 1; //Lautstärke
PS: In einem SwitchCase in der Main kann ich die LEDs ein ausschalten
hat aber damit nichts zu tun, weil wenn ich den Timer1 ausmache, geht es
wunderbar.
PPS: Gibt es eine Möglichkeit den Code schöner in einem Post zu
formatieren?
Danke im Vorraus
philipp schrieb:> Und jetzt ist es, dass wenn ich Fast PWM> mache (WGM 14) um eben den Speaker mit ner bestimmten Frequenz toogeln> zu lassen dann gehen die LEDs an dem PORT nicht mehr und ich weiß nicht> warum?
Ganz einfach:
Du hast einen Fehler im Programm.
Also zeig es als Ganzes.
> Folgende Einstellung hab ich genommen:
Schön. Hier liegt der Fehler nicht.
> PPS: Gibt es eine Möglichkeit den Code schöner in einem Post zu> formatieren?
Hast du schon mal in der grauen Box über dem Eingabefeld gelesen, was da
so alles drinnen steht. Solltest du tun. Da gibt es eine schöne große
Überschrift "Formatierungen"
erstmal danke für die schnelle antwort!
das problem ist, dass der halt schon riesig ist, und ich will ja keinen
mit unnötiger leserei belästigen. und ich hab ihn auf mehrere c-files
aufgeteilt. aber ich verusch mal das wichtigste hier reinzuschreiben.
PORT einstellung:
1
DDRA&=~(1<<PA0)|~(1<<PA1)|~(1<<PA2);
2
PORTA|=0b00000000;
3
4
5
DDRD=0b11111111;
6
PORTD|=0b00000000;
7
8
DDRC&=0b00000000;
9
PORTC|=0x00;
Timer0:
1
TCCR0=1<<WGM01^1<<CS01^1<<CS00;// CTC, XTAL / 64
2
OCR0=(uint8_t)(XTAL/64.0*1e-3-0.5);// 1ms
3
TIMSK|=1<<OCIE0;
Timer1:
1
DDRD=(1<<PD5);//PD5 (OC1A) auf Ausgang
2
PORTD&=~(1<<PD5);//PD5 (OC1A) auf low
3
4
TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12);//Prescaler 8, WGM 14 (FAST PWM TOP ICR1)
5
TCCR1A=(1<<WGM11)|(1<<COM1A1);//WGM 14 (FAST PWM TOP ICR1)
6
ICR1=142;//16Mhz/8/440Hz (A4)
7
OCR1A=1;//Lautstärke/
Timer 2:
1
TCCR2|=((1<<CS21));// Prescaler 8
2
ASSR=(1<<AS2);// Timer2 asynchron takten mit Uhrenquarz
3
long_delay(1000);// Einschwingzeit des 32kHz Quarzes
4
TCCR2=(1<<COM21)|(1<<WGM21)|(1<<WGM20);// Fast PWM, non inverted
5
TCCR2=1;// Vorteiler 1 -> 7,8ms Überlaufperiode
6
OCR2=128;// PWM, Tastverhältnis 50%
7
while((ASSR&(1<<TCR2UB)));// Warte auf das Ende des Zugriffs
sorry, dass ich den code nochmal gepostet hab. das war nicht meine
absicht. ich wollte es eigentlich nicht im anhang mitschicken, aber wäre
eigentlich wohl doch besser gewesen.
Hast du was dagegen, wenn ich den langen Codeteil in deinem Posting
kürze?
Der ist unsinnig - sieht sich sowieso keiner an, weil alle die
Codevorschau bevorzugen.
Dein
switch( modus )
ist ja heavy!
Das sind im grunde 4 oder 5 verschiedene Codeschnipsel, die sich durch
die Zahlenwerte unterscheiden.
Die Schnipsel kann man ach in Funktionen auslagern, denen man die
Zahlenwerte als Argument mitgibt.
Und schon schrumpft der ganze Case von 4 Seiten Code auf 1 oder 1
einhalb zusammen. Was nicht nur der Übersicht gut tut.
philipp schrieb:> Vielen herzlich Dank K-H,> echt spitze wie du dass so schnell siehst!
Ich les mir einfach den Code durch.
Meistens fang ich bei der main an.
Da du geschrieben hast, du hättest ein Problem mit dem Port D hab ich
spezielles Augenmerk auf alles gelegt, was mit dem Port D zu tun hat.
Und eine direkte Zuweisung an eines der Port/Pin/DDR Register ist
grundsätzlich immer suspekt. Also achte ich speziell auf alles, was mit
Port D zu tun hat und bei dem 'in der Mitte' ein einsames = steht. Man
kennt ja seine Pappenheimer und die Praxis des Code Copy&Paste
So einfach ist das.
ok super,
ich werd veruschen, den switch-kram mal in ne funktion auszulagern.
haste eigentlich schon recht. Wär mir selber gar nicht aufgefallen. Muss
aber eh noch einiges am code optimieren und kommentieren. Muss nämlich
zugeben, dass ich viel von euch kopiert habe... dank dir jedenfalls und
gute nacht!
Karl Heinz Buchegger schrieb:> So einfach ist das.
Allerdings hab ich dir gegenüber einen Vorteil.
Als Autor hast du immer eine Tendenz das im Code zu Lesen, was deiner
Meinung nach dort stehen SOLLTE.
Wenn ich den Code lese, dann hab ich erst mal keinen Bezug zum Code. Ich
lese das, was tatsächlich dort steht. Und das muss nicht immer das
gleiche sein, was du liest :-) Wer beide gehen unterschiedlich an die
Sache ran. Du weißt was konzeptionell an dieser Stelle passieren sollte.
Ich weiß das nicht, ich muss mir das aus dem Code erschliessen. Daher
achte ich mehr auf die kleinen Details, die du überliest.
(Wenn du verstehst was ich meine. Ist im Grunde das gleiche mit
Rechtschriebfehler. Die sieht man selber auch oft erst, wenn man mit der
Nase drauf gestossen wird und andere sehen sie sofort. Nur mit dem
Unterschied, dass in einer Programmiersprache wie C all die
Sonderzeichen eine wesentliche Bedeutung tragen, während ein vergessenes
Komma in einem deutschen Satz kein Beinbruch ist)