mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED schalten


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin Anfänger auf dem Gebiet Mikrocontroller und möchte als erstes 
"Projekt" eine LED anschalten...

als Code habe ich geschrieben:

#include <avr/io.h>
#include <stdlib.h>

int main(void) {


usart_init(9600);
DDRA = (1<<PB1);
PORTA= (1<<PB1);


return 1;
}


Dies funktioniert aber nicht...kann mir einer sagen wieso?

Gruß Thorsten

Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRA = (1 << DDA1);
PORTA |= (1<<PA1);

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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

Bewertung
0 lesenswert
nicht lesenswert
Thorsten schrieb:

> Dies funktioniert aber nicht...kann mir einer sagen wieso?

Definiere 'funktioniert nicht'

Beitrag ""Hilfe", "funktioniert nicht", funktioniert nicht."

Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bist du dir sicher das deine LED am Pin1 des Port A angeschlossen ist?

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

Bewertung
0 lesenswert
nicht lesenswert
Ich wollt dich eigentlich dazu treiben uns das selbst zu erzählen (und 
das nächste mal tust du das bitte. 'Funktioniert nicht' ist keine 
Fehlerbeschreibung mit der man etwas anfangen kann!. Sag konkret was 
nicht geht: compiliert der Code? kriegst du eine Fehlermeldung? Welche? 
Wenn es kompiliert, kannst du das Ergebnis in den µC brennen? Wenn ja, 
läuft das Programm? Was macht es? Was macht es nicht?

Kurz gefasst: Wenn ich dir sage "Mein Auto geht nicht!"
Kannst du damit irgendetwas anfangen?


Dein Code compiliert nicht.
Der Compiler beschwert sich, dass er usart_init() nicht kennt.
Dann lass es raus. Um eine LED einzuschalten, brauchst du keine USART

#include <avr/io.h>
#include <stdlib.h>

int main(void)
{
  DDRA   = (1<<PA1);
  PORTA |= (1<<PA1);

  while( 1 )
    ;
}

Je nachdem wie deine LED verschaltet sind, leuchten die entweder, wenn 
man den Port Pin auf 1 oder auf 0 setzt. In letzterem Fall müsste es 
heißen
#include <avr/io.h>
#include <stdlib.h>

int main(void)
{
  DDRA   =  (1<<PA1);
  PORTA &= ~(1<<PA1);

  while( 1 )
    ;
}

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger (kbuchegg) (Moderator).

Vielen Dank für die Antwort...ich habe das "Programm" ins laufen 
bekommen und mich mal in das oben verlinkte Tutorial eingelesen.

Unter dem Thema "Verändern von Registerinhalten" wird hier folgendes 
beschrieben:

 x |= (1 << Bitnummer);  // Hiermit wird ein Bit in x gesetzt




Sie haben mir nun folgenden Code empfolen:

DDRA   = (1<<PA1);
PORTA |= (1<<PA1);


von einem anderen User (siehe oben) wurde folgender Code gepostet:

DDRA = (1 << DDA1);
PORTA |= (1<<PA1);


Meine Frage ist nun was man für die Bitnummer eintragen muss...weil oben 
einmal PA1 und einmal DDA1 verwendet wird. Was heißt das?

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

Bewertung
0 lesenswert
nicht lesenswert
Thorsten schrieb:

> Meine Frage ist nun was man für die Bitnummer eintragen muss...weil oben
> einmal PA1 und einmal DDA1 verwendet wird. Was heißt das?

PA1 und DDA1 sind lediglich zwei verschiedene Worte für: 1

In Wirklichkeit steht da:

    DDRA = (1 << 1);


Also eine 1 um 1 Stelle binär nach links geschoben.
Ob man DDA1 oder PA1 schreibt ist IMHO Geschmackssache.

Für jeden Port, jedes Datenrichtungsregister gibt es vordefinierte 
Konstanten, in deren Namen die Portbezeichnung vorkommt. PA1 ist also 
als Bit 1 am Port A zu lesen. PB1 wäre das Bit 1 am Port B.
Nun ist aber Bit 1 immer Bit 1, egal ob am Port A oder am Port B, sodass 
man hier eigentlich gar keine Unterscheidung bräuchte. Genau gleich ist 
das mit den DDA Makros. DDA1 ist Bit 1 im Datenrichtungsregister zum 
Port A. ABer auch dort ist Bit 1 immer Bit 1, egal ob im 
Datenrichtungsregister, einem Port oder sonstwo: Bit 1 bleibt immer Bit 
1 in einem Byte und daran ist auch nicht zu rütteln.

Im Grund hätee man auch einfach nur ein #define für ein generisches Bit 
1 machen können. Dann würde man schreiben ...

   DDRA   = ( 1 << BIT1 );
   PORTA |= ( 1 << BIT1 );

..., alles würde aufs gleiche rauslaufen, jeder würde sich trotzdem 
auskennen und mann hätte ein paar Kürzel weniger.

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.