Forum: Mikrocontroller und Digitale Elektronik LED schalten


von Thorsten (Gast)


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

von Amir B. (sticky)


Lesenswert?

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

von ... .. (docean) Benutzerseite


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Thorsten schrieb:

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

Definiere 'funktioniert nicht'

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

von Amir B. (sticky)


Lesenswert?

bist du dir sicher das deine LED am Pin1 des Port A angeschlossen ist?

von Karl H. (kbuchegg)


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

1
#include <avr/io.h>
2
#include <stdlib.h>
3
4
int main(void)
5
{
6
  DDRA   = (1<<PA1);
7
  PORTA |= (1<<PA1);
8
9
  while( 1 )
10
    ;
11
}

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
1
#include <avr/io.h>
2
#include <stdlib.h>
3
4
int main(void)
5
{
6
  DDRA   =  (1<<PA1);
7
  PORTA &= ~(1<<PA1);
8
9
  while( 1 )
10
    ;
11
}

von Thorsten (Gast)


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?

von Karl H. (kbuchegg)


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.

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.