Forum: Mikrocontroller und Digitale Elektronik LED problem - ein Port geht, anderer nciht


von Johann T. (joschua011)


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.

von Michael U. (amiga)


Lesenswert?

Hallo,

irgendwie verstehe ich jetzt Deine Frage nicht.
Du postetst ein Programm, daß die LED an PC5 blinkem lässt und schreibst 
dazu, daß das so funktioniert.
Wobei sollen wir Dir nun helfen?

Das Programm für die anderen LEDs anpassen oder was?

Gruß aus Berlin
Michael

von Axel D. (axel_jeromin) Benutzerseite


Lesenswert?

1. Fusebit JTAG löschen
2. Avcc an 5V
3. Widerstand ohne ie schreiben.

Axel

von Roland P. (pram)


Lesenswert?

ist das evtl der JTAG-Port? der muss nämlich per Fuse deaktiviert 
werden.

EDIT: war wieder einer schneller ;-)

von Beitragleser (Gast)


Lesenswert?

@Axel, @Roland:

Lest ihr eigentlich auch die Artikel, auf die ihr antwortet? Johann 
verwendet einen ATMega8, der hat kein JTAG.

von Stefan B. (stefan) Benutzerseite


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
}

von Johann T. (joschua011)


Lesenswert?

vielen Dank stefan,
hat mir sehr geholfen!!!!!!!!!!

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.