www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA 8 PORTS Ausgang LED leuchtet nicht


Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sowieso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohne delay wird das nichts

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie delay????

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich warscheinlich undeutlich ausgedrückt


Es soll nur die Leds eingeschaltet werden.

nur das machen sie nicht

Autor: Sowieso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast oben die I/O.h vergessen.

Autor: Matthias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Schreibfehler "vois main(void" sind nicht in deinem Code?

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bringt nichts

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn die LEDs angeschlossen? Sind die etwa Low-aktiv?

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie im TUTORIAL I/O Grundlagen.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann sind siw Low-Aktiv.
#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();

for (;;)
 {
 }

}

Ist zwar nicht schön so, sollte aber funktionieren

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht auch nicht

ist der mega kapput??

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, ich hab' den Code grade mal im Debugger, da läuft's auch nicht. 
Hab' irgendwie grade 'n Brett vorm Kopf ;).

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal das:
#include <avr/io.h>

#define LED_PORT_DIR DDRD
#define LED_PORT PORTD
#define LED_1 4
#define LED_2 8

char i = 0;

int main (void)
{
LED_PORT_DIR |= LED_1 | LED_2;

LED_PORT &= ~LED_1 & ~LED_2;

i = 8;

while (1);

return 0;

}

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.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nichts passiert led ports habe ich auf 2 und 3 angepasst

Autor: flummi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
}

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine chance geht nicht

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, wenn du das Makefile lässt wie es ist (OPT = s) kannst du es so 
probieren:
#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


volatile unsigned char i = 0;


int main(void)
{
led1_port();
led2_port();

led1_low();
led2_low();

for (;;)
 {
  i++;
  if (i==255)
    {
      i=0;
    }
 }
 
return 0;

}
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.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

also der mega war hinüber

habe einen anderen 8 ter  eingelötetr und der geht

danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.