www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ports am ATmega 16


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich hab da ein gewisses Problem:

Wenn ich bei DDRx einen output definiere, dann leuchtet die LED gleich, 
obwohl
PORTx =0 ist.

PORTA spinnt bei mir, weil wenn ich einen PAx definiere, leuchtet immer 
die darunterliegende Led.

PORTC tut nix und PORTD auch nichts.

Mfg. D.M

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte nur sagen dass der Atmega in einem STK500 sitzt

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben drum......PORTX=High -> LED aus

Siehe mal ins schematic vom STK500

LG EC

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber wenn ich PORTx belege dann leuchtet die auch

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED's auf dem STK500 sind low Aktiv
Du must also eine 1 in den Ausgang schreiben
damit die LED aus ist.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber die led leuchtet einfach immer, ob der ausgang 1 oder 0 ist.
Immer wenn die led aus ausgang definiert ist.

Was hat das mit dem Pull up wiederstand auf sich?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerPullup im Kontroller läst sich ein und ausschalten.
Den braucht man nur um einen externen zu sparen
bei Abfrage wenn ein Taster am Port ist.

mit:

DDRx  = 0 Port auf eingang
PORTx = 1 Pull up aktiv

Widerstandswert eines aktiven Pull Up's ca. 50-100KOhm

DDRx  = 1 Port auf ausgang
PORTx = 0 LED ist ein
PORTx = 1 LED ist aus

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig doch mal dein Programm her.
Ansonsten: Evtl. vergessen, JTAG abzuschalten?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sende dein Programm mal als Anhang mit.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ja die lieben Fuse Bits........

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <io.h>

int main()
{
   PORTB = 0;

   DDRB = _BV(1);

  return 0;
}

Ich bitte um Verbesserungen

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

Dreh das PORTx und DDRx mal um !

#include <io.h>

int main()
{
   DDRB   = 0xFF; // Alle Ausgänge an PORTB als Ausgang

   // jetzt kommt die Entscheidung ob an oder aus ....

   PORTB  = 0x00; // jetzt sind die LED's an

   PORTB  = 0xFF; // jetzt sind die LED's aus

   return 0;
}

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist " _BV(1) " definiert?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine flotte Antwort.

Aber geht das auch nicht mit Pxn oder _BV()?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #include <io.h>

Müßte (zumindest bei avr-gcc und avr-libc) eigentlich eher heißen:

#include <avr/io.h>

Der Rest sieht soweit ok aus. Port B1 wird also als Ausgang definiert, 
und der Wert ist 0. So sollte die LED dann leuchten.
Wenn die auch leuchtet, wenn du PORTB = 0xff machst, ist was faul. Hast 
du den richtigen Controller ausgewählt?

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher geht das auch. Jeder wie er möchte. Ich kenn mich mit dem _BV(x) 
nicht aus und machs immer anders ....

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für eine Entwicklungsumgebung verwendest du?
Wie list du die Fuse Bits aus dem Kontroller?

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist _BV(x) ?
und welchen Wert hat _BV(x)?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende das AVR Studio

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist auch der richtige Kontroller eingestellt?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja alles ist richtig eingestellt.

DIe leds leuchten schwach bei PORTB  = 0xFF;

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und welche Hardware zum programmieren?
Soviele Fragezeichen habe ich schon lange nicht mehr getippt.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende das STK500

In dem board ist ein Atmega16.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

int main (void)
{

  PORTB = 0xFF

  DDRB = =xFC

   while(1)
   {

     /* "leere" Schleife*/;

   }

}

Gib das mal ein.
Danach müssten LED 0 und LED 1 leuchten.
Der Rest ist aus.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der atmega 16 auch im richtigen Sockel?

SCKT3100A3

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt richtig!!!

#include <avr/io.h>

int main (void)
{

  PORTB = 0xFF

  DDRB = =0xFC // Hatte die "0" vergessen

   while(1)
   {

     /* "leere" Schleife*/;

   }

}

Gib das mal ein.
Danach müssten LED 0 und LED 1 leuchten.
Der Rest ist aus.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das tuts aber umgekehrt:

LED0 und 1 leuchten überhaupt nicht und der Rest leuchtet eher schwach

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blöde Tippfehler.....

Jetzt richtig!!!

#include <avr/io.h>

int main (void)
{

  PORTB = 0xFF

  DDRB  = 0xFC // Hatte die "0" vergessen

   while(1)
   {

     /* "leere" Schleife*/;

   }

}

Gib das mal ein.
Danach müssten LED 0 und LED 1 leuchten.
Der Rest ist aus.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das tuts aber wieder umgekehrt:

LED0 und 1 leuchten überhaupt nicht und der Rest leuchtet eher schwach

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da stimmt grundsätzlich was nicht.

Zieh den Atmel aus der Fassung vorher Board ausschalten.
Flachbandkabel abziehen.
Board wieder einschalten.

