Versuche hier den AD Wandler zum laufen zu kriegen, was aber nicht will.
Habe externe C von 100nF an Pin 21 (MEGA8) und Poti am ADC1.
Nun soll der Wert an der SPI ausgegeben werden wo ein 74HC595 dran
hängt.
Geht aber nicht. AVCC ist an +5 Volt.
Was ist falsch die SPI funktioniert
Hi, dein Programm bleibt bei der while(1) Schleife stehen und macht
deshalb weder Messung, noch SPI Übertragung.
Zudem glaube ich nicht, daß das Programm so kompiliert, ohne Semikolon
nach der while(1).
Gruß
while(1) ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
>Zudem glaube ich nicht, daß das Programm so kompiliert, ohne Semikolon>nach der while(1).
Klar geht das;)
"Welchen Einfluss hat eine saubere Codeformatierung und Einrückung auf
2
die Fähigkeit des Programmierers, Fehler selbst zu sehen?"
Aus genau dem gleichen Grund schreib ich zb so etwas
1
while(!(ADCSRA&(1<<ADIF)));// WARTEN BIS FERTIG
immer so
1
while(!(ADCSRA&(1<<ADIF)))// WARTEN BIS FERTIG
2
;
dann sieht man schneller, dass das hier eine leere Schleife ist, deren
ganzer Zweck sich in der Abbruchbedingung verbirgt.
Technisch gesehen gehört der ; sowieso zum nächsten (in dem Fall leeren)
Statement und nicht zum while. Ein while (genauso wie ein for oder ein
if oder ein do) wird nicht mit einem ; abgeschlossen.
Wer seinen Coding Stil daher so aufbaut
1
while(Bedingung)
2
Anweisung;
(also: die abhängige Anweisung kommt immer eingerückt in die nächste
Zeile), der handelt nur konsequent, wenn er das auch mit der leeren
Anweisung so handhabt. Denn auch eine leere Anweisung ist eine
Anweisung:
1
while(Bedingung)
2
;// tu nichts, Jaa das ist eine leere Anweisung. So etwas gibt es!
Dieser ; ist wichtig und es ist wichtig, dass der heraussticht und sich
nicht in den Zeichen einer Zeile versteckt, wo ihn keiner sieht.
Besonders fies ist hier natürlich die konkrete Codefortstzung ...
1
while(!(ADCSRA&(1<<ADIF)));// WARTEN BIS FERTIG
2
3
{
4
PORTB&=~(1<<SS);//SS LOW
5
SPDR=ADCH;
6
while(!(SPSR&(1<<SPIF)));
7
PORTB|=(1<<SS);// SS HIGH
8
_delay_ms(100);
9
}
... bei der es auf den ersten Blick so aussieht, als ob der
darauffolgende Block vom while abhängig ist. Das er es nicht ist, sieht
man erst, wenn man den ; entdeckt hat
1
while(!(ADCSRA&(1<<ADIF)))// WARTEN BIS FERTIG
2
;
3
4
{
5
PORTB&=~(1<<SS);//SS LOW
6
SPDR=ADCH;
7
while(!(SPSR&(1<<SPIF)))
8
;
9
PORTB|=(1<<SS);// SS HIGH
10
_delay_ms(100);
11
}
So ist es IMHO ein bischen besser zu sehen, dass der Block nichts mit
dem while zu tun hat.
Komisch. Solche Fälle hatten wir in letzter Zeit öfter. Als wenn gerade
der Trend besteht, das das Semikolon nur so syntaktischer Zucker ohne
eigene Bedeutung ist.
(Mensch, wie habe ich BEGIN und END gehasst).
Ingo Laabs schrieb:> Gut, aber wo ist jetzt der Fehler außer der Code-Formatierung ?
Das ist ausführlich diskutiert worden. Was hast Du daran nicht
verstanden?
Da ist ein paar geschweifte Klammern zuwenig in Deinem Code.
Korrigiere also den Fehler erstmal, probiere es aus und poste dann
wieder.
Abgesehen davon, wäre es wirklich ausserordentlich freundlich, wenn Du
mal beschreibst worin sich der Fehler eigentlich äussert. "Geht nicht"
ist nicht gerade eine ausführliche Beschreibung.
>Wenn du jetzt noch die beiden überflüssigen geschweiften Klammern>wegmachst denkt auch keiner mehr das sie zu dem while() darüber>gehören.
Ok, jetzt sind sie weg;)
holger schrieb:> Wenn du jetzt noch die beiden überflüssigen geschweiften Klammern> wegmachst denkt auch keiner mehr das sie zu dem while() darüber> gehören.
Huch? Habe ich gerade einen Hänger?
Welche geschweiften Klammern meinst Du?
Die nach dem while(1) sollten doch da sein, oder?
Wenn dann waren doch die inneren Klammern nach "while (!(ADCSRA &
(1<<ADIF))); // WARTEN BIS FERTIG" überflüssig und in dem Post von 21:12
waren sie doch schon nicht mehr da.
Seltsam. Was mache ich da für einen Denkfehler?
Karl heinz Buchegger schrieb:> Keinen.> Der Code wurde nachträglich editiert.
Ach so! Danke für die Bestätigung meiner geistigen Gesundheit. ;-)
Hier haste n Bier.
Grrrr schrieb:> Ach so! Danke für die Bestätigung meiner geistigen Gesundheit.
Über die zeitlichen und faktischen Grenzen dieser Bestätigung bin ich
mir im klaren... ;-)
Karl heinz Buchegger schrieb:> Grrrr schrieb:>>> Seltsam. Was mache ich da für einen Denkfehler?>> Keinen.> Der Code wurde nachträglich editiert.
richtigm wurde von mir nachträglich editiert....kein Denkfehler.
An der Code-Formatierung werde ich noch Arbeiten. Nur stand gestern
Abend das Essen auf dem Tisch, und das wollen wir doch nicht kalt werden
lassen...GELL
Du musst lernen, dass man Code Formatierung nicht nachträglich in einen
Code einbaut, sondern sofort. Während man in schreibt!
Es tut nicht weh, wenn man Codestellen gleich von vorne herein auf die
richtige Einrücktiefe einrückt.
Ganz im Gegenteil: Dadurch das man sich überlegt, auf welche
Einrücktiefe eine Codestelle aufgrund der Progammlogik gehört und man
schnell überprüft ob die Klammerhierarchie das auch hergibt, fallen
viele Flüchtigkeitsfehler weg! Der springende Punkt hier ist die leichte
Überprüfbarkeit, nicht das es schön aussieht.
Aber dazu muss man konsequent korrekt einrücken. Sonst funktioniert das
nicht.
Karl heinz Buchegger schrieb:> Aus genau dem gleichen Grund schreib ich zb so etwas> while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG>> immer so while (!(ADCSRA & (1<<ADIF))) // WARTEN BIS FERTIG> ;
Hallo Herr Buchegger,
möchte mich an dieser Stelle mal für die immer wertvollen Tipps
bedanken.
Funktionell macht die Schreibweise aber keinen Unterschied oder ?
> Funktionell macht die Schreibweise aber keinen Unterschied oder ?
Allein für diese Frage gehört Dir ein kräftiger Tritt in den Hintern!
Du hast nichts von allem Geschriebenen gelernt oder verstanden!
Ingo Laabs schrieb:> nun, weil es bei mit der alten Schreibweise funktioniert. Von daher kam> die Frage.
Trotzdem hat "Oh nein" recht. Das sollte man eigentlich bei den
Grundlagen, irgendwo auf den ersten 20 Seiten eines Buches gelesen
haben.
Wenn du willst kannst du das so schreiben
1
while
2
(
3
!
4
5
6
7
(
8
ADCSRA
9
&
10
(1<<
11
ADIF)
12
)
13
)
14
;
und es wäre immer noch dieselbe Anweisungsfolge.
Es sollte aber auch ziemlich offensichtlich sein, warum das keine gute
Idee ist. (*)
Die einzige Einschränkung ist: in einem Wort kann kein Whitespace (also
Leerzeichen, Tabulator, Zeilenumbruch) sein. Aber ansonsten bist du
völlig frei darin, wo du wieviele Whitespace Character einbaust. Dem
Compiler ist das wurscht, der filtert die sowieso aus, wenn er sich den
Text vornimmt. Für den ist nur die Abfolge der Bausteine interessant,
nicht in welcher Weise du sie optisch anordnest.
Eine Ausnahme ist der // Kommentar. Der geht immer bis zum aktuellen
Zeilende. Und bei Makros gibt es auch eine Ausnahme. Allerdings kann man
darüber debattieren, ob der Präprozessor Teil des eigentlichen Compilers
ist oder ob man den als Vorsatz vor den Compiler nicht sowieso extra
betrachten muss.
(*)
Edit: Ausser natürlich man nimmt am IOCCC teil. Dann muss sich schon
einmal alles andere der äusseren Form unterordnen :-)
1
externint
2
errno
3
;char
4
grrr
5
;main(r,
6
argv,argc)intargc,
7
r;char*argv[];{intP();
8
#define x int i, j,cc[4];printf(" choo choo\n" ) ;
Auf die Gefahr hin, dass gleich wieder mit mir gemeckert wird wegen
formatierung.
Ich wollte jetzt mit demn Wert den ich über den ADC einlese an die PWM
ausgeben. Das geling auch, nur kann ich das Tastverhältniss nur bis etwa
50% einstellen.