Forum: Mikrocontroller und Digitale Elektronik HILFE PORTPINS setzen und auslesen in C


von TOM (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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
}

von gast (Gast)


Lesenswert?


von Volker (Gast)


Lesenswert?

schau mal hier, dann kannst du das so machen wie gewohnt.

Beitrag "sbit macro für avr-gcc"

Gruß Volker

von TOM (Gast)


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

von Jörg X. (Gast)


Lesenswert?

> So wie im AVR-Tutorial nur in C eben.
wie im AVR-GCC Tutorial vielleicht?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

:-o Jörg

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.