www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Erstes C - Programm ATMega8


Autor: C_Anfaenger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Florian Löffler (Firma: Studi) (muut) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: C_Anfaenger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: C_Anfaenger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian Löffler (Firma: Studi) (muut) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Tide (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

void main (void){
  int x = 0;                 
  DDRC = 0x00;                  
  DDRB = 0xFF;                   

  while (x == 0){
    if (PINC > 0x00){          
      x = 1;    
   }
  }
    PORTB = 0xFF; 
}

Versuchs mal so.

Autor: C_Anfaenger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verschoben, da das nichts mit der Codesammlung zu tun hat.

Autor: Florian Löffler (Firma: Studi) (muut) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.