AVR atmega 48 Problem mit schaltung

OP #2699343
Lesenswert?

Hallo,

ich wollte mich mal mit dem Programmieren von µCs beschäftigen und habe 
mir einen atmega644P gekauft und entsprechend diesem Tutorial: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment
und dem erfos Prog-S ISP-Programmer eine Platine gebastelt.

Das hat bedingt Funktioniert nur hatte ich Probleme mit dem Abfragen von 
Eingängen.
Daraufhin habe ich mir Steckbrett und ein Spannungsmessgerät gekauft. 
auf dem Steckbrett habe ich nun einen Atmega48 benutzt, da ich mir nicht 
sicher bin ob das Problem am Controller liegt und ich lieber die 
Billigeren zerschieße.

Soweit so gut hat das dann auch mit dem Datenblatt 
(http://www.atmel.com/Images/doc2545.pdf) geklappt. Wenn ich nun Pins 
als Ausgänge definiere und auf High setzte habe ich auch konstant 5V und 
andersrum auch 0V. Wenn ich jedoch einen Pin als Eingang nehme und mit 
nem Taster per Abfrage ne LED bei zum leuchten bringen will klappt nix.

Die LED leuchtet ununterbrochen etwas dunkler und sobald ich den Taster 
drücke, leuchtet sie heller. Vorwiderstand is drin, Kondensatoren auch. 
Am Ausgang messe ich ohne Knopfdruck knapp über 1V.


Hier mein Code:

#include <avr/io.h>

int main(void)
{
    while(1)
    {
        DDRD=0x00;
    DDRB=0xFF;

    if(PIND & (1<<PD0))
    {
      PORTB=(1<<PB0);
    }else
    {
      PORTB=0x00;
    }
  }
}

Ich hab einfach überhaupt keine Ahnung was ich falsch mache. Hilfe wäre 
an der Stelle echt super :D

Achja wenn ich mit dem Messgerät an den Ausgang am µC gehe dann leuchtet 
die LED nicht mehr - nur noch bei Tastendruck ^^.
Angehängte Dateien:
Gast #2699348
Lesenswert?

Florian Loers schrieb:
> Wenn ich jedoch einen Pin als Eingang nehme und mit nem Taster per
> Abfrage ne LED bei zum leuchten bringen will klappt nix.

Ein bisschen kommt es auf deine Schaltung drauf an. Falls dein Taster 
nach Gnd schaltet, brauchst du einen Pull-Up Widerstand. Am einfachsten 
ist, wenn du den internen aktivierst.
OP #2699376
Lesenswert?

xD ok ich hab nicht gewusst dass das klappt.  ICh hab gelernt dass man 
die so als Ausgänge einstellt. und mit 0 halt als Eingang und irgendwie 
is der schalter ja n Eingang hm...

100 Dank für die Hilfe :D
Kannst du mir auch erklären warum dass jetzt funktioniert und nicht wenn 
die Pullups nich an sind? Nur aus Interesse.
Persönliche Seite #2699395
Lesenswert?

Florian Loers schrieb:
> Ok und wofür braucht man dann DDRA=0x00; ? Also wann braucht man keine
> Pullupwiderstände?

Hä? Also nochmals zusammengefasst:

DDRX=1:
 AUSGANG
 Mit PORTX=1 wird der Ausgang "angeschaltet" (gesetzt)
 Mit PORTX=0 wird der Ausgang "ausgeschaltet"
 Mit PINX=1 kann bei manchen AVRs der Ausgang getoggelt werden

DDRX=0:
 EINGANG
 Mit PORTX=1 wird der Pullup aktiviert
 Mit PORTX=0 wird der Pullup deaktiviert
 Mit PINX kann man den Eingang abfragen

Bitte lies das AVR-GCC-Tutorial!!!

Vor allem: AVR-GCC-Tutorial: Zugriff auf IO-Ports
OP #2699429
Lesenswert?

Wir haben immer nur alles Theoretisch gemacht. Irgenwann hab ihc mir mal 
das STK 600 mit nach Hause genommen und den ganzen kram ausprobiert: Nix 
hat funktioniert. Außer das erste Programm... Lauflicht. :D naja

Ich will n Roboter bauen (Kindheitstraum) und fang halt jetzt wo abi 
durch is mal die 3 Jahre unterricht nachzuholen :D

Ich bastel die Tage nochmal ne kleine "Huckepack" ISP-Platine. Sollte 
ich Fragen dazu hier wieder stellen oder einen neuen Beitrag?  Ich frag 
weil ich tatsächlich noch nie bisher selber was in nem Forum fragen 
musste :D  bisher haben immer andere meine Fragen gestellt.
#2699481
Lesenswert?

Florian Loers schrieb:
> Ok und wofür braucht man dann DDRA=0x00; ? Also wann braucht man keine
> Pullupwiderstände?
Da hat dein Lehrer etwas Verwirrung gestiftet. Obwohl er nicht 
grundsätzlich Unrecht hat mit den Pullups und den Eingängen. Das ist bei 
verschiedenen Controllern, allen voran 8051, auch so.
Nur beim AVR ist es eben nicht so!
Beim AVR wird zwischen Eingang und Ausgang umgeschaltet. Dazu sind die 
DDR-Register. 0 = Eingang, 1 = Ausgang.
Einen Pullup braucht man z.B. wenn man einen Taster einlesen will. 
Solange der Taster offen ist, hängt der Portpin in der Luft. Deswegen 
schaltet man ihn über den (eingebauten) Pullup an Vcc. Und legt mit dem 
Betätigen des Tasters GND an.

mfg.

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