Forum: Mikrocontroller und Digitale Elektronik Ports am ATmega 16


von Daniel (Gast)


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

von Daniel (Gast)


Lesenswert?

Ich wollte nur sagen dass der Atmega in einem STK500 sitzt

von ecslowhand (Gast)


Lesenswert?

Eben drum......PORTX=High -> LED aus

Siehe mal ins schematic vom STK500

LG EC

von Daniel (Gast)


Lesenswert?

Ja aber wenn ich PORTx belege dann leuchtet die auch

von ich (Gast)


Lesenswert?

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

von Daniel (Gast)


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?

von ich (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

Zeig doch mal dein Programm her.
Ansonsten: Evtl. vergessen, JTAG abzuschalten?

von ich (Gast)


Lesenswert?

Sende dein Programm mal als Anhang mit.

von ich (Gast)


Lesenswert?

ja ja die lieben Fuse Bits........

von Daniel (Gast)


Lesenswert?

#include <io.h>

int main()
{
   PORTB = 0;

   DDRB = _BV(1);

  return 0;
}

Ich bitte um Verbesserungen

von Michael K. (mmike)


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

von ich (Gast)


Lesenswert?

Wo ist " _BV(1) " definiert?

von Daniel (Gast)


Lesenswert?

Danke für deine flotte Antwort.

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

von Rolf Magnus (Gast)


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?

von Michael K. (mmike)


Lesenswert?

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

von ich (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

Was ist _BV(x) ?
und welchen Wert hat _BV(x)?

von Daniel (Gast)


Lesenswert?

Ich verwende das AVR Studio

von ich (Gast)


Lesenswert?

Ist auch der richtige Kontroller eingestellt?

von Daniel (Gast)


Lesenswert?

Ja alles ist richtig eingestellt.

DIe leds leuchten schwach bei PORTB  = 0xFF;

von ich (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

Ich verwende das STK500

In dem board ist ein Atmega16.

von ich (Gast)


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.

von ich (Gast)


Lesenswert?

Ist der atmega 16 auch im richtigen Sockel?

SCKT3100A3

von ich (Gast)


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.

von Daniel (Gast)


Lesenswert?

Das tuts aber umgekehrt:

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

von ich (Gast)


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.

von Daniel (Gast)


Lesenswert?

Das tuts aber wieder umgekehrt:

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

von ich (Gast)


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.

von -gruber Stefan (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

?????????????????????????????????

von -gruber Stefan (Gast)


Lesenswert?

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

von ich (Gast)


Lesenswert?

Aha    ein Österreicher

von Daniel (Gast)


Lesenswert?

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

von Michael K. (mmike)


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.

von ich (Gast)


Lesenswert?

Ojjjjjeeeee.....

Nimm einen anderen Atmel
Irgendeinen.

von Michael K. (mmike)


Lesenswert?

???

von ich (Gast)


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.

von Rolf Magnus (Gast)


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.

von Daniel (Gast)


Lesenswert?

Die LED leuchtet immer recht schwach.
Der Atmega rennt mit 3,686 Mhz.

von ich (Gast)


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 ;-(

von Daniel (Gast)


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

von ich (Gast)


Lesenswert?

Probier mal einen Tiny2313.
im Steckplatz SCKT3300D3
Habe es so getestet und OK.

von Philipp B. (philipp_burch)


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.

von Daniel (Gast)


Lesenswert?

Der STK500 hat nix, weil der Atmega8515 problemlos funktioniert.

von Hannes L. (hannes)


Lesenswert?

Daniel wrote:
> Der STK500 hat nix, weil der Atmega8515 problemlos funktioniert.

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

...

von Rahul D. (rahul)


Lesenswert?

oder im gleichen Sockel?

von ein verzweifelter (Gast)


Lesenswert?

oder im gleichen Sockel?

Wie geht das?

von Rahul D. (rahul)


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

von ein nicht mehr verzweifelter (Gast)


Lesenswert?

Ja eben

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.