PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : newbie problem



Fro
06.05.2005, 12:59
So ich bin einsteiger in C und hab Grundlagenkenntnisse in sachen Programmierung. Etz wollt ich in C folgendes machen. Programm läuft, Diode ist aus. Taster wird gedrückt -> Diode geht an. Und ohne entprellung sondern ganz quick and dirty. Und zwar folgendermaßen


#include <avr/io.h>;



int main(void)
{
DDRD = (0 << PD5) | (1 <<PD7);
PORTD = (1 << PD5) | (0 << PD7);

if (PIND = (0 << PIND5))
{
PORTD = (1 << PD7);
}
}

Problem ist...es tut sich nix. Und ich komm ned drauf wieso...bitte helft mir.

lekro
06.05.2005, 13:10
Dein Programm ist nicht Schuld; es macht genau das, was es soll. Evtl. hast du etwas anderes beabsichtigt.

Mit der if-Abfrage testest du genau einmal, ob die Taste gedrückt ist. Ist sie es, schaltet das Programm die LED an. Ist sie es nicht, läuft das Programm einfach so weiter. Nach der if-Abfrage ist aber main() zu Ende, also beendet sich das Programm; das bedeutet bei WinAVR wohl, dass es in eine Endlosschleife geht und nichts mehr macht.

Du solltest vielleicht erstmal die Grundlagen von C lernen, am besten nicht auf einem uC, sondern auf einem normalen PC mit gescheitem Debugger. Dann passieren dir solche Fehler nicht mehr.

Fro
06.05.2005, 13:13
Ahso..

gut danke! Ich werd mich mal mehr reinstressen müssen =P~

pebisoft
06.05.2005, 16:44
lekro, er geht nicht in eine endloschleife, sondern das programm ist beendet. "c" ist immer noch "c" . ob winavr-c oder ultimo-c.
mfg pebisoft

lekro
06.05.2005, 17:48
lekro, er geht nicht in eine endloschleife, sondern das programm ist beendet. "c" ist immer noch "c" . ob winavr-c oder ultimo-c.
Glaub mir, ich weiß was ich geschrieben habe:

Nach der if-Abfrage ist aber main() zu Ende, also beendet sich das Programm; das bedeutet bei WinAVR wohl, dass es in eine Endlosschleife geht und nichts mehr macht.Muss ich dazu wirklich noch mehr sagen?

dark emporer
06.05.2005, 21:09
Ich denke das du da nicht nur einmal den taster überprüfen sondern dauernd. Benutze am besten

while(1) //Immer wiederholen
{


}


zu anderen has du da nichts was die led wieder auschaltet enweder else oder ne andere schleife

Fro
06.05.2005, 21:20
Ich hab jetzt um den If-block die while schleife gelegt, es tut sich aber leider immer noch nix...

lekro
07.05.2005, 01:12
@Fro: Poste bitte deine komplette main.

Überleg dir aber bitte vorher auf dem Papier, ob dein Programm vom Code her das tut, was es soll.
Denn herumraten und copy&paste führen beim Programmieren (besonders bei anspruchsvolleren Sprachen wie C) selten zum Erfolg.

dark emporer
07.05.2005, 09:23
vegese bitte nicht die ports auf ein und asgänge zu schalten!
Wer hat was gegen copy&paste :^o

lekro
07.05.2005, 09:55
Wer hat was gegen copy&paste

Schonmal die Tastatur eines richtigen "Copy&Paste-Proggers" gesehen?

http://michamedia.de/Programmierung/Cpp/keyboard_progger.jpg

Das Problem ist nicht copy&paste per se. Ein Problem tritt dann auf, wenn man copy&paste völlig ohne Verständnis betreibt. Wenn man einen ernsthaften Mangel an Grundlagen hat und z.B. nicht weiß, wie Funktionen deklariert werden, ist es mehr als schädlich, zu versuchen per copy&paste ein uC-Programm zu schreiben.

Man sollte grundsätzlich den Code verstehen, den man per copy&paste einfügt. Mit "verstehen" meine ich nicht jeden einzelnen Buchstaben, aber die grundlegenden Zusammenhänge müssen einem klar sein. Ansonsten stößt man zwangsläufig auf Probleme, man fragt wieder im Forum und bekommt wieder fertigen Code hingeknallt, den man per copy&paste einfügt. <tv kaiser>Ein Teufelskreis.</>

Fro
07.05.2005, 10:02
Erstmal: Hier is nix Copy&Paste [-(. Alles aus meiner Feder, deswegen hab ich auch geschrieben: Quick&Dirty. Ich hab die Feinheiten ganz bestimmt ned raus. :wink:

Aber hier mal der Code

#include <avr/io.h>



int main(void)
{
DDRD = (0 << PD5) | (1 <<PD7); //PD5 auf Eingang schalten, PD7 auf Ausgang
PORTD = (1 << PD5) | (0 << PD7); //Pullup Widerstand an PD5 setzen
while(1){
if ( PIND & (0 << PIND5) ) //Wenn PD5 auf Masse gezogen wird....
{
PORTD = (1 << PD7); // dann setze PD7 auf high
}
}
}

lekro
07.05.2005, 10:10
Dein Fehler liegt in der Zeile mit dem if. Du machst ein bitweises UND zwischen PIND und (0 << 5). letzteres ist eine 0, die um 5 Stellen nach links verschoben wurde. Also immer noch 0. Ein bitweises UND mit 0 ergibt auf jeden Fall auch wieder 0, daher ergibt der Ausdruck im if immer false und PD7 wird nie gesetzt.

"0 << irgendwas" ergibt grundsätzlich immer 0, kann also genausogut durch 0 ersetzt werden (und sollte es auch, der Übersichtlichkeit wegen). Dein if muss also eher so aussehen:
if(!(PIND & (1 << 5)))

btw, einzelne Pins setzen geht so:
PORTD |= (1 << 7);
Wenn du nicht |= sondern = nimmst, setzt du alle anderen Pins auf 0.

Fro
07.05.2005, 10:35
Wunderbar! :) Es funktioniert! Dankeschön an alle die geholfen haben!