HILFE PORTPINS setzen und auslesen in C

Gast #626658
Lesenswert?

@all,

ich habe bis jetzt mit Keil programmiert und bin jetzt AVR Studio mit 
WINAVR umgestiegen. Nun habe ich aber etwas Probleme mit der 
Programmierung.
Ich programmiere in C und wenn ich bei Keil einen Ausgang einlesen bzw. 
ausgeben wollte musse ich diesen zuerst deklarieren ( sbit P1.1 = 0x..)
nun konnte ich im Programm den PIN auslesen if(P1.1==0){...}.
Setzen konnte ich den PIN mit P1.1=1; Hier im Forum habe ich zwar schon 
c-code gesehen jedoch ist mir dieser etwas unklar da ich bis jetzt mit 
<< immer die Werte verschoben habe.
Mir scheint, dass der Befehlsatz beim AVR ein anderer ist.
Kann mir jemand ein Online Beschreibung empfehlen oder ein Buch!
Wenn es von AVR Studio bzw. WINAVR eine Doku gibt bitte die Adresse 
einfügen da ich bis jetzt nicht gefunden habe.

Software AVR Studio mit WINAVR
Hardware MEGA128

wenns wichtig ist.

TOM
Moderator Persönliche Seite #626671
Lesenswert?

Nimm das AVR-Tutorial hier aus dem Wiki.

Ja, die AVRs arbeiten anders.  Es fängt damit an, dass sie
push-pull-Ausgänge haben (nicht nur pulldown mit einem pullup-
Widerstand), sodass man zuvor erst einmal das Pin auf Ausgang
setzen muss.

Kurz: setze Pin B0 auf Ausgang, belasse Pin B1 auf Eingang (das
ist der Reset-Zustand), und kopiere den negierten logischen Wert
von B1 nach B0:
1
#include <avr/io.h>
2

3
int
4
main(void)
5
{
6
  DDRB = (1 << 0); // B0 ist Ausgang
7
  for (;;) {
8
    if (PINB & (1 << 1)) // Abfrage Eingang B1
9
      PORTB &= ~(1 << 0); // Löschen Augang B0
10
    else
11
      PORTB |= (1 << 0);  // Setzen Ausgang B0
12
  }
13
}
Gast #626762
Lesenswert?

@Jörg,

danke für die Schnelle Antwort.
Ich habe mit das AVR-Tutorial schon angesehen jedoch ist alles in 
Assembler geschrieben und erklärt.
Ich kann zwar auch etwas Assembler jedoch für um die Beispiele zu 
verstehen müsste ich mich erst wieder einarbeiten und das nur weil ich 
eigentlich in C programmieren will.
Gibt es nicht eine anleitung wo die Grundlegenden Dinge anhand von 
Beispielen beschrieben ist.
So wie im AVR-Tutorial nur in C eben.

DDRB = (1 << 0); // B0 ist Ausgang                    --> ist klar
  for (;;) {
    if (PINB & (1 << 1)) // Abfrage Eingang B1        -->ich verknüpfe 
den PINB(8Bit) mit der Maske 0b00000010 wobei die zweite "1" fur die 
Wertigkeit steht! ((1 << 4) Abfrage PINB4 ist 1)  Ist das richtig?

      PORTB &= ~(1 << 0); // Löschen Augang B0        --> ich verknüpfe 
den PORTB(8Bit) mit 0b00000001 plus invertierung Ausgang wird HIGH --> 
LED geht AUS
    else
      PORTB |= (1 << 0);  // Setzen Ausgang B0        -->ich verknüpfe 
den PORTB((8Bit) mit 0b00000001 setze Ausgang auf LOW --> LED geht AN
  }


Ist irgentwo die Syntax grunglegend beschrieben Internetadresse?!?!?

Sind die Port Register im gegensatz zum 80c535 nicht Bitadressierbar?
Warscheinlich nicht daher immer die Maskierung.

TOM

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