Forum: Mikrocontroller und Digitale Elektronik Steigende Flanke abfragen mit Atmega8515


von Lukas B. (lukas_b29)


Lesenswert?

Hallo zusammen,


zur Situation:

Ich möchte mit einem Atmega8515 ein Befehl einmal ausführen lassen wenn 
ein Taster betätigt wird und dann soll er nichts mehr machen bis der 
Taster erneut betätigt wird.
P.S. Ich habe 4 solche Taster.


mein Problem:

Der folgende Code der den Befehl uart_putc pro Tastendruck einmalig 
ausführen sollte funktioniert nicht wie ich möchte.
(er führt pausenlos uart_putc aus)


Hier der C-Quellcode:
1
int eEin;
2
3
if (PINB & (1<<PB0))
4
{
5
  if (aEIN == 0)
6
  {
7
    uart_putc("a");
8
    aEIN = 1;
9
  }
10
}
11
else
12
{
13
  aEIN = 0;
14
}
Weiss jemand wo der Fehler liegt?


Grüsse

lukas

von (prx) A. K. (prx)


Lesenswert?


von Lukas B. (lukas_b29)


Lesenswert?

Er führt den Befehl auch aus wenn der Taster über lange Zeit gedrückt 
bleibt.

von Dietrich L. (dietrichl)


Lesenswert?

Lukas Barbisch schrieb:
> int eEin;

Ist das ein Schreibfehler? Wenn nicht, sollte es eigentlich eine 
Fehlermeldung geben.

Lukas Barbisch schrieb:
> (er führt pausenlos uart_putc aus)

A. K. schrieb:
> => Entprellung

Das kann es dann aber nicht sein (obwohl Entprellen natürlich notwendig 
ist).

Gruß Dietrich

von Lukas B. (lukas_b29)


Lesenswert?

Also int eEin; gibt bei mir keinen Fehler.
Es könnte aber sein das das Problem da liegt.
Nur zur Klarstellung der ganze Code ausser int eEin; befindet sich in 
der Main Schlaufe.

von Dietrich L. (dietrichl)


Lesenswert?

Lukas Barbisch schrieb:
> Also int eEin; gibt bei mir keinen Fehler.

Bei mir kommt folgender Fehler:

../Test.c:59: error: 'aEIN' undeclared (first use in this function)

Was soll den "eEin" sein? Hast Du auch mal mit dem Simulator getestet, 
was da genau passiert?
Vielleicht solltest Du das komplette Programm anhängen!?

Gruß Dietrich

von Karl H. (kbuchegg)


Lesenswert?

Lukas Barbisch schrieb:
> Also int eEin; gibt bei mir keinen Fehler.
> Es könnte aber sein das das Problem da liegt.
> Nur zur Klarstellung der ganze Code ausser int eEin; befindet sich in
> der Main Schlaufe.

Dann zeig mal alles und wir sortieren uns die Sachen selber raus.
Ist auf jeden Fall besser als wie wenn du das tust, denn dir fehlt die 
Sorgfalt dazu.

von Lukas B. (lukas_b29)


Angehängte Dateien:

Lesenswert?

eEin sollte ein Integer sein.
Vielleicht hat man schon gemerkt das ich nicht vil Ahnung habe von C.
Hier noch der ganze Code:

von Karl H. (kbuchegg)


Lesenswert?

Lukas Barbisch schrieb:
> eEin sollte ein Integer sein.
> Vielleicht hat man schon gemerkt das ich nicht vil Ahnung habe von C.


    if (1 == 0 && !(PINB & (1<<PB0)))

wenn   Eins  gleich Null ist ?

Wann soll das passieren? Am Ende des Universums?

von Lukas B. (lukas_b29)


Lesenswert?

Dieser Teil stammt aus der "Entprellen" Seite
Dort ist es als Flanken abfrage angeschrieben.

von Karl H. (kbuchegg)


Lesenswert?

1
int aEIN;
2
int bEIN;
3
int cEin;
4
int dEin;
5
int eEin;
6
aEIN = 0;
7
bEIN = 0;
8
cEin = 0;
9
dEin = 0;
10
eEin = 0;

Nö. Sorry. Der Code ist noch nie durch den Compiler gegangen. Das 
compiliert nicht.


