LED schalten

Gast #1268864
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
#1268892
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
}
Gast #1277138
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?
#1277144
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

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