Forum: Mikrocontroller und Digitale Elektronik Bei Betätigung eines Tasters Strom geben -> Atmega8


von Dave (Gast)


Lesenswert?

Tagchen :)

ich habe ein Problem - ich möchte einen Taster an meinen Atmega hängen. 
Wenn dieser gedrückt wird, soll auf einem anderen Pin Spannung rausgehen 
- aber, warum auch immer - es passiert garnichts :(

Folgender Code:
1
#include <avr/io.h>          // (1)
2
 #include  <avr/delay.h> 
3
int main (void) {            // (2)
4
5
DDRD = 0;
6
DDRD |= (1<<DDD4) | (1<<DDD0); //PD0 und PD4=Ausgang //PD2=Eingang
7
PORTD = 0;
8
9
PORTD |= (1<<PD4); //PD4 ausgabe zum Test -> Strom
10
11
   while(1) {                // (5)
12
     
13
14
 if (bit_is_set (PIND, PIND2))  
15
   {
16
   PORTD |= (1<<PD0);
17
  }
18
  else
19
  {
20
  PORTD &= ~(1<<PD0);
21
  };
22
        }
23
      };

Wenn an PD2 Strom kommt, also Schalter geschlossen wird, sollte PD0 
Active werden, andernfalls aus.

Was mache ich denn falsch? :(

Danke!!!

: Bearbeitet durch User
von Dennis K. (scarfaceno1)


Lesenswert?

Dave schrieb:
> DDRD = 0;
> DDRD |= (1<<DDD4) | (1<<DDD0); //PD0 und PD4=Ausgang //PD2=Eingang
> PORTD = 0;

DDD4 und DDD0....

Das sind nicht die richtigen Bezeichnungen..

von Nico (nico123)


Lesenswert?

Dennis Kaufmann schrieb:
> DDD4 und DDD0....
>
> Das sind nicht die richtigen Bezeichnungen..

Sondern?

@Dave
Ließ dir mal das durch: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

von Oliver (Gast)


Lesenswert?

Falschen Prozessor eingestellt? Welchen Mega nutzt du denn?

Der Code sieht sowei inOrdnung aus, bis auf die fürchterliche 
EInrückung.

Oliver

von Dennis K. (scarfaceno1)


Lesenswert?

Nico ... schrieb:
> Dennis Kaufmann schrieb:
>> DDD4 und DDD0....
>>
>> Das sind nicht die richtigen Bezeichnungen..
>
> Sondern?
>
> @Dave
> Ließ dir mal das durch:
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

Du hast auf Eingänge verlinkt...

Da steht es so:

DDRC  &= ~(1<<PC7);  /* Pin PC7 als Eingang */
PORTC |= (1<<PC7);    /* internen Pull-Up an PC7 aktivieren */

demnach müsste es wohl PD4 und PD0 heissen...

von Nico (nico123)


Lesenswert?

Dennis Kaufmann schrieb:
> Du hast auf Eingänge verlinkt...

Es geht ja auch um den Eingang am Taster!
Dave müsste mal erläutern wie er den Taster angeschlossen hat und ob er 
einen Pullup oder Pulldown nutz usw.
Und das er "DDRD |= (1<<DDD4) | (1<<DDD0);" damit die Ausgänge definiert 
ist vollkommen richtig!

von Felix P. (fixxl)


Lesenswert?

Wie ist der Taster an den Controller angeschlossen? Taster zwischen Pin 
D2 und VCC, dazu ein Pull-Down vom Pin nach Ground?

von Oliver (Gast)


Lesenswert?

Dennis Kaufmann schrieb:
> demnach müsste es wohl PD4 und PD0 heissen...

Na ja, wenn du mal in die header schaust, wirst du festellen, daß das 
alles ein- und dasselbe ist. PD4, DDD4, PIND4, und was es da sonst noch 
alles so gibt, sind alles defines für den Zahlenwert 4. Daran liegt es 
also nicht.

Oliver

von Dennis K. (scarfaceno1)


Lesenswert?

Ok, also ich muss zugeben, dass ich das so noch nie benutzt habe.
Immer nur mit PinX...

Steht unter Datenrichtungen...

Sorry

von Dave (Gast)


Lesenswert?

Ich finde es dennoch immer wieder bemerkenswert, wie halbherzig 
geantwortet wird, obwohl man selbst nur einen kleinen Durchblick hat :) 
Danke aber für die korrekten Antworten. Das Tutorial hab ich ca. schon 9 
mal gelesen und schon sehr viele Projekte mit µC gemacht - aber leider 
war jetzt zwei Jahre Pause - und ich bekomm es nicht mehr zusammen :( 
Und ich wundere mich: Wird der Taster durch einen Widerstand gegen 
Ground angeschlossen? Ich dacht, ich kann einfach einen Taster (mit oder 
ohne R) an VCC und Pin hängen und der Ground läuft über den Ground vom 
µC? Hatte schon 100 mal Taster verbaut, aber ich weiß es einfach nicht 
mehr :D Und ja, der Taster liegt selbstverständlich am PIN2 :)

Also ich habe folgendes gelernt zum Thema:
DDR-> Ein oder Ausgang -> (1<<DDA0)
PORT -> Bei Ausgang Spannung geben und bei Eingsng Pull-up aktivieren -> 
(1<<PA0)
PIN -> zur Abfrage eines Zustands an einem Pin (ist Spannung drauf oder 
nicht?) -> (1<<PINA0)


Damke!! :) :) Vielleicht ist natürlich der entsprechende Widerstand mein 
Problem? :)

