Forum: Mikrocontroller und Digitale Elektronik uC C-Programmierung Port setzen


von Martin F. (martin_f70)


Lesenswert?

Hallo!
Wie kann ich einen speziellen Port eines Registers auf Output setzen?
mit:
1
DDRB  = 0xff;
 setzt man alle auf Output...geht um PB0 und PB2 auf Output zu setzen 
dieser Code:
1
DDRB  = 0b00001001;
?

von Georg G. (df2au)


Lesenswert?

Martin Fischer schrieb:
> geht um PB0 und PB2 auf Output zu setzen
> dieser Code:DDRB  = 0b00001001;

Nein, der setzt PB0 und PB3.

von Martin F. (martin_f70)


Lesenswert?

Stimmt^^
Egal, so ist aber richtig, und die anderen sind Input, oder?

von LassMichSuchen (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial


wie wäre es einfach mal mit suchen. Das datenblatt zum entsprechenden µC 
ist bestimmt auch nicht verkehrt...

von Georg G. (df2au)


Lesenswert?

Martin Fischer schrieb:
> Egal, so ist aber richtig

Beim Programmieren ist relativ wenig "egal" und dennoch richtig :-)
Die Bitpositionen mit "1" werden Ausgang, die mit "0" werden Eingang.
Das zumindest hast du richtig.

von Martin F. (martin_f70)


Lesenswert?

Ok. Danke, schönen Abend noch

von Martin F. (martin_f70)


Lesenswert?

Nochwas!
Kann man da auch irgendwie mit PB1 und so Arbeiten um alle einzeln zu 
setzen?

von Georg G. (df2au)


Lesenswert?

DDRB |= 0x02;
setzt nur PB1 auf Ausgang und lässt den Rest in Ruhe.

DDRB &= 0xf7;
setzt PB3 auf Eingang und lässt den Rest in Ruhe.

von Martin F. (martin_f70)


Lesenswert?

Ok. Also setzt das hier:
DDRB = 0b000001;
DDRB = 0b001000;
PB0 und PB3 auf Output NACHEINANDER EINZELN?

von spess53 (Gast)


Lesenswert?

Hi

>PB0 und PB3 auf Output NACHEINANDER EINZELN?

Nein.

X=3
X=5

Welchen Wert hat X nach der zweiten Anweisung?

MfG Spess

von Martin F. (martin_f70)


Lesenswert?

X hat den Wert 5...
Ich kenne mich noch nicht so gut mit Bit-Rechnung und so aus...wie geht 
das?

von Karl H. (kbuchegg)


Lesenswert?

Martin Fischer schrieb:
> X hat den Wert 5...
> Ich kenne mich noch nicht so gut mit Bit-Rechnung und so aus...wie geht
> das?

So wie alles andere auch.

Eine Zuweisung ist eine Zuweisung. Das komplette Ziel (in diesem Fall 
eben ein Register) wird mit einem neuen Wert belegt.


Denk nicht so kompliziert.
1
  a = ....  neuer Wert       a kriegt als ganzes einen neuen Wert
2
3
  a |= ( 1 << BitNr );       das Bit 'BitNr' wird gesetzt (auf 1)
4
  a &= ~( 1 << BitNr );      das Bit 'BitNr' wird gelöscht (auf 0)
5
6
7
  a |= ( 1 << BitNr1 ) | ( 1 << BitNr2 ) ...  die Bits BitNr1, BitNr2 werden gesetzt

eben das kleine Einmaleins in der µC-Programmierung.

von spess53 (Gast)


Lesenswert?

Hi

>Ich kenne mich noch nicht so gut mit Bit-Rechnung und so aus...

Dann lerne es.

>wie geht das?

So:

http://www.mikrocontroller.net/articles/Bitmanipulation

Und lege dir möglichst schnell ein C-Buch zu.

MfG Spess

von Digitalzwerg (Gast)


Lesenswert?

Oder das "Einsodernull". Hihi.

von Martin F. (martin_f70)


Lesenswert?

Ich habe nur ein c++ Buch, ist das kompatibel?

von Digitalzwerg (Gast)


Lesenswert?

