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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.