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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jonas (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Jonas schrieb:
> ( 1 << PORTB5 );

von Jonas (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ok..
Ich werde bei meiner bewehrten Routine bleiben.

Beste Grüße

von Codeleser (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

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

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]
  • [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.