C; AVR: Eingänge und Ausgänge setzen

Gast #1764577
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.
Gast #1764862
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.
#1764868
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
Gast #1764927
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... :/
#1764964
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.

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