Guten Abend. Ich habe mir eine ATMega 8 zugelegt, mit dem ich ein wenig experimentieren möchte. Ich habe mir das Toturial angeschaut soweit ich konnte. Ich möchte an einem Pin eine logische "1" anlegten. Dieses tue ich über einen Taster, der das Potential 5 V schaltet. Ich möchte diesen Pin nun abfragen. Wenn ich den Taster einmal betätigt habe, dann soll dieses in einer Variable gespeichert werden, so dass z.B. nun ein anderer Pin auf High schaltet. Ich habe nun mal angefangen: #include <avr/io.h> int main (void) { int x = 0; //Variable x mit dem Anfangszustand 0 DDRC = 0x00; //Port C arbeitet als Eingang DDRB = 0xff; //Port B arbeitet als Ausgang while (x =0) //solange an Pin 1 des Portes C Low { if { PINC & 0x01} //Wenn an PC 1 Low, dann { x = 1; //setze Variable x auf den Wert 1 } } if (x == 1) //wenn x den Wert 1 (Taster wurde gedrückt) { PORTB == 0x00; //schalte PB0 auf High } } Kann das Programm fuktionieren? Irgendetwas klappt hier nicht. Kann man was verbessern?
:
Verschoben durch User
C_Anfaenger schrieb: > if { PINC & 0x01} //Wenn an PC 1 Low, dann richtig: Wenn PC 1 high, dann Noch ne Frage, dein Taster schließt ja nach 5 Volt, hast du einen Pulldown-Widerstand drinnen? C_Anfaenger schrieb: > PORTB == 0x00; //schalte PB0 auf High == ist ein Vergleich, keine Zuweisung (=) und auf high schaltet man mit Einsen, nicht mit Nullen. Außerdem haste keine Endlosschleife usw. Da fehlt einiges an elementarem Wissen. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Der Taster lässt 5 V an den Pin direkt anliegen. Oh mit dem Verlgeich, da habe ich mich vertippt. Also ist es sonst korrekt? Wird mit dem Programm also abgefragt, ob der Taster gedrückt wurde und wenn er einmal gedrückt wurde, dann geht der Pin auf High? Dann werd ichs nachher testen :)Danke euch
Oh irgendwie hat er mir deine Antwort nicht ganz angezeigt. Wieso ist es keine korrekte Schleife? Solange x = 0 soll er es ausführen.
C_Anfaenger schrieb: > Wieso ist es > keine korrekte Schleife? Solange x = 0 soll er es ausführen. Und was macht er danach? Er läuft durch die if-Abfrage und dann? Dann wird das Programm wieder von vorne beginnen, die Ausgänge wieder einstellen und wieder in deine While(x==0) gehen. Abschließend vor dem Ende der main() gibt es im uC-Bereich immer eine Endlosschleife, ob gefüllt oder nicht ist egal. Diese sorgt dafür das der uC nicht unkontrolliert in nicht definierten Speicherbereichen rumrennt. Übrigends: while(x=0) {} <= da kommt er nie rein, da x=0 eine Zuweisung mit dem Ergebnis 0 ist, also steht da while(0). Du meinst einen Vergleich x == 0 (man beachte, 2 Gleichzeichen)
1 | #include <avr/io.h> |
2 | |
3 | void main (void){ |
4 | int x = 0; |
5 | DDRC = 0x00; |
6 | DDRB = 0xFF; |
7 | |
8 | while (x == 0){ |
9 | if (PINC > 0x00){ |
10 | x = 1; |
11 | }
|
12 | }
|
13 | PORTB = 0xFF; |
14 | }
|
Versuchs mal so.
Wenn ich nun ein Bit setzen möchte auf dem PORT B, z.B. nur ein Bit auf High, dann kann ich ja schreiben PORTB = 0x01; Damit nehme ich aber auch einfluss auf die Pins PB0 und PB2 bis PB7, d.h. überschreibe diese, wenn die vorher einen Wert hatten, oder? Kann ich das umgehen=?
C_Anfaenger schrieb: > Damit nehme ich aber auch einfluss auf die Pins PB0 und PB2 bis PB7, > d.h. überschreibe diese, wenn die vorher einen Wert hatten, oder? Kann Deswgen gibts in C z.B. verodern (wie ein ODER-GATTER): PORTB = PORTB | (1<<PB2); PortB ist PortB oder 00000100, also wird PB2 gesetzt, der Rest des Ports aber nicht verändert. Löschen geht über VerUNDen mit dem invertierten Wert: PORTB = PORTB & ~(1<<PB2); PortB ist PortB und 11111011, also wird PB2 gelöscht (=0 gesetzt), der Rest bleibt unverändert. Steht aber auch alles hier drin, solltest mal genauer durcharbeiten: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ausg.C3.A4nge
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.