Forum: Mikrocontroller und Digitale Elektronik TASTENABFRAGE


von Samet Y. (samet)


Lesenswert?

Hallo ich habe da so eine komische frage:) ich bin noch neu in diesem 
gebiet und wollte mal etwas fragen... ich habe auf meinem experimentier 
board 3 leds und sobald ich auf die taste klicke leuchen diese leds... 
was jetzt aber das porblem ist das wenn ich auf die taste klicke dann 
wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion 
durch... Ich würde aber gerne die Taste nicht auf masse schliesen 
sondern auf VCC... damit meine ich das wenn ich auf die taste klicke 
fliest eine 5V spannung in den PORT PC0 hinein... wie kann ich das 
abfragen? wie kann ich dem atmega sagen das er auf PC0 warten soll bis 
eine spannung reinfliest und fals eine fliest soll er eine aktion 
durchführen?

von Pascal H. (pase-h)


Lesenswert?

Zuersteinmal solltest du uns etwas über deinhe Programmierumgebung 
erzählen, da dir sonst niemand wirklich helfen kann.
z.B:
Welche Sprache (basic, c, asm)
welches Board (stk500 o.ä.)

Mfg Pase

von Peter D. (peda)


Lesenswert?

Samet Yildirim schrieb:
> ich habe auf meinem experimentier
> board 3 leds und sobald ich auf die taste klicke leuchen diese leds...

Dann versuche doch erstmal, diesen Code zu verstehen, d.h. warum er so 
funktioniert.
Es hat keinen Zweck, wenn Dir jemand ne Lösung gibt, die Du dann auch 
nicht kapierst.

> was jetzt aber das porblem ist das wenn ich auf die taste klicke dann
> wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion
> durch...

Dann überlege mal, warum derjenige das so gemacht hat (siehe Datasheet, 
Stichwort Input mit internem Pullup). Er war jedenfalls nicht dumm.


> Ich würde aber gerne die Taste nicht auf masse schliesen
> sondern auf VCC...

Kann man machen. Aber wie kommt dann low-Pegel auf den Pin, wenn die 
Taste nicht gedrückt ist ???


> damit meine ich das wenn ich auf die taste klicke
> fliest eine 5V spannung in den PORT PC0 hinein... wie kann ich das
> abfragen?

Nachdem Du Deinen Beispielcode verstanden hast, weißt Du es selber.


> wie kann ich dem atmega sagen das er auf PC0 warten soll bis
> eine spannung reinfliest und fals eine fliest soll er eine aktion
> durchführen?

Spannung fließt niemals!
Es fließen nur kurzzeitig Umladeströme um die parasitäre Pin-Kapazität 
umzuladen.
D.h. für low- und auch high-Pegel mußt Du einen (sehr kleinen) Strom 
bereitstellen.


Peter

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Samet Yildirim schrieb:

> was jetzt aber das porblem ist das wenn ich auf die taste klicke dann
> wird PC0 auf Masse geschlossen und dann führt mein atme8 eine aktion
> durch...

Also ist im Ruhezustand (Taste nicht gedrückt) PC0 mit Vcc verbunden: 
active low. Zur Verbindung wird i.d.R. ein Pull-up-Widerstand verwendet. 
Der kann innerhalb des Atmega sitzen oder außerhalb (externer Pull-up).

Linkes Bild in
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter

> Ich würde aber gerne die Taste nicht auf masse schliesen
> sondern auf VCC... damit meine ich das wenn ich auf die taste klicke
> fliest eine 5V spannung in den PORT PC0 hinein...

Also eine active high Schaltung
Rechtes Bild in
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter

> wie kann ich das
> abfragen?

Indem du die umgekehrte Logik wie bei der bisherige Abfrage benutzt und 
die Hardware entsprechend umbaust. Ggf. muss auch das Programm verändert 
werden, wenn interne Pull-Ups (s.o.) benutzt wurden.

Leider fehlt dein Programm, so dass man die bisherige Abfrage nicht 
sieht. Je nach Programmiersprache ist es mehr oder minder kompliziert 
die Befehlslogik "umzudrehen".

Fang ruhig an und überlege dir was du umbauen und umprogrammieren 
willst. Wenn du Bedenken hast das auf deinem Board umzusetzen, frag 
vorher, ob du alles richtig gemacht hast.

Denke aber daran, dass wir hier Quellcodes und Schaltpläne mehr als 
missverständliche Beschreibungen in Prosa lieben!

Wenn du obiges gelöst hast, erklärt sich das folgende "von selbst"

> wie kann ich dem atmega sagen das er auf PC0 warten soll bis
> eine spannung reinfliest und fals eine fliest soll er eine aktion
> durchführen?

von Harald (Gast)


Lesenswert?

> fliest eine 5V spannung
oha...

von Samet Y. (samet)


Lesenswert?

Bedanke mich für die schnellen antworten hat mir wirklich weiter 
geholfen... ich habe kein beispiel code verwendet ich habe das so weit 
bis jetzt selber gemacht... ich werde euch mal den code von mir schicken 
wie es ausschaut...

BITTE NICHT AUSZUCKEN KÖNNTE SEIN DAS DER CODE DURCHEINANDER IST und 
anfäger mäsig programmiert ist aber ich poste ihn trozdem einmal.
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <stdint.h>
4
#ifndef F_CPU
5
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
6
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb
7
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
8
   "nachträgliche" Definition hinweist */
