Anfängerfrage

#2442337
Lesenswert?

Deine Frage lässt sich ohne mehr Wissen drumherum nicht beantworten 
(zumindest müsste man raten, und das ist etwas, was wir von vorne herein 
tunlichst vermeiden wollen).

Was ist LED_DDR
Was ist LED_Bit

dafür muss es Definitionen in deinem Programm geben, denn das sind keine 
Standardausdrücke.

Also: Zeig am besten alles. Dann braucht man nicht im Nebel stochern.
(Firma: matzetronics) #2442340
Lesenswert?

Judgin F. schrieb:
> LED_DDR = LED_DDR | LED_Bit;

1. Das kannst du auch so schreiben:
1
 LED_DDR |= LED_Bit;
Das funktioniert so lange , wie du LED_Bit als z.B. 0x01 definierst.

Allerdings ist es üblich , eine andere Schreibweise zu nehmen:
1
#define LED_DDR DDRD
2
#define LED_Bit 1
3
LED_DDR |= ( 1 << LED_Bit)

2. Du musst dann aber auch noch eine 1 in den  Port schreiben, bis jetzt 
hast du nur das LED_Bit als Ausgang definiert:
1
 
2
#define LED_Port PORTD
3
 LED_Port |= ( 1 << LED_Bit);
OP #2442886
Lesenswert?

Karl Heinz Buchegger schrieb:

Also: Zeig am besten alles. Dann braucht man nicht im Nebel stochern.

Das Programm:

/*    Taster PD2                         */
/*   Leuchtdiode PD3 an/aus             */
/*--------------------------------------*/
#include <avr/io.h>
//---------------------------------- Hardware ---------------
          // LED an PORTD Bit3 (PD3)
#define LED_Bit 0x08  // Bitadresse:
          // Bitnummer3 => 00001000 => 0x08
#define LED_PORT PORTD  // PORT Ausgaberegister PORT D
#define LED_DDR DDRD  // PORT Data Direction Register
          // Taster an PD2
#define Taster_Bit 0x04
#define Taster_PIN PIND
#define Taster_DDR DDRD
//-----------------------------------------------------------
//   Data Direction-Bit 0: input, 1: output
//   All LEDs are open Collector Outputs => 0 is LED on
//------------------------------------------------ main -----
int main (void)
{              // PIN Configuration
   LED_DDR = LED_DDR | LED_Bit;   // 1 Bit to 1=output
  Taster_DDR = Taster_DDR & ~Taster_Bit; // Taster Bit input
  while (1)
    {  if (!(Taster_PIN & Taster_Bit))
        {LED_PORT = LED_PORT | LED_Bit;}//LED off
      else
        {LED_PORT = LED_PORT & ~LED_Bit;}  //LED on
    }
}


Frage: was tut es genau?

Grüße
Judgin
(Firma: matzetronics) #2442919
Lesenswert?

Wenn wir jetzt mal die Entprellerei beiseite lassen , setzt das Programm 
die LED high wenn der Taster auf high ist und LED auf low wenn der 
Taster low ist.
   LED_DDR = LED_DDR | LED_Bit;   // 1 Bit to 1=output
ist wie
   LED_DDR |= LED_Bit;
siehe oben . Und
LED_PORT = LED_PORT | LED_Bit;
ist wie
LED_PORT |= LED_Bit;
und
LED_PORT = LED_PORT & ~LED_Bit;
ist wie
LED_PORT &= ~LED_Bit;

Gewöhn dir das  ruhig an. AVR Programmierer nehmen allerdings meistens 
die
#define LED_Bit 3
LED_DDR |= ( 1 << LED_Bit)
Syntax, da es damit sehr einfach und übersichtlich wird, wenn man 
bestimmte Bits in Registern setzen muss, z.B. UART, ADC oder Timer 
Register. Z.B.
UCSR0A = (1 << USCZ0) | (1 << UCSZ1)

ADCSRA |= (1 << ADSC) ; Start Conversion
OP #2442936
Lesenswert?

hallo Matthias,

danke Dir erstmal für Deine sehr schnellen und gut erklärten Antworten.
ich habe eine andere Frage (hardwareseitig):
Wieso leuchtet dann ständig die LED PD3 und wenn ich den Taster drücke, 
dann geht sie aus. Also genau anders, als Du mir vorhin eklärt hast.

ich zitiere:
 setzt das Programm
die LED high wenn der Taster auf high ist und LED auf low wenn der
Taster low ist.



ich kann Dir leider nicht die schaltung hochladen, da das png format 
anscheined zu groß ist. ich werde es Dir kurz in worten erklären.

Tasterbeschaltung:

+5V => R => LED (mit Anode zum R) => von LED gehts zum Taster (bei 
Betätigung zieht dieser auf GND) und außerdem gehts von der LED noch zum 
µC.

LEDbeschaltung:

+5V => R => LED (mit Anode zum R) => µC
(Firma: matzetronics) #2442946
Lesenswert?

Die LED Anode ist ja dauernd an + angeschlossen. Wenn nun der Kontroller 
die LED Kathode an Masse zieht ( also auf low) dann leuchtet die Diode . 
Das heisst negative Logik. Beim Taster ists vermutlich ähnlich. Er zieht 
gedrückt den Eingangspin auf low ( Masse) und wenn er offen ist, liegt 
der Eingangspin auf high ( über einen Pullup - Widerstand).
Ich würde dir übrigens empfehlen, bei den Eingangspins den internen 
Pullup des AVR zu aktivieren. Das geht über das PORT Register. Wenn der 
Pin als Eingang definiert ist und du eine 1 ins entsprechende PORT 
register bit schreibst, wird der Pullup aktiviert, der irgendwo zwischen 
20k und 50k liegt.
Mehr findest du im  Datenblatt ( Zwanglektüre :P )

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