LED problem - ein Port geht, anderer nciht

OP #1089603
Lesenswert?
• ▲
▼
Guten Tag,
ich habe ein kleines Problem und finde den Fehler nicht...
ich habe 5 Led an Port D (0,1,3,4,5) meines Atmega8
und 1 Led an PC5 angeschlossen.
und zwar so
ATmegapin ---> Wiederstand ---> Led --> GND  (active High )
Led sind alle richtig drinn habs mit Netzgerät ausprobiert.
wenn ich jz die PC5 led zum blinken brigen will, geht das,
bei den restlichen allerdings nicht.......

Hier der code:

#ifndef F_CPU
#define F_CPU 8000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>

#define ledport DDRC
#define ledbit 5



void my_delay(uint8_t x)
{
  uint8_t y;
  for (y=0;y<=x;y++)
  {
    _delay_ms(1);
  }

}

void blinken(uint8_t a)
{
  while(1)
  {
    ledport |= (1<<ledbit);
    my_delay(a);
    ledport &= ~(1<<ledbit);
    my_delay(a);
  }

}


int main(void)
{

  ledport = 0xff; /* Output */
  blinken(254);
}


bitte um hilfe, danke.
Persönliche Seite #1089629
Lesenswert?
• ▲
▼
Du brauchst ZWEI Register:

DDRD und PORTD. DDRD für die Einstellung PORTD ist Ausgabe und PORTD für 
die Ausgabe an sich.
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <stdint.h>
8

9
#define ledport_richtung DDRD
10
#define ledport PORTD
11
#define ledbit 1
12

13
void my_delay(uint8_t x)
14
{
15
  uint8_t y;
16
  for (y=0;y<=x;y++)
17
  {
18
    _delay_ms(1);
19
  }
20

21
}
22

23
void blinken(uint8_t a)
24
{
25
  while(1)
26
  {
27
    ledport |= (1<<ledbit);
28
    my_delay(a);
29
    ledport &= ~(1<<ledbit);
30
    my_delay(a);
31
  }
32
}
33

34
int main(void)
35
{
36
  ledport_richtung = 0xff; /* Output */
37
  blinken(254);
38
}

Hast du nur die LEDs angeschlossen oder auch noch einen 
RS232-Pegelwandler - PD1 an PORTD ist ja TXD der UART. Gehen alle LEDs 
an PORTD nicht, d.h. PD0 bis PD5?

Der Atmega8 hat keinen JTAG, der da zu berücksichtigen wäre.

Johann, nutze die Formatierung des Forums für Quellcode. Es sieht 
schöner aus und ist besser lesbar.

Und noch eine Anmerkung: Es ist ein sehr ungewöhnlicher Stil, wenn man 
die Endlos-while-Schleife in eine Unterfunktion steckt. Der alte Hase 
erwartet die in main(), also z.B. so:
1
void blinken(uint8_t a)
2
{
3
  ledport |= (1<<ledbit);
4
  my_delay(a);
5
  ledport &= ~(1<<ledbit);
6
  my_delay(a);
7
}
8

9
int main(void)
10
{
11
  ledport_richtung = 0xff; /* Output */
12
  while(1)
13
  {
14
    blinken(254);
15
  }
16
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.