9
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */
10
#endif
11
#include <util/delay.h>
12
13
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
14
{
15
    if ( ! (*port & (1 << pin)) )
16
    {
17
        /* Pin wurde auf Masse gezogen, 100ms warten   */
18
        //_delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
19
        //_delay_ms(50); 
20
        //if ( *port & (1 << pin) )
21
        //{
22
            /* Anwender Zeit zum Loslassen des Tasters geben */
23
            //_delay_ms(50);
24
            //_delay_ms(50); 
25
            //return 1;
26
        //}
27
    return 1;
28
    }
29
    return 0;
30
}
31
 
32
void ampel(){
33
      PORTB |= (1 << PB2);  // Toggle PB0 z.B. angeschlossene LED
34
      _delay_ms(1000);        // Eine Sekunde +/-1/10000 Sekunde warten...
35
          PORTB |= (1 << PB1); 
36
      _delay_ms(300);                        // funktioniert nicht mit Bibliotheken vor 1.6
37
      PORTB &= ~(1 << PB1);
38
      PORTB &= ~(1 << PB2);
39
      PORTB |= (1 << PB0);
40
      _delay_ms(1000);
41
      PORTB &= ~(1 << PB0);
42
      _delay_ms(100);
43
      PORTB |= (1 << PB0);
44
      _delay_ms(100);
45
      PORTB &= ~(1 << PB0);
46
      _delay_ms(100);
47
      PORTB |= (1 << PB0);
48
      _delay_ms(100);
49
      PORTB &= ~(1 << PB0);
50
      _delay_ms(100);
51
      PORTB |= (1 << PB1);
52
      _delay_ms(500);
53
      PORTB &= ~(1 << PB1);
54
      PORTB |= (1 << PB2);
55
      _delay_ms(100);
56
      PORTB &= ~(1 << PB2);
57
}
58
59
int main( void )
60
{
61
    DDRB |= ( 1 << PB0 );       // PB0 an PORTB als Ausgang setzen
62
  DDRB |= ( 1 << PB1 );
63
  DDRB |= ( 1 << PB2 );
64
  DDRC &= ~( 1 << PC0 ); 
65
  PORTC |= ( 1 << PC0 );
66
67
    while( 1 ) {                // Endlosschleife
68
69
    if (debounce(&PINC, PC0)){
70
            ampel();
71
        
72
    }
73
    }
74
    return 0;
75
}

also was ich eigentlich VERMUTE WAS VERÄNDERT GEHÖRT ist dieser teil 
oder?
1
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
2
{
3
    if ( ! (*port & (1 << pin)) )
4
    {

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Quellcode zeigen ist eine gute Idee. Im allgemeinen wird der auch nicht 
"zerrissen" (außer der TO bettelt darum :-)

>   DDRC &= ~( 1 << PC0 ); // Eingang: Taster an PC0
>   PORTC |= ( 1 << PC0 ); // interner Pull-up aktiviert
>   if ( debounce(&PINC, PC0) != 0 ) // ausführliche Schreibweise

Wenn du die Schaltung so wie im rechten Bild oben aufgebaut hast, also 
active high Taster mit externem Pull-Down Widerstand, dann änderte in:

   DDRC &= ~( 1 << PC0 );  // Eingang: Taster an PC0
   PORTC &= ~( 1 << PC0 ); // interner Pull-Up NICHT aktiviert
   if ( debounce(&PINC, PC0) == 0 )

von Samet Y. (samet)


Lesenswert?

super danke hat funktioniert:)

dann hätte ich noch eine kleine frage... ich würde das gerne verstehen 
was ich da gemacht habe... Also dieser Pullup wiederstand hängt auf 
masse. Was ich aber sehr komisch finde ist das ohne dem wiederstand der 
chip an pc0 ein signal bekommt. ich würde gerne wissen was dieser 
wiederstand dort ausübt? und was es bewirkt wenn es auf masse steht? 
DANKE FÜR DIE HILFE AN ALLE

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der Pull-Down Widerstand (Down weil es "runter" auf Spannungspotential 
GND 0V geht und nicht Up auf Spannungspotential Vcc z.B. +5V) sorgt 
einmal für eine elektrische Verbindung und zum zweiten für eine 
Strombegrenzung, wenn der Stromkreis aktiviert wird (Ohmsches Gesetz).

Wie die Eingangsschaltung am Pin PC0 innerhalb des µCs aussieht, kannst 
du im Datenblatt des µCs sehen. Ohne den Pull-Down und bei nicht 
gedrückter Taste ist der PC0 Eingang nirgends an einem geschlossenen 
Stromkreis angeschlossen, d.h. er liegt auf keinem der beiden 
definierten Potentiale Vcc oder GND.

Was der µC dann aus einen undefinierten Potential macht, ist nicht 
voraussehbar. Es kann irgend einer der beiden logischen Zustände HIGH 
(HIGH-Schwellwert bis Vcc) oder LOW (GND bis LOW-Schwellwert) oder im 
logisch verbotenen Gebiet sein (LOW-Schwellwert bis HIGH-Schwellwert) 
und "irgendein Zustand" ist für die sichere Funktion eines Programms 
nicht geeignet. Deshalb gibt man per Schaltung ein definiertes 
Ruhepotential vor: über den Widerstand eben.

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.