Forum: Mikrocontroller und Digitale Elektronik Initialisierungsfehler - PA & PD Mega16


von Thomas (Gast)


Lesenswert?

Hallo Leute,

ich bin grad auf einen sehr eigenartigen Fehler gestoßen. Dieses kleine 
Programm hier soll nichts Anderes tun, als PD5 und PD6 zuschalten, wenn 
PC0 und PC1 auf Low stehen.
Zur Initialisierung dieses Programmabschnitts wird eigentlich nur DDRC 
und DDRD benötigt. Wenn ich nun aber, wie hier im Beispiel DDRA mit 
initialisiere und für die beiden "XX" 1 eintrage, werden plötztlich PD5 
und PD6 gesetzt. Die IF-Anweisungen werden völlig ignoriert.
Wie kann ich mir das erklären? Hatte sowas noch nie.

Wenn ich nun aber "XX" mit 0 initialisiere, funktioniert alles bestens. 
Wie kann das sein? DDRA wird doch hier im Programm nirgends benötigt? 
Versteh gerade die Welt nicht mehr!

Vielen Dank für Eure Hilfe schon mal.

Grüße Thomas

#include <avr/io.h>
#include <stdint.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <avr/interrupt.h>


int main (void)
{

  DDRA = 0b11XX0000;
  DDRC = 0b00000000;
  DDRD = 0b11110000;



  for(;;)
  {

  if(!(PINC &(1<<PINC0)))
   {
      PORTD = PORTD | (1 << PD5);
    }
    if(!(PINC &(1<<PINC1)))
    {
      PORTD = PORTD | (1 << PD6);
    }

  }

}

von Thomas (Gast)


Lesenswert?

Wenn ich DDRA folgendermaßen initialisiere, passiert das Gleiche:

DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3) | (1 << 
DDA4 | (1 << DDA5) | (1 << DDA6) | (1 << DDA7));

von mehrfacher STK500-Besitzer (Gast)


Lesenswert?

JTAG-Fuse!

von Thomas (Gast)


Lesenswert?

Ahh, Dankeschön. Daran lag es! Dieses Forum ist einfach klasse!

Grüße!

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Ach, und hier noch so ein Problem. An den Eingängen befindet sich ein 
High Signal. Es sollten also keine Ausgänge geschaltet werden.

Leider wird jedoch PD5 geschaltet. Wie kommt das? Im Anhang mal ein 
Screenshot von den Fusebits. Vielleicht liegts ja daran. Als Testboard 
hab ich übrigens das Pollin AVR-Board.

Hier der Quallcode:

#include <avr/io.h>

int main (void)
{
  DDRB = 0b00000000;
  DDRD = 0b01100000;

  for(;;)
  {

  if(!(PINB &(1<<PINB7)))
   {
      PORTD = PORTD | (1 << PD5);
    }
    if(!(PINB &(1<<PINB6)))
    {
      PORTD = PORTD | (1 << PD6);
    }

  }

}

von Karl H. (kbuchegg)


Lesenswert?

Thomas wrote:
> Ach, und hier noch so ein Problem. An den Eingängen befindet sich ein
> High Signal.

Sicher?
Was hängt an diesem Eingang? Schalter? Taster? Elektronik?

Dein Programm schaltet zwar den PD5 auf High, aber es schaltet
nie wieder auf 0 zurück. D.h. der kleinste High Puls schaltet
den Ausgang ein und dann bleibt er dort, egal was sonst so
am Eingang passiert.

Wenn dort ein Taster in der üblichen Beschaltung nach Masse
schaltet: Du hast keine Pullups eingeschaltet.

von Thomas (Gast)


Lesenswert?

Dieses kleine Testprogramm, was ich hier rein gestellt habe, entstand 
nur in Anbindung an ein viel größeres Programm, wo ich mit diesem Fehler 
zu tun hatte. Wollte halt nicht das große Programm hier rein stellen.

Die PullUps hab ich hardwareseitig realisiert. Sobald ich nun die 
Eingänge gegen Masse stelle, müssten PD5 und PD6 auf High geschaltet 
werden und, wie du schon sagst, nie wieder auf Low kommen. Wie gesagt, 
das hier ist ja nur ein kleines Testprogramm zum Hauptprogramm, wo mich 
dieses Problem störte.

Aber noch etwas Anderes. Mir ist aufgefallen, dass sich PINB7 nicht mit 
10KOhm auf High setzen lässt. Das war auch der Grund, warum PD5 
dauerhaft leuchtete. Wenn ich nun Probeweise statt des 10KOhm Pullups 
einen 1KOhm Widerstand nutze, klappt es plötzlich.

Wie kann das sein? 1KOhm ist doch schon fast zu wenig?

Grüße Thomas.

von Thomas (Gast)


Lesenswert?

Ach so, an dem Eingang hängt ein normaler Taster, der gegen GND 
schaltet.
Zusätzlich befindet sich noch ein PullUp Widerstand von jeweils 10K und 
1K an den Eingängen.

von Karl H. (kbuchegg)


Lesenswert?

Thomas wrote:
> Dieses kleine Testprogramm, was ich hier rein gestellt habe, entstand
> nur in Anbindung an ein viel größeres Programm, wo ich mit diesem Fehler
> zu tun hatte. Wollte halt nicht das große Programm hier rein stellen.

Ich bitte auch um Verständnis, dass ich mich nur nach dem richten
kann, was ich hier sehe.
Und so suche ich dann eben das gepostete Programm nach möglichen
Fehlern bzw. den üblichen Problemen ab.

> Aber noch etwas Anderes. Mir ist aufgefallen, dass sich PINB7 nicht mit
> 10KOhm auf High setzen lässt. Das war auch der Grund, warum PD5
> dauerhaft leuchtete. Wenn ich nun Probeweise statt des 10KOhm Pullups
> einen 1KOhm Widerstand nutze, klappt es plötzlich.
>
> Wie kann das sein? 1KOhm ist doch schon fast zu wenig?

Interessant. Keinen blassen Schimmer. Allerdings benutzt ich an
meinem Mega16 bei solchen Sachen auch immer den internen
Pullup.

von Karl H. (kbuchegg)


Lesenswert?

Moment:

PB7 ist doch SCK vom ISP. Ist der ISP Programmer noch an die
Schaltung angeschlossen?

von Thomas (Gast)


Lesenswert?

Kein Problem. Wollte ja auch nur begründen, warum ich nur diesen 
Programmschnipsel gepostet habe.

Das Ganze wird über das Pollin AVR-Board programmiert. Das ist auch noch 
angeschlossen. Ich glaub, ich erahne, worauf du hinaus willst. Das würde 
auch erklären, warum sich der µC nicht programmieren lässt, wenn der 
1K-Pullup angeschlossen ist.

von Karl H. (kbuchegg)


Lesenswert?

> Ich glaub, ich erahne, worauf du hinaus willst. Das würde
> auch erklären, warum sich der µC nicht programmieren lässt, wenn der
> 1K-Pullup angeschlossen ist.

Ich denke mal: Bingo!

von Thomas (Gast)


Lesenswert?

Man lernt immer wieder dazu. Dankeschön.

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.