Schönen Abend euch!

von Gerald G. (gerald_g)


Lesenswert?

Normalerweise schaltet man den Taster gegen ground. Dann kannst du den 
pullup aktivieren, und brauchst keinen externen widerstand.

Dave schrieb:
> if (bit_is_set (PIND, PIND2))
Diese Funktion kenne ich nicht, ich schreibe da


If ( ! ( PIND & (1 << PD2))

Und wie gesagt, taster gegen ground und pullup aktivieren

: Bearbeitet durch User
von Dennis Kaufmann (Gast)


Lesenswert?

Also im Prinzip ist es völlig egal, ob Du die Bezeichnung PCX, DDCX, 
PINCX oder PORTCX schreibst. Das sind immer nur Entsprechungen für eine 
Zahl.

PC1, PORTC1, DDC1 und PINC1 entsprechen alle einfach der Zahl 1.

Ich habe aus der "m8def.inc", der include Datei des Atmega8 mal den 
zutreffenden Teil als Beleg beigefügt.

1
; ***** PORTC ************************
2
; PORTC - Port C Data Register
3
.equ  PORTC0  = 0  ; Port C Data Register bit 0
4
.equ  PC0  = 0  ; For compatibility
5
.equ  PORTC1  = 1  ; Port C Data Register bit 1
6
.equ  PC1  = 1  ; For compatibility
7
.equ  PORTC2  = 2  ; Port C Data Register bit 2
8
.equ  PC2  = 2  ; For compatibility
9
.equ  PORTC3  = 3  ; Port C Data Register bit 3
10
.equ  PC3  = 3  ; For compatibility
11
.equ  PORTC4  = 4  ; Port C Data Register bit 4
12
.equ  PC4  = 4  ; For compatibility
13
.equ  PORTC5  = 5  ; Port C Data Register bit 5
14
.equ  PC5  = 5  ; For compatibility
15
.equ  PORTC6  = 6  ; Port C Data Register bit 6
16
.equ  PC6  = 6  ; For compatibility
17
18
; DDRC - Port C Data Direction Register
19
.equ  DDC0  = 0  ; Port C Data Direction Register bit 0
20
.equ  DDC1  = 1  ; Port C Data Direction Register bit 1
21
.equ  DDC2  = 2  ; Port C Data Direction Register bit 2
22
.equ  DDC3  = 3  ; Port C Data Direction Register bit 3
23
.equ  DDC4  = 4  ; Port C Data Direction Register bit 4
24
.equ  DDC5  = 5  ; Port C Data Direction Register bit 5
25
.equ  DDC6  = 6  ; Port C Data Direction Register bit 6
26
27
; PINC - Port C Input Pins
28
.equ  PINC0  = 0  ; Port C Input Pins bit 0
29
.equ  PINC1  = 1  ; Port C Input Pins bit 1
30
.equ  PINC2  = 2  ; Port C Input Pins bit 2
31
.equ  PINC3  = 3  ; Port C Input Pins bit 3
32
.equ  PINC4  = 4  ; Port C Input Pins bit 4
33
.equ  PINC5  = 5  ; Port C Input Pins bit 5
34
.equ  PINC6  = 6  ; Port C Input Pins bit 6

von Dennis K. (scarfaceno1)


Lesenswert?

@ Oliver:

Hattest es ja schon beschrieben.

Sorry, konnte gestern und heute morgen keine neuen Posts sehen. Nach 
absenden meines Posts standen dann plötzlich viel mehr dort...

: Bearbeitet durch User
von Felix P. (fixxl)


Lesenswert?

Dave schrieb:
> Und ich wundere mich: Wird der Taster durch einen Widerstand gegen
> Ground angeschlossen? Ich dacht, ich kann einfach einen Taster (mit oder
> ohne R) an VCC und Pin hängen und der Ground läuft über den Ground vom
> µC?
Ein als Eingang geschalteter Pin hängt grundsätzlich erst einmal in der 
Luft, ist also weder auf VCC- noch auf GND-Level, sondern nimmt den 
Pegel an, den man ihm von außen aufzwingt. Ein Taster/Schalter - ich 
gehe hier von einem Schließer aus - dient dazu, den Pin niederohmig mit 
einem der beiden Niveaus zu verbinden, man muss aber sicherstellen, dass 
sicher das andere Niveau angenommen wird, solange der Taster nicht 
gedrückt wird. Das geschieht in der Regel etwas hochohmiger mit einem 
Widerstand.

Je nachdem, ob man den Taster "active-low" (Taster zieht Pin auf GND) 
oder "active-high" (Taster zieht Pin auf VCC) einsetzen möchte, ergeben 
sich folgende Reihenschaltungen:

Active low:  VCC --- Widerstand --- Pin --- Taster --- GND
Active high: VCC --- Taster --- Pin --- Widerstand --- GND

Der Widerstand bei active low zieht den Pin bei offenem Taster "nach 
oben" auf VCC und wird daher als Pull-Up-Widerstand bezeichnet, bei 
active high zieht der Widerstand auf GND und wird deshalb Pull-Down 
genannt.

Da es bei den Atmel-Controllern interne Pull-Ups gibt, die man per 
Software aktivieren kann, aber keine internen Pull-Downs, nutzen die 
meisten Programmierer Taster und Schalter in Active-Low-Verschaltung - 
man spart sich einfach ein externes Bauteil.

> Also ich habe folgendes gelernt zum Thema:
> DDR-> Ein oder Ausgang -> (1<<DDA0)
> PORT -> Bei Ausgang Spannung geben und bei Eingsng Pull-up aktivieren ->
> (1<<PA0)
> PIN -> zur Abfrage eines Zustands an einem Pin (ist Spannung drauf oder
> nicht?) -> (1<<PINA0)
Das ist so korrekt. Willst du also D2 als deinen Tasterpin mit aktivem 
Pull-Up nutzen, lautet die Einstellung:
1
DDRD &= ~(1<<PD2);
2
PORTD |= (1<<PD2);

Im Programm kannst du dann mit
1
if(!(PIND & (1<<PD2))) {
2
 ...
3
}
abfragen, ob der Taster gedrückt ist (also der Pin auf GND gezogen ist), 
und die entsprechenden Aktionen veranlassen. Das Thema "Prellen" lasse 
ich dabei zunächst mal außen vor.

: Bearbeitet durch User
von Dave (Gast)


Lesenswert?

Supergeil!!

Danke, hab meine Schaltung nun erfolgreich fertig :)
Taster auf GND ziehen...hätte ich mir wohl merken sollen :)

Danke!

Dave

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.