Jetzt verbinde nacheinander LED0 Pin am LED Sockel bis LED7 Pin mit 
Masse.
Jedesmal muß eine LED leuchten solange der Pin mit Masse verbunden ist.

Autor: -gruber Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kann eine if Abfrage bestimmt werden:
for-(if (a!=0))(
Gruber=schweintimausi)
)

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
?????????????????????????????????

Autor: -gruber Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na war nur ein Spaß, bin ein Kärntner und kann natürlich nicht 
Programmieren!!

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha    ein Österreicher

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich schon früher gemacht, ich weiß das sie leds invertiert 
sind.
Die Led leuchtet dann.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Controller hoch fährt und werden alle Port standardmässig als 
Input initialisiert, also, wenn dann der PORTB gesetzt wird, dann wird 
damit der Pullup eingeschaltet und wenn danach der Port als Ausgang 
geschaltet wird, dann macht das ganze KEINEN Sinn...

Erst DDRx setzten und dann PORTx!

Also: (<ich> hat die Strichpunkte vergessen)

#include <avr/io.h>
#include <inttypes.h>

int main (void)
{
  uint16_t i, j;
  DDRB  = (1 << PB0); // PB0 als Ausgang

  PORTB = 0x00;  // Alle Ausgänge von PORTB auf low

  for (;;)
  {
    PORTB ^= (1 << PB0); // Toggle PB0

    // Hier warten
    for (i = 0; i < 65535; i++)
      for (j = 0; j < 5; j++);
  }

  return 1;
}

Daniel:

Zum testen nimm' doch eine Steckbrücke und teste mal eine LED durch. 
Steck das Kabel an LED0 und halte das andere Ende mal an GND und VTG. 
Bei GND sollte die LED leuchten und bei VTG aus sein.

Dann steck das Ende dieser Steckbrücke auf den Ausgang B0 und 
programmier' Deinen Chip mit obigem Code .... dann sollte die LED0 
abhängig von Deiner eingestellten Taktfrequenz blinken.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ojjjjjeeeee.....

Nimm einen anderen Atmel
Irgendeinen.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja Ja die Strichpunkte vergesse ich meistens, aber mein Studio
wacht darüber.

Wenn mann die Ports zuerst setzt und dann das DDRx wird der Portpin
beim einschalten sofort auf 1 gesetzt und nicht erst ein kurzer
low Impuls ausgegeben.

Mansche Schaltungen reagieren sonst recht lustig.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ich: Du schreibst doch selbst, daß man eine 1 schreiben muß, damit die 
LED aus ist, und eine 0, damit sie an ist. Das DDR-Bit muß natürlich 
dann auf 1 stehen.

>   PORTB = 0xFF
>
>   DDRB  = 0xFC // Hatte die "0" vergessen

So sind Port B0 und B1 als Eingang mit aktivem Pull-Up konfiguriert. Die 
LEDs dürften so also nicht leuchten - tun sie auch nicht.

Die restlichen Pins sind als Ausgang auf high eingestellt. Die LEDs 
sollten also ebenfalls aus sein. Sie leuchten, aber nur "schwach".

Klingt jedenfalls nicht so falsch, wie du behauptest.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LED leuchtet immer recht schwach.
Der Atmega rennt mit 3,686 Mhz.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jetzt

#include <avr/io.h>

int main (void)
{

  PORTB = 0xFC; //0b00000011 Bitmuster ausgeben
  DDRB  = 0xFF; //PortB auf ausgang schalten

   while(1)
   {

     /* "leere" Schleife*/;

   }

}

Das kommt davon wenn mann 3 Sachen auf einmal machen will.
Ein Teil bleibt dann auf der Strecke.
Oder auch alle.

Asche auf mein Haupt ;-(

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es nicht sein, dass mein Atmega hin is, weil bei anderen PORTS 
lechten ganz andere leds als was sollen. oder es leuchten zu wenige

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal einen Tiny2313.
im Steckplatz SCKT3300D3
Habe es so getestet und OK.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte es sein, dass du den Watchdog eingeschaltet hast (Fuse)? Dann 
wird der Controller in einem bestimmten Intervall zurückgesetzt, wobei 
die LEDs nach einem Reset immer ausgeschaltet werden -> schwaches 
glimmen.

Nachmessen mit einem Oszi hilft auch. Oder halt wirklich mal prüfen, ob 
das STK500 und der Controller noch heile sind.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der STK500 hat nix, weil der Atmega8515 problemlos funktioniert.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> Der STK500 hat nix, weil der Atmega8515 problemlos funktioniert.

Mega8515 und Mega16 stecken aber nicht zufällig gleichzeitig im STK500? 
- Oder?

...

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder im gleichen Sockel?

Autor: ein verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder im gleichen Sockel?

Wie geht das?

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>oder im gleichen Sockel?
>Wie geht das?

Zumindest nicht zeitgleich...

Der ATMEGA8515 sollte zum Programmieren im Sockel "SCKT3000D3" stecken, 
und der Mega16 im Sockel "SCKT3100A3"...

Autor: ein nicht mehr verzweifelter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja eben

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.