Forum: Mikrocontroller und Digitale Elektronik AVR atmega 48 Problem mit schaltung


von Florian L. (ironalf)


Angehängte Dateien:

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 ^^.

von Wolfgang (Gast)


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.

von Florian L. (ironalf)


Lesenswert?

Pullups werden doch nur aktiviert wenn man auf einen PIN als Ausgang 
definiert oder?

Ich hatte eigentlich vor über den Schalter PD0 auf high zu setzten und 
dann halt im µC dadurch die LED an PB0 zum leuchten zu bringen.

Meinst du sowas wie low active oder was?

von Christian F. (cmf) Benutzerseite


Lesenswert?

Florian Loers schrieb:
> Pullups werden doch nur aktiviert wenn man auf einen PIN als Ausgang
> definiert oder?

Zum aktivieren der Pullups:
1
PORTD = 0xff;

von Florian L. (ironalf)


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.

von Christian F. (cmf) Benutzerseite


Lesenswert?

Florian Loers schrieb:
> Kannst du mir auch erklären warum dass jetzt funktioniert und nicht wenn
> die Pullups nich an sind? Nur aus Interesse.
Das liegt daran, weil der Pin sonst in der Luft hängt und "irgendwelche, 
komischen, undefinierbaren" Signale auffängt. Aber eben kein Plus.

von Florian L. (ironalf)


Lesenswert?

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

von Christian F. (cmf) Benutzerseite


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

von Florian L. (ironalf)


Lesenswert?

Entschuldigung. Ich habe schon viel mit dem Tut gearbeitet. Hab das wohl 
irgendwie durcheinander gebracht. Dankeschön nochmal :D

von Florian L. (ironalf)


Lesenswert?

Bzw unser Lehrer hat uns mal erklärt das der befehl PINX nur für 
Eingänge und PORTX nur für Augänge gilt und das ansonsten das gleiche 
ist... insofern weiß ich ja wo die Verwirrung her kommt.

von Christian F. (cmf) Benutzerseite


Lesenswert?

Florian Loers schrieb:
> Bzw unser Lehrer hat uns mal erklärt das der befehl PINX nur für
> Eingänge und PORTX nur für Augänge gilt und das ansonsten das gleiche
> ist... insofern weiß ich ja wo die Verwirrung her kommt.

Den Lehrer würde ich gerne mal kennenlernen... ;)

von Florian L. (ironalf)


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.

von Thomas E. (thomase)


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.

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.