Hallo benutze eigendlich immer 128iger Atmels nun habe ich mal den 8 zur Hand Will zwei LEDS ein und Auschalten folgendes habe ich definiert #define led1_port() DDRD|=(1<<2); #define led2_port() DDRD|=(1<<3); #define led1_high() PORTD|=(1<<2); //LED gegen plus aus #define led1_low() PORTD&=~(1<<2); //LED gegen Masse ein #define led2_high() PORTD|=(1<<3); //LED gegen plus aus #define led2_low() PORTD&=~(1<<3); //LED gegen masse ein in der Main vois main(void { led1_port(); led2_port(); led1_low(); led2_low(); } auch mit led1_high(); leuchtet nichts. Die leds funktionieren Die schlatung ist wie im TUTorial von 5V über 1K R dann LED dann Port Was mache ich falsch Danke
Ich habe mich warscheinlich undeutlich ausgedrückt Es soll nur die Leds eingeschaltet werden. nur das machen sie nicht
die Schreibfehler "vois main(void" sind nicht in deinem Code?
nein void main(void) #include <avr/io.h> #include <inttypes.h> #include <stdio.h> #include <stdint.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h> #define led1_port() DDRD|=(1<<2); #define led2_port() DDRD|=(1<<3); #define led1_high() PORTD|=(1<<2); //LED gegen plus aus #define led1_low() PORTD&=~(1<<2); //LED gegen Masse ein #define led2_high() PORTD|=(1<<3); //LED gegen plus aus #define led2_low() PORTD&=~(1<<3); //LED gegen masse ein void main(void) { led1_port(); led2_port(); led1_low(); led2_low(); } oder void main(void) { led1_port(); led2_port(); led1_high(); led2_high(); } geht aber nicht
Füge mal eine Endlosschleife ein: void main(void) { led1_port(); led2_port(); led1_high(); led2_high(); for (;;) { } } Sonst läuft der µC immer wieder neu an.
Noch eins Die Reset Schaltung als r habe ich 1k und als 47n 100n hat das was zu sagen die fuse kann ich auslesen auch beim beschreiben keine fehler
Dann sind siw Low-Aktiv.
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #include <stdio.h> |
4 | #include <stdint.h> |
5 | #include <avr/interrupt.h> |
6 | #define F_CPU 1000000UL
|
7 | #include <util/delay.h> |
8 | #define led1_port() DDRD|=(1<<2);
|
9 | #define led2_port() DDRD|=(1<<3);
|
10 | |
11 | #define led1_high() PORTD|=(1<<2); //LED gegen plus aus
|
12 | #define led1_low() PORTD&=~(1<<2); //LED gegen Masse ein
|
13 | |
14 | #define led2_high() PORTD|=(1<<3); //LED gegen plus aus
|
15 | #define led2_low() PORTD&=~(1<<3); //LED gegen masse ein
|
16 | |
17 | |
18 | |
19 | |
20 | |
21 | void main(void) |
22 | {
|
23 | led1_port(); |
24 | led2_port(); |
25 | |
26 | led1_low(); |
27 | led2_low(); |
28 | |
29 | for (;;) |
30 | {
|
31 | }
|
32 | |
33 | }
|
Ist zwar nicht schön so, sollte aber funktionieren
Nee, ich hab' den Code grade mal im Debugger, da läuft's auch nicht. Hab' irgendwie grade 'n Brett vorm Kopf ;).
Probier mal das:
1 | #include <avr/io.h> |
2 | |
3 | #define LED_PORT_DIR DDRD
|
4 | #define LED_PORT PORTD
|
5 | #define LED_1 4
|
6 | #define LED_2 8
|
7 | |
8 | char i = 0; |
9 | |
10 | int main (void) |
11 | {
|
12 | LED_PORT_DIR |= LED_1 | LED_2; |
13 | |
14 | LED_PORT &= ~LED_1 & ~LED_2; |
15 | |
16 | i = 8; |
17 | |
18 | while (1); |
19 | |
20 | return 0; |
21 | |
22 | }
|
warum die letzte Anweisung vor der Endlosschleife nicht ausgeführt wird und sich der Debugger 'aufhängt' weiß ich nicht. Vielleicht liegt's am AVR-Studio. Teste es doch mal in der Hardware.
nichts passiert led ports habe ich auf 2 und 3 angepasst
Moin, ihr habt da einen gravierenden fehler gemacht. Am anfang der main schaltet ihr die LEDs ein und die restliche laufzeit verbringt de µC in der endlosschleife und langweilt sich. Das i=8 wird evtl. vom Compiler rausoptimiert, da es nirgends benutzt wird. Du kannst ja in die Endlosschleife ein Toggeln der LED einfuegen und zwischendrin eine Zeitverzögerung while(i<32000) // Zeitverzögerung { i++; asm(_nop); //no Operation }
Das 'asm(_nop); //no Operation' kannste auch 'rauslassen, oder willst du dadurch zusätzliche Laufzeit erreichen? Irgendwas optimiert der Compiler weg, stimmt wohl. Er wollte die LEDs ja auch nur einschalten, sprich Datenrichtung der Pins auf Ausgang, Pegel auf low. Im Compiler funktioniert das soweit, das i = 8; habe ich zum Testen reingesetzt, im Compiler wird diese Zuweisung nicht mehr ausgeführt, der Compiler verabschiedet sich ins Nirvana (nicht in die Endlosschleife).
Ich habe im Makefile die Optimierungen auf 0 gesetzt, also 'deaktivert, nun funktioniert's wie's soll. Kannste mal probieren, im Makefile 'OPT = 0' anstatt 'OPT = s' eintragen, 'Make clean' starten und dann nochmal mit 'Make all' compilieren.
OK, wenn du das Makefile lässt wie es ist (OPT = s) kannst du es so probieren:
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #include <stdio.h> |
4 | #include <stdint.h> |
5 | #include <avr/interrupt.h> |
6 | #define F_CPU 1000000UL
|
7 | #include <util/delay.h> |
8 | #define led1_port() DDRD|=(1<<2);
|
9 | #define led2_port() DDRD|=(1<<3);
|
10 | |
11 | #define led1_high() PORTD|=(1<<2); //LED gegen plus aus
|
12 | #define led1_low() PORTD&=~(1<<2); //LED gegen Masse ein
|
13 | |
14 | #define led2_high() PORTD|=(1<<3); //LED gegen plus aus
|
15 | #define led2_low() PORTD&=~(1<<3); //LED gegen masse ein
|
16 | |
17 | |
18 | volatile unsigned char i = 0; |
19 | |
20 | |
21 | int main(void) |
22 | {
|
23 | led1_port(); |
24 | led2_port(); |
25 | |
26 | led1_low(); |
27 | led2_low(); |
28 | |
29 | for (;;) |
30 | {
|
31 | i++; |
32 | if (i==255) |
33 | {
|
34 | i=0; |
35 | }
|
36 | }
|
37 | |
38 | return 0; |
39 | |
40 | }
|
Nun hat der Compiler nix mehr zum Wegoptimieren und das Teil läuft. Die main sollte 'int' als Rückgabewert haben, muss nicht, aber dann kriegste keine Warnung mehr beim Compilieren. Wenn diese Variante nicht funktioniert ist an der Hardware was faul.
hallo also der mega war hinüber habe einen anderen 8 ter eingelötetr und der geht danke
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.