Forum: Mikrocontroller und Digitale Elektronik Verständniss Problem und allgemeine Fragen


von Beginner (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei mich in das Thema µC einzuarbeiten.

Um in der Praxis auch tätig zu sein, habe ich mir das Pollin Board v2.0 
bestellt und programmiere mit einem ATMEG32.

Die Inbetriebnahme des Board hat geklappt und einfach mal die 2 LED´s 
anschalten funktioniert auch super.

Bin nun dabei eine einfache Abfrage zu schreiben.

Lese Taste 1 ein und wenn dieser gedrückt wurde, schalte LED 1 ein.

Aber irgendwie klappt das bei mir nicht.

Anbei mein Programm:


#include <avr/io.h>

int main (void){

DDRD = 0b11100000; //Eingänge und Ausgänge definieren
PORTD = 0b00011100; //Pull UP Widerstände aktivieren

if (PIND == 0b00000100) // Abfragen ob Taster  1 gedrückt wurde
{
PORTD = 0b00100000;   // Wenn ja dann Ausgang setzen, LED an
}

return 0;
}


Habe schon ein Teil der beiden Tutorials gelesen.

Und da fangen auch meine Frage an:
1) Muss ich bei Tastern immer die Pull-UP Widerstände aktivieren, wenn 
ich extern keine habe? Habe das noch nicht ganz verstanden. Im Tutorial 
gibs ja die Übersicht, aber mich verwirrt das immer noch bißel, da ich 
denke das ich mir Bits überschreibe z.b sage ich PORTD = 0b00011100, was 
passiert denn wenn ich danach das 3.Bit bei PortD setze? Verliert er 
dann die Info das der Pull UP an dieser Stelle aktiv sein sollte? 
Vielleicht könnte mir das einer noch mal erklären. Stehe da noch auf dem 
Schlauch
2) Welche Sprache ist besser für den Anfang Assembler oder C? Habe gute 
Kenntnisse in C. Was wird bei den meisten Firmen bevorzugt?
3) Kann ich auch die Pins mit z.B. PIND.2 einlesen, abfragen PIND.2 ==1? 
Bekomme immer die Fehlermeldung das es ein Floatformat ist. Oder muss 
das in Hexa, Binär aufgeschrieben werden PIND.2 = 0x00000100?
4) Was ist in meinem obrigen Programm noch falsch, das ich die Eingänge 
nicht einlesen kann?
5) Wie kann ich eigentlich hier meinen Code richtig im Forum einbinden? 
Da steht ja was von  [/code]. Muss das am Anfang und Ende des codes 
stehen?


Hoffe ihr könnt Helfen.

Danke,
Gruß

von Ro R. (rond_es)


Lesenswert?

Mach mal ein  while(1){  ... } oder for(;;) {...   }  um die if Abfrage. 
Du fragst nur einmal, dann ist dein Programm bereits fertig.


while(1) {
if (PIND == 0b00000100) // Abfragen ob Taster  1 gedrückt wurde
{
PORTD = 0b00100000;   // Wenn ja dann Ausgang setzen, LED an
}
}

Zum Rest kann ich nicht viel sagen, weil ich nicht mit AVRs arbeite.

von Oliver J. (skriptkiddy)


Lesenswert?

Beginner schrieb:
> 1) Muss ich bei Tastern immer die Pull-UP Widerstände aktivieren, wenn
> ich extern keine habe? Habe das noch nicht ganz verstanden. Im Tutorial
> gibs ja die Übersicht, aber mich verwirrt das immer noch bißel, da ich
> denke das ich mir Bits überschreibe z.b sage ich PORTD = 0b00011100, was
> passiert denn wenn ich danach das 3.Bit bei PortD setze? Verliert er
> dann die Info das der Pull UP an dieser Stelle aktiv sein sollte?
> Vielleicht könnte mir das einer noch mal erklären. Stehe da noch auf dem
> Schlauch
Pullups können nur aktiv sein, wenn der jeweilige Pin als Eingang 
konfiguriert ist. Bein pollinboard sind die pullups aber sinnlos. Da 
haben die Taster nämlich externe Pulldown-Widerstande.


> 2) Welche Sprache ist besser für den Anfang Assembler oder C? Habe gute
> Kenntnisse in C. Was wird bei den meisten Firmen bevorzugt?
Assembler gibt dir Feeling für die Hardware und von da her ist es 
sinnvoll die ersten programme in Assembler zu schreiben.


> 3) Kann ich auch die Pins mit z.B. PIND.2 einlesen, abfragen PIND.2 ==1?
> Bekomme immer die Fehlermeldung das es ein Floatformat ist. Oder muss
> das in Hexa, Binär aufgeschrieben werden PIND.2 = 0x00000100?
Nein geht nicht.


> 4) Was ist in meinem obrigen Programm noch falsch, das ich die Eingänge
> nicht einlesen kann?
if (PIND == 0b00000100) // Abfragen ob Taster  1 gedrückt wurde
Hier muss exakt das Bitmuster anliegen. Tut es das denn? Außerdem musst 
du dein Programm in einer Endlosschleife fangen. Das kann nirgendwo hin 
zurückkehren.


> 5) Wie kann ich eigentlich hier meinen Code richtig im Forum einbinden?
> Da steht ja was von  [/code]. Muss das am Anfang und Ende des codes
> stehen?
[c ]...[/c]
[code ]...[/code]
Die Leerzeichen nach c und code noch entfernen

von Beginner (Gast)


Lesenswert?

Stimmt, das hatte ich vergessen.

Habe dies nun angewendet aber der Eingang wird unregelmäßig abgefragt.

Teilweise geht die LED erst nach dem 10 mal drücken an, bzw wenn der 
Taster länger gedrückt wird.

Woran liegt das, das dort keine definierte Abfrage erfolgt?

von Charly B. (charly)


Lesenswert?

i vermute das die anderen Pins von port D 'floaten'
dh. du must den Pin filtern vor dem vergleich
irgend wie in der art dummy = pind AND 0b00000100
so ist sichergestellt das nur bit2 noch relevant ist

vlG
Charly

von ich (Gast)


Lesenswert?

Beginner schrieb:
> PORTD = 0b00011100; //Pull UP Widerstände aktivieren
>
> if (PIND == 0b00000100) // Abfragen ob Taster  1 gedrückt wurde
> {
> PORTD = 0b00100000;   // Wenn ja dann Ausgang setzen, LED an

Ich weiß nicht, ob du das schon geändert hast (neue version evtl 
posten), aber werden die Pull-up-Widerstände mit dem gleichen Register 
gesetzt, wie auch die Ausgänge?? Zuerst schreibst du nämlich in "PORTD" 
deine Einstellung für die pullups und bei der if-abfrage schreibst du in 
"PORTD" den Ausgangsstatus des Ports.

Ich hatte das mal, dass ich vergessen hatte, den ADC auszuschalten, der 
am Port hängt. Allerdings bei einem anderen Controller. Vielleicht hast 
du ja auch am PORTD eine höherwertige Funktion als den digitalen Input 
bzw. Output. Zusätzlich kann es sein, wenn du pullups im µC und 
pulldowns auf dem Board hast, dass er so in der Mitte vom Logikpegel ist 
und er wackelt quasi

von oldmax (Gast)


Lesenswert?

Hi
Wenn du die Taster auf deinem Board benutzt, MUSST du die Pull-Up 
deaktivieren, sonst hast du am Eingang einen Spannungsteiler! Das Board 
hat wie bereits erwähnt externe Pull-Down !
Gruß oldmax

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.