PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Led einschalten



H3llGhost
22.08.2008, 17:24
Hallo Leute,

ich wollte heute mal was ganz simples machen.
Ich schalte eine Led auf einen Board mit dem µC ATmega168 ein.
Dazu folgender Code:

[php:1:4ed1cc49a1]
#include <avr/io.h>

int main()
{
PORTD |= (1<<PD7);
while(1)
{

}
return 0;
}
[/php:1:4ed1cc49a1]

Resultat davon ist es leuchtet nichts.
Derselbe Code in Assembler funktioniert.

Deswegen frage ich euch nach einem Rat:
Was mache ich falsch?

radbruch
22.08.2008, 17:32
Datenrichtung von PD7 auf Ausgang setzen:

DDRD |= (1<<PD7);

Vorwiderstand für die LED nicht vergessen!

Gruß

mic

H3llGhost
22.08.2008, 17:38
Verdammter Mist ... :D
Hätte ich auch selber drauf kommen können ... ;)
Weil so unerfahren bin ich ja auch nicht, aber ich dachte ...

Danke!

EDIT:

Mal so ne andere Frage:
Wenn ich einen Schalter habe der direkt am µC angeschlossen ist und gegen Masse, wie kann ich überprüfen, ob der betätigt wird?

Ich lege eine Spannung an und überprüfe mit einem weiteren Eingang ob es einen Spannungsabfall gibt?
Oder liege ich damit total falsch?

fhs
22.08.2008, 18:43
...Wenn ich einen Schalter habe der direkt am µC angeschlossen ist und gegen Masse, wie kann ich überprüfen, ob der betätigt wird?

1. internen Pullup aktivieren (entsprechendes PORTPinBit setzen)
2. PORTPin als Eingang schalten (entsprechendes DDRX-Bit = 0 )
3. PINX lesen, Bit testen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_de n_.C2.B5C.29 und
https://www.roboternetz.de/wissen/index.php/Taster-Abfrage_in_C

Eventuell muss entprellt werden!

Gruß

Fred

radbruch
22.08.2008, 18:56
Hallo


1. internen Pullup aktivieren (entsprechendes PORTPinBit setzen)
2. PORTPin als Eingang schalten (entsprechendes DDRX-Bit = 0 )
Unbedingt zuerst den Pin auf Eingang schalten und erst dann den PullUp aktivieren. Sonst gibt es einen Kurzschluss wenn gleichzeitig der Taster geschlossen ist!

Gruß

mic

H3llGhost
23.08.2008, 14:05
Danke für eure Hilfe!
Habe es nun so gelöst:

[php:1:2361967651]

#include <avr/io.h>

int main()
{
DDRD &= ~(1<<PD6);
PORTD |= (1<<PD6);

DDRD |= (1<<PD7);

while (1)
{
if ( !(PIND & (1<<PIND6)) )
PORTD |= (1<<PD7);
else
PORTD &= ~(1<<PD7);
}

return 0;
}

[/php:1:2361967651]

Also ich würde sagen so ist es richtig oder?

thewulf00
26.08.2008, 12:56
Es fehlt noch:

DDRD |= (1<<PD7);

Ansonsten sieht es gut aus, bis auf einen Fehler:


if ( !(PIND & (1<<PIND6)) )
// Ändern zu:
if ( !(PIND & (1<<PD6)) )