Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage


von Judgin F. (einsteiger777)


Lesenswert?

hallo zusammen,

ich habe eine Frage bezüglich AVR Porgrammierung.

Wenn ich einen Pin als Output definiere, an dem eine LED angeschlossen 
ist, wird dieser ständig leuchten aufgrund dieser Zeile:

  LED_DDR = LED_DDR | LED_Bit;

?

Gruß
Judgin

von Peter II (Gast)


Lesenswert?

kommt darauf an was du in LED_Bit reinschreibst, ist es die Bit-nummer 
(0-7) oder eine Bit maske (1,2,4,8,16,..)

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Den Anfang des AVR-GCC-Tutorials, dort wo es um einfache Pin I/O 
geht, hast du schon durchgearbeitet?
Zusammen mit etwas Grundlagenwissen in C, sollte das dir eigentlich 
ermöglichen, dir deine Frage selbst zu beantworten.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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);

von Judgin F. (einsteiger777)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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

von Judgin F. (einsteiger777)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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 )

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.