Steigende Flanke abfragen mit Atmega8515

OP #3103578
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
#3103659
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.
#3103661
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.
#3103687
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)
Gast #3103694
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..?

;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren