Hallo,
ich bin relativer Neuling beim Programieren von Mikrokontrollern. Ich
weiß es gibt schon mehrere Einträge zu diesem Thema denoch komme ich
nicht weiter.Ich habe diverse Beispiele ausprobiert und simuliert und
die entsprechenden Bits gesetzt doch nix passiert oder alles bleibt
stehen.
Ich benötige eine pos. Flankenauswertung für zwei Eingänge an einen
Mikrokontroller damit werbunden soll jeweils die Timerzeit ausgelesen
werden.
Die Eingangssignale laufen mit 50HZ und bei jeder pos. Flanke soll die
Timerzeit ausgelesen werden.
Vorgesen sind PIN0 und PIN1 an PORTB für die Eingänge.
Ich benutze AVR Studio 4 (Version4.1.4)das ganze in C.
Vieleicht kann mir jemand helfen und ein Beispiel Programm mal
schreiben.
Bin verzweifelt!
Danke im vorraus
Ich habe hier mal eine Textdatei angehängt mit 2 Versuchen andere
Versuche habe ich nicht mehr. Ich weiß sehen warscheinlich sehr plump
aus. Timer auslesen habe ich hier nicht geschrieben kamm nie über das
hier hinaus. Bei Version 1 erkannte das Programm bei einer etwas
umgeschriebenen art zwar die Flanke aber alles danach führte er nicht
mehr aus. Deshalb der eine Zähler i um zu sehen ob er überhaupt danach
etwas macht.
Version 1 ist Blödsinn, das kann man vergessen. Version 2 sieht dagegen
im Prinzip richtig aus. Mal abgesehen von den falschen Kommentaren und
den fragwürdigen Defines sollte damit eine steigende Flanke auf Pin B0
erkannt werden. Was funktioniert daran nicht?
Wenn ich es simuliere bleibt der zeiger auf u8Sample = PINB & (1<<BIT1);
stehen egal op ich das bit an pinB auf eins also 0x01 setze oder nicht.
Und Kannst du mir vieleicht die Komentare mal Koriegieren? Wie gesagt
bin Neuling und weißnicht so recht wie alles funktioniert oder wofür es
da ist.
Die defines habe ich von der 1 Version mit übernomen sind da eigentlich
nutzlos hast recht.
Könnte sein, dass der Compiler Dir den Rest wegoptimiert hat, weil in
dem if nichts passiert. Mach darin mal etwas, also z.B. einen
Ausgangspin setzen.
Zu den Kommentaren (in der Reihenfolge verständlicher):
1
DDRA=0x00;// Alle Pins als Eingänge deklariert
2
DDRB=0xC0;// Pin 0-5 als Eingänge, Pin 6-7 als Ausgänge deklariert
3
DDRD=0xFF;// Alle Pins als Ausgänge deklariert
4
PORTA=0x3F;// Pullup-Widerstand von Pin 0-5 aktiviert
5
PORTB=0x03;// Pullup-Widerstand von Pin 0-1 aktiviert
6
PORTD=0xFF;// Alle Pins auf Ausgangswert High gesetzt
Ok Danke erstmal für die Korrektur der Kommentare. Aber den Pin setzen
wie Du sagst hatte ich wie oben schon erwähnt gesetzt das ist ja das
Problem da passiert nix. Oder meinst du ich soll ihn als gesetzt
deklarieren?
höchst wahrscheinlich passiert da nix.
Denn:
Der arme Compiler denkt sich:
Jetzt tu ich mal meinem Programmierer etwas richtig gutes und seh mal
nach wie ich sein Programm schneller machen kann. Was haben wir denn da.
Aha
1
if(u8Sample!=0&&u8SampleLast==0){// pos Flanke
2
3
}
Da soll also etwas abgefragt werden. Gut.
Aber: Egal ob die Abfrage zutrifft oder nicht zutrifft, er macht ja
sowieso nix. Wenn aber eh nichts davon abhängt, ob die Abfrage zutrifft
oder nicht, dann kann ich sie auch rauswerfen. Da hat mein Programmierer
wahrscheinlich nicht aufgepasst und das steht noch von anderen Versuchen
da. Na, wenn der mich nicht hätte. Immer muss man hinter ihm
zusammenräumen, weil er alles rumliegen lässt.
Also: Weg damit. Braucht keiner.
Damit bleibt übrig
1
while(1){
2
u8Sample=PINB&(1<<BIT1);// Signal einlesen
3
4
u8SampleLast=u8Sample;
5
}
Und wenn ich mir jetzt einfach nur noch merke dass u8Sample und
u8SampleLast eh immer den gleichen Wert haben, dann brauch ich auch die
Zuweisung bzw. die ganze Variable u8SampleLast nicht.
Also weg damit
Damit bleibt übrig
1
while(1){
2
u8Sample=PINB&(1<<BIT1);// Signal einlesen
3
}
Da wird mein Programmierer aber mit mir zufrieden sein, weil ich ihm in
seinem Programm soviel Laufzeit eingespart habe!
und das ist genau das, was du im Debugger siehst.
Jetzt klar?
Mach da irgendwas rein!
So habe eine einfache rechenoperation eingefügt und selbes Problem. Habe
mal eine screenshoot gemacht und angehängt. Vieleicht mache ich
grundsätzlich etwas falsch beim simulieren
Word File?
Noch bescheuerter gehts wirklich nicht.
Häng einfach dein C-File hier als Attachment an! Das ist doch nicht so
schwer!
Das ist für dich am wenigsten Arbeit und für uns auch.
> So habe eine einfache rechenoperation eingefügt und selbes Problem.
Und was denkst du, macht ein Optimizer mit einer Berechnung, deren
Ergebnis keiner verwendet?
Und ich sag noch: irgendwas, was nicht wegoptimiert werden kann.
Zb eine LED einschalten
So Danke Karl Heinz Buchegger für das Beispiel. Aber kann das bitte
nächstes mal ohne irgendwelche bescheuerten Komentare gehen. Wir sind
schließlich erwachsen. Und warum als Word weil ich dort am leichtesten
einen Pfeil einfügen kann um auf dem screenshoot zu erklären was ich
mache. Und ob das richtig ist!!!
Im übrigen geht es doch nur darum das ich zeigen kann was ich mache. Wie
ist doch vollkommen egal!
Und zu dem Komentar das Du es breits geschrieben hast das ich etwas
einfügen soll was nicht wegoptimiert werden kann. ICH BIN ANFÄNGER WIE
IM ERSTEN KOMMENTAR GAAAAAAAAAAAANZ OBEN ERWÄHNT. Ich danke Dir für
deine Hilfe aber wenn Du denkst das Du mich deswegen hier beleidigen
kannst verzichte ich.
Vito T. schrieb:> So Danke Karl Heinz Buchegger für das Beispiel. Aber kann das bitte> nächstes mal ohne irgendwelche bescheuerten Komentare gehen. Wir sind> schließlich erwachsen.
Eben drum.
Und unter erwachsenen Programmierern ist mitdenken immer noch die
wichtigste Eigenschaft. Oder was denkst du, warum ich dir so jovial und
umgangssprachlich wie möglich zu verklickern versucht habe, dass der
Optimizer deines Compilers ziemlich clever ist und gnadenlos alles
ausnutzt was er nur finden kann, um alles aus dem Programm rauszuwerfen,
was nicht unbedingt notwendig ist.
> Im übrigen geht es doch nur darum das ich zeigen kann was ich mache.> Wie ist doch vollkommen egal!
Dir vielleicht. Mir nicht.
Aber wundere dich nicht, wenn nächstes mal kein Mensch mehr dein
Word-File aufmacht. Ich hab nämlich keine Lust, mir erst mal 250kB
downzuloaden, die durch einen Viren-Checker zu schleusen nur um dann
deinen 5-Zeiler in Form eines Bildes zu sehen, bei dem man kaum erkennen
kann, ob dort jetzt
i = 1 + 3;
oder
i = i + 3;
steht. (Was im übrigen keinen Unterschied machen würde. Beides sind
Berechnungen, die nichts bewirken und damit rausfliegen).
Je eindringlicher ich dir klar mache, dass du mit einem einfachen
Anhängen deiner C-Files am Besten fährst, desto besser. Denn beim
nächsten mal muss ich nicht 2 Code-Zeilen von dir aus einem JPG
abschreiben, sondern 20. Postest du aber das File, dann kopiere ich mir
die mit Copy&Paste raus und ändere sie um. So einfach ist das. Je mehr
Arbeit du mir beim Helfen machst, desto weniger habe ich Lust dazu. Und
wenn du es anders nicht begreifst, dann eben auf die zynische Art.
> Eben drum.> Und unter erwachsenen Programmierern ist mitdenken immer noch die> wichtigste Eigenschaft.
Ok nochmal ganz langsam ich bin Anfänger und weiß nicht was der
Optimizer nicht wegoptimiert kann jetzt weiß ich es.
> Dir vielleicht. Mir nicht.> Aber wundere dich nicht, wenn nächstes mal kein Mensch mehr dein> Word-File aufmacht. Ich hab nämlich keine Lust, mir erst mal 250kB> downzuloaden, die durch einen Viren-Checker zu schleusen nur um dann> deinen 5-Zeiler zu sehen.
Ok ich kann Dich verstehen das es zum erkennen des Codes schwer ist da
gebe ich Dir recht. Nächstes mal gerne als .c Und nochmal bin Anfänger
und neu hier. Aber vieleicht kannst Du auch mal mitdenken und auch
vielleicht meine Frage richtig durchlesen ob (da ich ja Anfänger bin)
ich das Eingangsbit an der richtigen stelle im Programm (AVR Studio4)
ändere. Darauf hast du mir keine Antwort gegeben. Und wie soll ich das
in einem .C File bitte machen???
Aber gut ich lass das jetzt das bringt nichts.
Mache ich so wie verlangt aber nochmal spar Dir deine Kommentare bitte
für Leute auf Die davon Ahnung haben und dann solche "dummen" Fehler
machen.
Vito T. schrieb:> und neu hier. Aber vieleicht kannst Du auch mal mitdenken und auch> vielleicht meine Frage richtig durchlesen ob (da ich ja Anfänger bin)> ich das Eingangsbit an der richtigen stelle im Programm (AVR Studio4)> ändere.
Wir sind nicht auf der Nudelsuppe dahergeschwommen.
Davon gehe ich aus, dass du das an der richtigen Stelle machst, zumal es
hier konkret eine Information ist, die irrelevant ist, weil die
Voraussetzungen schon nicht stimmen.
Wenn wir derartige Zusatzinfo benötigen, dann fragen wir schon nach.
Das WICHTIGSTE (3 mal rot unterstrichen) ist immer der Programmcode! Und
je simpler du uns den zugänglich machst, desto besser.
Karl Heinz,
Du hast wirklich fast immer einen unangenehmen Unterton in Deinen
Post´s.
Da gibt es übrigens auch mehrere Mods hier. (auch User wiederum)
So werden Anfänger möglicherweise abgeschreckt, die einfach nur mal aufs
Pferd geholfen werden möchten.
Für Profis noch nicht mal schwere Fragen.
Also:
Nicht vergessen, das JEDER mal ein Beginner war!!
Man muss wissen wo man her kommt.
Carsten
Carsten schrieb:> Karl Heinz,>> Du hast wirklich fast immer einen unangenehmen Unterton in Deinen> Post´s.
Ich hab dann einen unangenehmen UNterton, wenn der Frager auf die
simpelsten Grundlagen, die ich (und ein anderer) ihm vorher gesagt habe,
nicht reagiert.
Ich wiederhol mich nicht gerne zweimal. Entweder die Aussage "du musst
im if auch etwas machen, was nicht wegoptimiert werden kann, zb eine LED
einschalten" reicht (und die muss auch einem Anfänger reichen um zu
wissen was zu tun ist) oder ich werd sarkastisch.
Sorry.
Wir allen waren mal Anfänger. Ich genauso wie alle anderen. Aber
irgendwann muss man mal lernen, dass es auf die Details ankommt.
Hallo Ihr,
Karl Heinz Buchegger schrieb:> "du musst> im if auch etwas machen, was nicht wegoptimiert werden kann
ich muss allerding zugeben, das ich da im ersten Moment an eine
Variablenzuweisung gedacht habe, erst später beim 2ten Nachdenken kam
mir dann auch eine Portzuweisung.
Das Gehirn ist eben kein Prozessor, Leider.
Aber, Jungs!!
Alles wird gut!
Gruß aus NRW
CL