mikrocontroller.net

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


Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  DDRA = 0xFF;
  DDRB = 0xFF;
  DDRC = 0b11000001;
  DDRC &= ~(0b00000010);  
  PORTC |= (0x0b00000010);
  DDRD &= ~(0xFF);  
  PORTD |= (0xFF)
Ist dies korrekt?
Bei Abfragen bekomme ich jedesmal Fehler, sprich, die Bits sind nicht so 
wie sie sein sollen.

: Verschoben durch Moderator
Autor: Rolf Nagnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian M. (sebastian_m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
DDRA = 0xFF;
DDRB = 0xFF;
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:
PORTA |= (1<<PINA1);

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


hoffe ich hab mich nicht vertippt :)

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
   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
  if( PIND & ( 1 << PIND0 ) )
    PORTA |= ( 1 << PA1 );

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

AVR-GCC-Tutorial

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Dankeschön, nun klappt es.

Ich hatte
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... :/

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (andie)
Datum:

Bewertung
0 lesenswert
nicht 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
#define    PINC0        0

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.