Forum: Compiler & IDEs Flankenauswertung für zwei Porteingänge


von Vito T. (2nc)


Lesenswert?

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

von xfr (Gast)


Lesenswert?

Zeig doch mal, was Du schon hast und was daran nicht funktioniert.

von Vito T. (2nc)


Angehängte Dateien:

Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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?

von Vito T. (2nc)


Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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

von Vito T. (2nc)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

nehmen wir den Code mal raus, damit man was zum Reden hat
1
#define WARTEPIN1 PINB
2
#define BIT1 PB0
3
#define BIT2 PB1
4
#define BIT3 PB2
5
#define BIT4 PB3
6
#define BIT5 PB4
7
#define BIT6 PB5
8
9
10
#include <avr/io.h>
11
  
12
13
int main (void) {
14
  
15
  PORTA   = 0x3F;        //PIN 0-5 werden Eingeschaltet
16
  PORTB  = 0x03;        //PIN 0-2 werden Eingeschaltet        
17
  PORTD  = 0xFF;        //Alle Pins Eingeschaltet
18
  DDRA   = 0x00;        //PortA als Eingänge deklariert
19
  DDRB  = 0xC0;        //PortB als Eingänge deklariert
20
  DDRD  = 0xFF;        //PortD als Ausgänge deklariert
21
  ACSR  = 0x80;        //Analog Comperator abgeschaltet
22
  
23
uint8_t  u8Sample;
24
uint8_t  u8SampleLast;
25
  while(1) {
26
      u8Sample = PINB & (1<<BIT1);              // Signal einlesen
27
28
      if (u8Sample != 0 && u8SampleLast == 0 ){        // pos Flanke
29
      
30
      }
31
      u8SampleLast = u8Sample;
32
  }
33
}

von Karl H. (kbuchegg)


Lesenswert?

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!
1
      if (u8Sample != 0 && u8SampleLast == 0 ){        // pos Flanke
2
        LED einschalten, Hupe einschalten, Kurschluss auslösen
3
        Badezimmer überschwemmen, ....
4
        egal was. Hauptsache du tust irgendwas an dieser Stelle
5
        was nicht wegoptimiert werden kann.
6
      }

von Vito T. (2nc)


Lesenswert?

Hm! Ok ich probier es mal. Ich geb dann nochmal bescheid

von Vito T. (2nc)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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

von Karl H. (kbuchegg)


Lesenswert?

1
#define WARTEPIN1 PINB
2
#define BIT1 PB0
3
#define BIT2 PB1
4
#define BIT3 PB2
5
#define BIT4 PB3
6
#define BIT5 PB4
7
#define BIT6 PB5
8
9
10
#include <avr/io.h>
11
  
12
13
int main (void)
14
{
15
  uint8_t  u8Sample;
16
  uint8_t  u8SampleLast;
17
18
  DDRD = 0xFF;
19
  PORTF = 0x00;
20
21
  PORTB |= ( 1 << BIT1 );   // Pull up ein
22
23
  u8SampleLast = PINB & (1<<BIT1);
24
25
  while(1) {
26
      u8Sample = PINB & (1<<BIT1);
27
28
      if (u8Sample != 0 && u8SampleLast == 0 ) {
29
        PORTF = 0xFF;
30
      }
31
      else if( !u8Sample )
32
        PORTF = 0x00;
33
34
      u8SampleLast = u8Sample;
35
  }
36
}

von Vito T. (2nc)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vito T. (2nc)


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vito T. (2nc)


Lesenswert?

ok danke!

von Carsten (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vito T. (2nc)


Lesenswert?

Vielen Dank Carsten für deinen Beistand und dein Verständnis!

von Carsten (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.