Forum: Mikrocontroller und Digitale Elektronik LED blinken lassen funktioniert nicht wenn ich nur den entsprechenden Pin als Ausgang setze


von Jonas (Gast)


Lesenswert?

Hallo,
ich habe ein merkwürdiges Problem, woran ich als Anfänger scheiter. Ich 
habe ein Arduino Uno, den ich habe, da hier alles drauf ist (quarz, 
Programmierschnittstelle, Kondensatoren usw). Programmieren tu ich aber 
über atmelstudio in normalem C.

Es ist ja eine LED an PB5 (arduino Pin13) angebracht. Diese möchte ich 
blinken lassen
1
#define F_CPU 16000000UL
2
#include <util/delay.h>
3
#include <avr/io.h>
4
5
6
int main(void)
7
{
8
    DDRB |=  PINB5;
9
    PORTB |= PORTB5;
10
  while(1){
11
      PORTB ^= ( 1 << PORTB5 );
12
        _delay_ms(1000);
13
14
  }
15
  
16
}

Aber die LED bleibt an.
tausche ich die Zeile
DDRB |= PINB5 mit
DDRB |= 0xFF
funktioniert es.
aber warum funktioniert das nicht, wenn ich nur PINB5 als Ausgang setze? 
habe auch alle anderen probiert (einfach die zahlen von 0 bis 7 (aus 
iom328p.h)) aber nie fängt die an zu blinken.

von Jim M. (turboj)


Lesenswert?

Schau Dir mal die konkrete Definition von "PINB5" an.

Dann siehst Du das
1
    DDRB |=  1 << PINB5;

korrekt gewesen wäre...

von Codeleser (Gast)


Lesenswert?

Jonas schrieb:
> DDRB |=  PINB5;

Diese Zeile übersetzt sich zu

DDRB |= 5;

Setzt sich in Bits zusammen aus  0000_0101

Das Bit 5 das du setzen willst ist nun nicht dabei....

Ebenso verhält es sich mit Zeile

PORTB |= PORTB5;

Hier machst du es richtig, du benutzt PORTB5 zu shiften:

Jonas schrieb:
> PORTB ^= ( 1 << PORTB5 );

von Achim (Gast)


Lesenswert?

Jonas schrieb:
> ( 1 << PORTB5 );

von Jonas (Gast)


Lesenswert?

Doof. Ich ärgere mich. Vor allem, weil ich es in der while-Schleife 
richtig gemacht habe.
war ja klar, dass es ein banaler Fehler war. Aber als Anfänger sieht man 
das dann doch nicht immer.
Ich danke euch allen für die schnelle hilfe. Dann kann ich jetzt den 
Timer in angriff nehmen.

von Codeleser (Gast)


Lesenswert?

Jonas schrieb:
> Doof. Ich ärgere mich. Vor allem, weil ich es in der while-Schleife
> ......
> Timer in angriff nehmen.

Sehr Gut!
Diese kleine Rückmeldung gehört dazu den Thread abzuschliessen.

von Robin F. (gehacktes)


Lesenswert?

Achim schrieb:
> Jonas schrieb:
>> ( 1 << PORTB5 );

Ich habe erlich gesagt noch nie gesehen das man das PORTB an dieser 
stelle ausschreibt?! Sagt man da nicht eig. nur PB5?

von Codeleser (Gast)


Lesenswert?

Robin F. schrieb:
> Sagt man da nicht eig. nur PB5?

In den entsprechenden Header-Dateien von ATMEL
(z.B. portpins.h, io****.h) findest alles das "was geht".

von Robin F. (gehacktes)


Lesenswert?

Das finde ich in der Header:
1
#define PORTB   _SFR_IO8 (0x05)
2
/* PORTB */
3
#define PB7     7
4
#define PB6     6
5
#define PB5     5
6
#define PB4     4
7
#define PB3     3
8
#define PB2     2
9
#define PB1     1
10
#define PB0     0

für mich sieht das nicht so aus, als würde man PORRTB an dieser Stelle 
schreiben dürfen!?

Wenn ich die Header "Portpins.h" implementieren würde, dann würde das 
meiner Meinung nach funktionieren wie es oben geschrieben wurde, ohne 
diese Header nicht.
1
#if defined(PB5) && !defined(PORTB5)
2
#  define PORTB5 PB5
3
#elif defined(PORTB5) && !defined(PB5)
4
#  define PB5 PORTB5
5
#endif
Oder beachte ich da irgendwas nicht?

: Bearbeitet durch User
von Codeleser (Gast)


Lesenswert?

Robin F. schrieb:
> für mich sieht das nicht so aus, als würde man PORRTB an dieser Stelle
> schreiben dürfen!?

Für mich sieht es so aus dass man überall PORRTB schreiben darf.
Man muss nur mit den Konsequenzen daraus umgehen können.

von Robin F. (gehacktes)


Lesenswert?

Ok..
Ich werde bei meiner bewehrten Routine bleiben.

Beste Grüße

von Codeleser (Gast)


Lesenswert?

Robin F. schrieb:
> Ok..
> Ich werde bei meiner bewehrten Routine bleiben.

Gut wäre es wenn deine Rächdschraipung noch etwas bewehrter wehre.

von Jonas (Gast)


Lesenswert?

Das Problem bei mir ist, dass ich PB5 nicht schreiben kann, da es 
niergends definiert ist. irgendwie habe ich die avr/io.h nicht. Wenn die 
öffnen möchte, passiert einfach nichts. in der header iom328p.h ist PB5 
auch nicht definiert, sondern PINB5. Daher habe ich das so geschrieben.

von Codeleser (Gast)


Lesenswert?

Jonas schrieb:
> Das Problem bei mir ist, dass ich PB5 nicht schreiben kann

Du musst sicherstellen (welches Studio verwendest du?) dass
du deinen Prozessor im Studio-Projekt definiert hast. Wenn
dies der Fall ist dann müsstest du auch die gewünschten
Bezeichnungen verwenden können.

von Jonas (Gast)


Angehängte Dateien:

Lesenswert?

Benutze atmelStudio version 7 (7.0.943)
gewählt habe ich den Atmega328P, da dieser ja auf dem Arduino verbaut 
ist.

von Wolfgang (Gast)


Lesenswert?

Jonas schrieb:
> irgendwie habe ich die avr/io.h nicht

Hauptsache du sagst das nicht deinem Compiler. Sonst weigert der sich 
noch plötzlich, deinen Code zu kompilieren ;-)
Offensichtlich findet der die.

Oder guck in der portpins.h nach. Da ist auch PB5 definiert.

von Jonas (Gast)


Lesenswert?

Wenn ich in der Solution direkt danach suche, wird mir die auch 
angzeigt. (Vorher wollte ich mit rechtsklick -> go to implementation)
aber hier wird nur die oben erwähnte header includiert

#elif defined (_AVR_ATmega328P_)
#  include <avr/iom328p.h>

und in dieser steht kein PB5 :(

von Codeleser (Gast)


Lesenswert?

Jonas schrieb:
> irgendwie habe ich die avr/io.h

#include <avr/io.h>

muss in deiner Source stehen.

Wenn das nicht funktioniert solltest du nochmal ein Projekt
neu anlegen und deinen Sourcecode in die Datei main.c
hereinkopieren.

Leider kann man bereits beim Anlegen im (komplizierten)
Studio 7 einiges falsch machen.

von Codeleser (Gast)


Lesenswert?

Codeleser schrieb:
> #include <avr/io.h>
>
> muss in deiner Source stehen.

... und mehr nicht! Alles andere inkludieren geschieht
erst mal automatisch.

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.