> Vielleicht hat man schon gemerkt das ich nicht vil Ahnung habe von C.

Das lass ich nicht mehr gelten.
Wenn du kein C kannst, dann musst du es lernen. Und dazu gehört ein 
C-Buch um zumindest die einfachsten Grundlagen in C erst mal zu lernen 
(vorzugsweise auf einem PC). Wenn du dann das erste Drittel eines 
C-Buchs so einigermassen intus hast, hast du das Rüstzeug um dich mit 
den Besonderheiten der µC-Programmierung rumzuschlagen.

Nochmal: C nicht zu können ist schon ok. Aber ein µC ist ein denkbar 
schlechter Computer um die absoluten Basics zu lernen.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Barbisch schrieb:
> Dieser Teil stammt aus der "Entprellen" Seite
> Dort ist es als Flanken abfrage angeschrieben.


Trotzdem. Die Abfrage

   if( 1 == 0 )

wird NIEMALS logisch wahr! Eins ist nun mal immer und an jedem Ort 
UNGLEICH 0. Seit dieses unser Universum existiert, bis es (vielleicht) 
irgendwann wieder in sich zusammenbricht wird 1 (eins) immer ungleich 0 
(null) sein.

D.h. wenn du von dem Code einen Output bekommst, dann hast du uns nicht 
den Code gezeigt, der dir Probleme macht. Ganz abgesehen davon, dass 
dieser Code gar nicht compiliert.

von Lukas B. (lukas_b29)


Lesenswert?

Demfall werde ich mich erst mal ein wenig einlesen und es dann nochmal 
versuchen.

von Karl H. (kbuchegg)


Lesenswert?

Wie sind eigentlich deine Tasten angeschlossen?

Ich sehe, du fragst sie auf gedrückt-0 ab. Ich sehe allerdings keine 
eingeschalteten Pullup-Widerstände. Hast du externe drann?

von Lukas B. (lukas_b29)


Lesenswert?

Ich versuche jetzt mal mein Code selber zu verstehen,
dass ich in jeder Zeile weiss was gemacht wird.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Barbisch schrieb:
> Ich versuche jetzt mal mein Code selber zu verstehen,
> dass ich in jeder Zeile weiss was gemacht wird.

Die Flankenerkennung selbst ist ja nicht falsch. Die ist schon ok. Aber 
das Drumherum strotzt nur so vor Fehlern.
Vielleicht erst mal nur mit EINER Taste anfangen, anstatt gleich aufs 
ganze zu gehen?
(Ich meine: wenn du schon die ersten 10 AVR-Übungsbeispiele übersprungen 
hast, wäre es eine verdammt gute Idee, dann wenigstens mit etwas 
anzufangen, was du noch überblicken kannst)
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
#define F_CPU 12000000
5
#define UBRR_VAL 1 //((12000000/(BAUD*16)-1))
6
7
int aEin = 0;
8
9
int uart_putc(unsigned char c);
10
void uart_puts (char *s);
11
12
int main () {
13
14
  DDRB = 0x00;           // B auf Input
15
  PORTB = (1<<PB0);      // Pullup an PB0
16
17
  // init UART
18
  UBRRH = UBRR_VAL; // set baud rate (9600)
19
  UBRRL = UBRR_VAL>>8;
20
  UCSRB |= (1<<RXEN) | (1<<TXEN); // enable Rx / TxD
21
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); // frame format 8bit data + 1 stop bit
22
23
  while ((1))
24
  {  
25
    if (!(PINB & (1<<PB0)))
26
    {
27
      if (aEIN == 0)
28
      {
29
        uart_puts("a");
30
        aEIN = 1;
31
      }
32
    }
33
    else
34
    {
35
      aEIN = 0;
36
    }
37
  }  
38
}

langt doch fürs erste. (Jetzt mal korrekte Entprellung ignoriert)

von Matthias L. (Gast)


Lesenswert?

>Trotzdem. Die Abfrage

>   if( 1 == 0 )

.. könnte man als Abbruchbedingung für Endlosschleifen nutzen ;-)



>Ich versuche jetzt mal mein Code selber zu verstehen,
>dass ich in jeder Zeile weiss was gemacht wird.

Sollte man als Programmierer sowas können..?

;-)

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.