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
intmain(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!!!
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..
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!
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
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!
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
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
@ 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...
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.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.