Erstes C - Programm ATMega8

Gast #1740491
Lesenswert?

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?
Persönliche Seite #1740499
Lesenswert?

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
Gast #1740502
Lesenswert?

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
Persönliche Seite #1740513
Lesenswert?

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)
Gast #1740567
Lesenswert?

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=?
Persönliche Seite #1740605
Lesenswert?

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

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