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

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