www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

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

  }

}

Autor: Thomas (Gast)
Datum:

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

Autor: mehrfacher STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG-Fuse!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh, Dankeschön. Daran lag es! Dieses Forum ist einfach klasse!

Grüße!

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

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

  }

}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moment:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man lernt immer wieder dazu. Dankeschön.

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.