Forum: Mikrocontroller und Digitale Elektronik C; AVR: Eingänge und Ausgänge setzen


von zotti (Gast)


Lesenswert?

Hi,

ich programmiere in C mit dem AVR Studio.
Dafür muss ich nun ein paar Register setzen, wo ich allerdings im moment 
etwas verzweifel...
Es soll
PORTA Ausgang
PORTB Ausgang
PORTC PIN0 Ausgang, PIN1 Eingang, PIN2-5 "nicht verfügbar", PIN6 und 7 
Ausgang
PORTD Eingang.

So, ich dachte ich kann das alles so realisieren:
1
  DDRA = 0xFF;
2
  DDRB = 0xFF;
3
  DDRC = 0b11000001;
4
  DDRC &= ~(0b00000010);  
5
  PORTC |= (0x0b00000010);
6
  DDRD &= ~(0xFF);  
7
  PORTD |= (0xFF)
Ist dies korrekt?
Bei Abfragen bekomme ich jedesmal Fehler, sprich, die Bits sind nicht so 
wie sie sein sollen.

: Verschoben durch User
von Rolf Nagnus (Gast)


Lesenswert?

Das sieht ok aus.

Diese Zeile:

> DDRC &= ~(0b00000010);

ist unnötig, stört aber auch nicht.
Und bei PORTD sind alle Pull-Up-Widerstände eingeschaltet.

von Link zu (Gast)


Lesenswert?

zotti schrieb:
> Bei Abfragen bekomme ich jedesmal Fehler, sprich, die Bits sind nicht so
> wie sie sein sollen.
Woran erkennst du das? Vielleicht liegt das Problem ja in der 
Fehlererkennung?

von Sebastian M. (sebastian_m)


Lesenswert?

hallo
1
DDRA = 0xFF;
2
DDRB = 0xFF;
3
DDRC |= ((1<<PINC7) | (1<<PINC6) | (1<<PINC0));

vom start an, sind alle pins eingänge, diese musst du nicht extra 
deklarieren.

setzen von ausgängen:
1
PORTA |= (1<<PINA1);

löschen:
1
PORTA &= ~(1<<PINA1);


hoffe ich hab mich nicht vertippt :)

von zotti (Gast)


Lesenswert?

Link zu schrieb:
>> Bei Abfragen bekomme ich jedesmal Fehler, sprich, die Bits sind nicht so
>> wie sie sein sollen.
> Woran erkennst du das? Vielleicht liegt das Problem ja in der
> Fehlererkennung?


Da ich leider kein Microcontroller usw. zur Verfügung habe, simuliere 
ich mit HAPSMIM.

PORTA hängt an LED's.
Wenn ich z.B. PORTA=PORTD schreibe, ändert sich rein garnichts an den 
LED's, wenn ich die Eingänge von D ändere.
Sie sind immer an.

Wenn ich nun einzeln abfrage wie z.B.
if(PIND0)
 PORTA |= (1<<1);
ist egal, wie ich D ändere, sie die LED's bleiben immer aus... -.-

Ich weiß absolut nicht warum.

von Karl H. (kbuchegg)


Lesenswert?

zotti schrieb:

> Wenn ich z.B. PORTA=PORTD schreibe, ändert sich rein garnichts an den
> LED's, wenn ich die Eingänge von D ändere.

Kein Wunder.
Eingänge werden über das PIN Register abgefragt.
1
   PORTA = PIND;

Siehe Tutorial deiner Wahl, ganz am Anfang

> Wenn ich nun einzeln abfrage wie z.B.
> if(PIND0)
>  PORTA |= (1<<1);

Das fragt keinen Pin ab. PIND0 ist nur eine etwas 'schönere' 
Schreibweise für 0

Dein if prüft de fact einfach nur ob 0 ungleich 0 ist. Und das wird nie 
der Fall sein

Eingänge werden einzeln so abgefragt
1
  if( PIND & ( 1 << PIND0 ) )
2
    PORTA |= ( 1 << PA1 );

Wiederrum: siehe Tutorial deiner Wahl, ganz am Anfang wo es zum ersten 
mal ins Eingemachte geht.

AVR-GCC-Tutorial

von Justus S. (jussa)


Lesenswert?

zotti schrieb:

> Ich weiß absolut nicht warum.

weil weder

> Wenn ich z.B. PORTA=PORTD schreibe

noch

> if(PIND0)
>  PORTA |= (1<<1);

das machst, was du denkst...vielleicht solltest du doch mal einen Blick 
ins Tut werfen, da steht das alles ausführlich drinnen...

von zotti (Gast)


Lesenswert?

Erstmal Dankeschön, nun klappt es.

Ich hatte
1
if(PIND0) ...
benutzt, weil es bei mir schonmal so funktioniert hatte, wie es hier 
sein sollte.
Damals war ein Taster an C0 und dann habe ich per PINC0 abgefragt(wie 
oben), ob der Taster gedrückt ist oder nicht.
Damals hat es so funktioniert... :/

von Karl H. (kbuchegg)


Lesenswert?

zotti schrieb:

> Damals hat es so funktioniert... :/

Das ist völlig unmöglich.
Das ist so, wie wenn du behauptest, du hättest schon mal probehalber 
einen Stein nach oben geworfen und einmal wäre er dann tatsächlich 
davongeschwebt.

Es ist deswegen unmöglich, weil sich auch PINC0 nicht auf irgendwelche 
Hardware bezieht, sondern ebenfalls eine 'schönere' Schreibweise für 0 
ist.

von Andreas K. (andie)


Lesenswert?

>
> Es ist deswegen unmöglich, weil sich auch PINC0 nicht auf irgendwelche
> Hardware bezieht, sondern ebenfalls eine 'schönere' Schreibweise für 0
> ist.

Das ist auch ersichtlich im Header-File des Prozessors.

z.B.: iom64.h
1
#define    PINC0        0

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.