Forum: Mikrocontroller und Digitale Elektronik Erstes C - Programm ATMega8


von C_Anfaenger (Gast)


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?

: Verschoben durch User
von Florian L. (muut) Benutzerseite


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

von C_Anfaenger (Gast)


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

von C_Anfaenger (Gast)


Lesenswert?

Oh irgendwie hat er mir deine Antwort nicht ganz angezeigt. Wieso ist es 
keine korrekte Schleife? Solange x = 0 soll er es ausführen.

von Florian L. (muut) Benutzerseite


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)

von Tide (Gast)


Lesenswert?

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.

von C_Anfaenger (Gast)


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=?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Verschoben, da das nichts mit der Codesammlung zu tun hat.

von Florian L. (muut) Benutzerseite


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

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.