>Ich habe nur ein c++ Buch, ist das kompatibel?

Was die Grundlagen der Bitmanipulation betrifft, ist das bei C und C++ 
das selbe.

Allerdings stehe ich dem Argument nahe, das heisst, dass man erstmal C 
lernen soll ehe man C++ lernt.

Lies erstmal das Tutorial.

von Martin F. (martin_f70)


Lesenswert?

"PB1" ist typ char, oder?
also die Bezeichnung?

und um die zu setzen dann: DDRB |= ( 1 << PB1 ) - PB1 Output
DDRB |= ( 0 << PB2 ) - PB2 Input

und beide werden NAcheinander gesetzt und ich kann das auch so in zwei 
Zeilen schreiben?

von katastrophenheinz (Gast)


Lesenswert?

Deine Aussage aus diesem unterhaltsamen Thread:
Beitrag "Arduino-AVR programmieren"

> programmieren kann ich doch schon nahezu perfekt!!!

Schon klar...

Warum liest du denn nicht einfach mal den Artikel zur Bitmanipulation?

von Martin F. (martin_f70)


Lesenswert?

Ja, außer BitManipulation...wozu brauchte ich das schon vorher?

"PB1" ist typ char, oder?
also die Bezeichnung?

und um die zu setzen dann: DDRB |= ( 1 << PB1 ) - PB1 Output
DDRB |= ( 0 << PB2 ) - PB2 Input

und beide werden NAcheinander gesetzt und ich kann das auch so in zwei
Zeilen schreiben?

von Georg G. (df2au)


Lesenswert?

Martin Fischer schrieb:
> DDRB |= ( 0 << PB2 ) - PB2 Input

liest du eigentlich, was dir hier geantwortet wurde?
Eine 0 kannst du schieben, so oft du möchtest, es bleibt eine 0

DDRB &= ~(1 << PB2);

von Martin F. (martin_f70)


Lesenswert?

und um die zu setzen dann: DDRB |= ( 1 << PB1 ) - PB1 Output
DDRB &= ~( 1 << PB2 ) - PB2 Input

Aber wozu ist das & und nicht der | davor bei:DDRB &= ~( 1 << PB2 ) - 
PB2 Input

von TriHexagon (Gast)


Lesenswert?

Würdest du dir die Mühe machen selbst einmal zu recherchieren, wüsstest 
du das schon längst. Glaub mir so wird das nix mit dem AVR und dem 
Projekt.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Martin Fischer schrieb:
> Aber wozu ist das & und nicht der | davor bei:DDRB &= ~( 1 << PB2 ) -
> PB2 Input

Lies gefälligst entweder Dein C++-Buch oder den schon mehrfach erwähnten 
Artikel zum Thema Bitmanipulation! Bei Deinem derzeitigen Wissensstand 
macht es überhaupt keinen Sinn, Dir noch irgendetwas über Programmieren 
oder Microcontroller zu erklären.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Martin Fischer schrieb:
> Aber wozu ist das & und nicht der |

Dir fehlen Grundlagen.

von Michael (Gast)


Lesenswert?

Georg G. schrieb:
> Die Bitpositionen mit "1" werden Ausgang, die mit "0" werden Eingang.

Falls die Registerbezeichnung DDR der Namensgebung von Atmel folgt, 
stimmt das (z.B. ATmega..). Bei den PICs ist es genau umgekehrt. Eine 
"1" im Datenrichtungsregister schaltet den Pin als Input, eine "0" als 
Output.

von Thomas E. (thomase)


Lesenswert?

Michael schrieb:
> Georg G. schrieb:
>> Die Bitpositionen mit "1" werden Ausgang, die mit "0" werden Eingang.
>
> Falls die Registerbezeichnung DDR der Namensgebung von Atmel folgt,
> stimmt das (z.B. ATmega..). Bei den PICs ist es genau umgekehrt. Eine
> "1" im Datenrichtungsregister schaltet den Pin als Input, eine "0" als
> Output.

Schön. Aber verwirr ihn nicht noch mehr. Er hat einen Atmega8. Der ist 
allerdings gerade im A...

mfg.

