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.
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
ist das evtl der JTAG-Port? der muss nämlich per Fuse deaktiviert werden. EDIT: war wieder einer schneller ;-)
@Axel, @Roland: Lest ihr eigentlich auch die Artikel, auf die ihr antwortet? Johann verwendet einen ATMega8, der hat kein JTAG.
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.