Forum: Mikrocontroller und Digitale Elektronik Pin definieren beim Atmel-Controller, Pin Namen geben


von At (Gast)


Lesenswert?

Hallo,
Habe eine Frage. Und zwar experimentiere ich mit einem Atmel Controller: 
dem ATMega16. Ich programmiere in C. Ich habe nun vor etwas anzusteuern. 
Ich muss dafür die Pins bzw. die Ports auf Ausgang schalten. Hierzu 
setze ich erstmal das DDR auf Ausgang. Nun möchte ich zum Beispiel, dass 
der Pin 1 am Port B, also PB0 den Namen RNW trägt. D.h. ich möchte 
soetwas in der Art machen:

DDRB = 0xff;

//Definiere das Pin 1 am Port B, also die Adresse 0x01 den Namen RNW 
trägt.

RNW = (PORTB = 0x01);

Hmm dass sieht irgendwie nicht so aus, als würde es klappen .. denke ich 
muss hier mit einem Zeiger arbeitenm, weil ich ja auf die Adresse 
zeige..

Mein Ziel ist es nachher im Programm einfach zu schreiben ...

for(i =0, i < 5, i++)
{
   Setze RNW;
} ...

Will also nicht immer die Adresse des Pins angeben. das hat den Sinn, 
dass wenn ich meine Einheit die ich steuern will verbaue nicht auf die 
richtige verdrahtung achten muss, sondern diese im Kopf schnell anpassen 
kann, sprich NRW eine neue/andere Adresse einmalig zuweisen kann.

Kann mir da wer weiter helfen .. Danke

von ... .. (docean) Benutzerseite


Lesenswert?

du kannst

#define set_RNW PORTB |= (1<<PB0)

machen...

Dann kannst du einfach

set_RNW;

schreiben und am PORTB wird der Pin PB0 gesetzt...

von At (Gast)


Lesenswert?

Danke

von At (Gast)


Lesenswert?

Habe nun folgendes übersetzt:

#include <avr/io.h>

#define set_RNW PORTB = 0x01;

void main ()
{
  DDRB = 0xff;


  set_RNW;

  return 0;
};


Ich schaue mir mit dem Debug die Register an:

Zunächst dass DDRB Register ... es werden alle 8 Bits gesetzt nach der 
Zeile DDRB=0xff;

Nun wird nach der zeile das erste Bit im Register PORTB gesetzt.
Okay bis da verstehe ich es. Es läuft wie ich es will.

Nun nach dem Anweisungsblock wird plötzlich auch das 1. Bit im Register 
PINB gesetzt, aber wieso? dass heißt dann doch sowas wie eingabe

von Chris W. (squid1356)


Lesenswert?

da hat jemand die GCC-Tutorials nicht gelesen...

AVR-GCC-Tutorial

von At (Gast)


Lesenswert?

Oder es da überlesen/vergessen ;)

von Chris W. (squid1356)


Lesenswert?

dann ist ja alles geklärt ;-)

von holger (Gast)


Lesenswert?

>Nun wird nach der zeile das erste Bit im Register PORTB gesetzt.
>Okay bis da verstehe ich es. Es läuft wie ich es will.

>Nun nach dem Anweisungsblock wird plötzlich auch das 1. Bit im Register
>PINB gesetzt, aber wieso? dass heißt dann doch sowas wie eingabe

Das ist völlig normal. Wenn PORTB0 ein Ausgang ist
wird der Zustand des Pins auch immer in PINB0 auftauchen.
Also wenn du PORTB0 auf 1 setzt wird auch PINB0 1.
Es sei denn du schliesst den Ausgang kurz gegen Masse ;)

von Peter D. (peda)


Lesenswert?

At wrote:

>    Setze RNW;

So geht es auf keinen Fall.
Bitvariablen muß man einen Wert zuweisen, also
1
RNW = 0;
2
..
3
RNW = 1;

Wie man Portpins als Bitvariablen definiert, steht hier:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=67368

Und ein praktisches Beispiel:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

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.