: Bearbeitet durch User
von Martin F. (martin_f70)


Lesenswert?

Von welchem Datentyp ist PB0 ? es ist kein Int, kein Char, ...?

von TriHexagon (Gast)


Lesenswert?

Schau halt mal in den Headern nach...
Kleiner Tipp PB0 ist beim ATMega8 in #include <avr/iom8.h> zu finden, 
wird von #include <avr/io.h> eingebunden.

von Klaus Dieter (Gast)


Lesenswert?

Es ist ein define! Und wenn du nicht langsam die Artikel liest die hier 
verlinkt worden sind, wird dir bald keiner mehr antworten!

von Martin F. (martin_f70)


Lesenswert?

Ja, aber dort ist es als 0 #define'd, int ist es aber nicht?

von TriHexagon (Gast)


Lesenswert?

C Buch lesen! Präprozessor Grundlagen!

von Gerd (Gast)


Lesenswert?

Martin, machst du jetzt zu jedem Einzelschritt einen Thread auf?
RTFM (read the f***ing manual)

Langsam nervst du wirklich.
Arbeite das Tutorial durch und lies den verdammten Scheiß auch, den die 
Leute dir posten und verlinken!

Ehrlich... was willst du bei Jugend Forscht???

von Martin F. (martin_f70)


Lesenswert?

DAS HAT NIX MIT JUFO zutun...
und im Tutorial steht nirgendwo was das für ein Datentyp ist

von TriHexagon (Gast)


Lesenswert?

Weil das Tutorial auch kein C-Buch ersetzt. Lern erst mal ordentlich C 
auf dem PC und dann kannst du mit einem µC loslegen.

von Thomas E. (thomase)


Lesenswert?

Martin Fischer schrieb:
> Ja, aber dort ist es als 0 #define'd, int ist es aber nicht?

Ja, das ist int. Aber das interessiert genauso wenig wie wenn du beim 
Bäcker 5 € bezahlen sollst. Da ist es dir doch auch egal, ob das int, 
char, long, double oder katholisch ist.

mfg.

von F. F. (foldi)


Lesenswert?

Gerd schrieb:
> Martin, machst du jetzt zu jedem Einzelschritt einen Thread auf?

>
> Ehrlich... was willst du bei Jugend Forscht???

'Jugend nervt' gewinnt er sofort.

von Martin F. (martin_f70)


Lesenswert?

Sorry ich hatte einen Fehler gemacht...alles Gut ^^

von F. F. (foldi)


Lesenswert?

Martin,
ich will dich mal was fragen:
Du liest nicht die vorgeschlagenen Artikel, auch keine Bücher, hast 
sogar Angst deine Adresse per PN zu verschicken um ein oder mehrere 
Geschenke zu bekommen  (hatte da sogar vor dir  den mySmartUSB light 
dabei zu packen), nimmst absolut keine. Rat an, außer er liegt dir. 
Also, was willst du hier?

von Eumel (Gast)


Lesenswert?

F. Fo schrieb:
> Also, was willst du hier?

Trollen.

von Martin F. (martin_f70)


Lesenswert?

Sorry dass ich nerve, ich versuche nur zu lernen, habe es jetzt aber 
geschafft, danke, bb

von Xxx (Gast)


Lesenswert?

Martin Fischer schrieb:
> Sorry dass ich nerve, ich versuche nur zu lernen, habe es jetzt
> aber
> geschafft, danke, bb

xD ich habe eher das Gefühl du würdest dich wehren etwas zu lernen

von Wolfgang (Gast)


Lesenswert?

Martin Fischer schrieb:
> Von welchem Datentyp ist PB0 ? es ist kein Int, kein Char, ...?

Martin Fischer schrieb:
> Ja, aber dort ist es als 0 #define'd, int ist es aber nicht?

#define hat nichts mit Datentypen und Programmiersprache zu tun. Damit 
werden nur Textstücke für Textersetzungen im Präprozessor gesteuert.

von Martin F. (martin_f70)


Lesenswert?

Ja schon klar, ich habe meinen Fehler gefunden, war ein bisschen 
verwirrt gewesen...

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.