mikrocontroller.net

Forum: Compiler & IDEs vertsteh ich nicht


Autor: Ulrich H. (ulhi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab ein Programm geschrieben, welches zwei LEDs blinken lässt :
#include <avr/io.h>
#define LED0    PORTD ^= (1<<PD0);
#define LED1    PORTD ^= (1<<PD1);
void init(void) {
  //DDRD = 0xff;
  DDRD |= (1<<DDD0) | (1<<DDD1);
  PORTD |= (1<<PD0);
}
void wait(void) {
  volatile unsigned char a;
  TCCR0 |= (1<<CS02);
  for(a = 0; a <= 122; a++) {
    while(!TIFR) {}
    TIFR |= (1<<0);
  }
  TCCR0 = 0x00;
}
int main(void) {
  init();
  while(1) {
  wait();
  LED0;
  LED1;
  }
}

so funktioniert es auch ABER wenn ich folgendes ändere :
void init(void) {
  DDRD = 0xff;
  //DDRD |= (1<<DDD0) | (1<<DDD1);
  PORTD |= (1<<PD0);
}
so blinken die LEDs zwar weiter, aber es gehen auch ALLE anderen an, die 
am
PORTD angeschlossen sind, was sie aber nicht sollen. Außerdem, WARUM 
machen die das ???? Eigentlich sollten die doch nur leuchten, wenn der 
PORTbit UND
das DDRbit auf eins sind. Warum leuchten die aber, wenn das PORTbit auf 
0 und das DDRbit auf 1 ist??? Wie ist das möglich ??

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich, weil die LEDs High-Side angeschlossen sind und 
dementsprechend leuchten, wenn das entsprechende Bit in PORTx "0" ist...

Autor: Lötlackl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
würde ich auch vermuten.
Für diesen Fall könnte man so schreiben
void init(void) {
  DDRD = 0xff;
  //DDRD |= (1<<DDD0) | (1<<DDD1);
  PORTD |= ~(1<<PD1);
}

mfg Lötlackl

Autor: Ulrich H. (ulhi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, jetzt funktionierts. Danke. Nur was bedeutet High-Side ??

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die LED low-aktiv angeschlossen, so wie in 
http://www.mikrocontroller.net/articles/AVR-Tutori...

Dann ist es klar, dass die LED an den unbenutzten IO-Pins des als 
Ausgang (DDRD=0xFF) geschalteten PORTD bei einem 0 (LOW) Bit in PORTD 
leuchten.

BEi LOW am betreffenden Pin kann der Strom von Vxx über den Widerstand 
durch die LED zum IO-Pin fliessen und dort zu GND versickern ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Ulrich H. wrote:
> ja, jetzt funktionierts. Danke. Nur was bedeutet High-Side ??


Mit dem einen Ende ist deine Led am Prozessor angeschlossen.
Das andere Ende aber liegt (über einen Widerstand) auf der +
Schiene. Also auf der hohen Spannung.
Würde das andere Ende der Led auf Masse (also auf der niederen
Spannung liegen), so wäre sie Low-Side angeschlossen.

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.