Forum: Mikrocontroller und Digitale Elektronik Bin Anfänger, brauche Tips, was man bei uC so alles falsch machen kann


von JoBeginner (Gast)


Lesenswert?

Hallo allerseits,

Ich habe mir neulich das STK500 zugelegt und möchte jetzt mit der 
Programmierung von uC´s durchstarten.
Habe mir einige ATmega32 besorgt und wollte eigentlich ein LCD 
ansteuern.
Jetzt habe ich mir ein PinTest-Programm geschrieben und leider 
festgestellt, dass mindestens ein Drittel aller Pins geschrottet sind 
(scheint zumindest so). Da wundert es mich natürlich nicht mehr, dass 
ich das mit dem LCD nicht hinbekommen habe.

Da ich mit dem uC bereits einige Wochen herumgespielt habe, bin ich mir 
ziemlich sicher, dass ich irgendwann etwas falsch gemacht und ihn so 
geschrottet habe.

Könntet Ihr mir bitte Tips geben, worauf ich achten muss, damit ich 
meine uC´s nicht schrotte !?

Eine mögliche zerstörerische Quelle könnte meine Spannungsversorgung 
sein. Die habe ich mir aus einigen 1,5 V Batterien zusammengestöpselt. 
Mittlerweile zeigt sie nur noch etwa 5,4 V an, aber ich glaube, dass das 
zeitweise schon so knapp 6V gewesen sein dürften. Im Datenblatt steht 
allerdings eine maximale Versorgungsspannung von 5,5 V. Wie empfindlich 
"reagiert" denn ein uC auf sowas?

Ich wäre sehr dankbar für einige Tips für den absoluten Anfänger!
Ich weiß, manche Dinge "weiß man halt", aber ich weiß diese Dinge halt 
manchmal nicht und brauche dann ewig, bis ich herausfinde, woran es 
liegt.

Schönen Gruß
Jo

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Könntet Ihr mir bitte Tips geben, worauf ich achten muss,
> damit ich meine uC´s nicht schrotte!?
Innerhalb der Absolute Maximum Values des Datenblatts bleiben ;-)

Aber eigentlich kann ich da nur sagen: immer einen mehr bestellen.
Manchmal halten die uC Sachen aus, da dachte ich "der ist garantiert 
kaputt!", ein andermal ist das Ding tot, und bei mir will sich kein 
schlechtes Gewissen regen.

> ...so knapp 6V gewesen sein dürften.
> Wie empfindlich "reagiert" denn ein uC auf sowas?
Mit 6V Vcc liegst du ausserhalb der Spezifikation. Das allein ist (noch) 
nicht so schlimm, der wird trotzdem tun. Wenn jetzt aber eine 
ESD-Entladung dazukommt (Teppichboden, Pulli), wird die eingebaute 
Schutzdiode erst bei 6,5V leiten, und das ist dann zuviel für den Pin. 
Bei einer Vcc von 4,5V hätte der überlebt.

> manche Dinge "weiß man halt"...
Sorg dafür, dass die Parameter, an denen du einfach drehen kannst, alle 
korrekt sind. Die einfachsten sind die Versorgungsspannung und die 
Taktfrequenz.

von JoBeginner (Gast)


Lesenswert?

Hallo,

Danke für die Antwort!
Hm, ich habe gerade nocheinmal getüftelt und herausgefunden, dass bei 
allen meinen uC´s die gleichen Pins "kaputt" sind und das auch 
unabhängig davon, auf welcher Platine ich sie teste (habe mir eine 
Testplatine gelötet, Lochraster, alle Pins auf Steckerleisten 
herausgeführt).
Das ist schon verdächtig.
Vielleicht habe ich in meinem Code doch einen Fehler, was mich 
allerdings wundern würde, da das Fehlerbild doch recht komisch aussieht:
Folgende Pins funktionieren nicht (der Rest ohne Probleme):
PA6
PB6
PC2
PC3
PC4
PC5
PC6
ganzer Port D

Dass der ganze Port D nicht funktioniert ist auch sehr komisch, da ich 
darauf schon öfters über UART mit dem PC kommuniziert habe.

Vielleicht könnte sich jemand mal meinen Code ansehen, ob ihm da ein 
Fehler auffällt:
////////////////////////////////////////////////////////////////////////
//////// Hauptprogramm
int main()
{
int i;
int j;

for (i=1;i<5;i++)
  {
  jojoDDRwholePort(i,0xFF); //Port A bis D als Ausgang
  }
jojoDDRsinglePin(4,6,0); //Druckknopf als Eingang (PD6)
jojoPORTsinglePin(4,6,1); //Pullup anmachen

i = 1;
j = 0;
jojoPORTsinglePin (i,j,1); //Pin A0 anmachen

for(;;)
{
if(!(jojoReadSinglePin (4,6))) //wenn Knopfdruck -> nächster Pin
  {
        //Schleife soll bei PORT A bis D je Pin 0 bis 7 durchlaufen
                //vorigen Pin ausschalten (außer Steuerpin (Knopf))
    if((i != 4)&&(j != 6)) jojoPORTsinglePin (i,j,0);
    delayms(300); // entprellen ?
    j = j+1;
    if(j>7)
      {
      j = 0;
      i = i+1;
      if(i>4) i = 1;
      }
    //nächsten Pin anschalten (außer Steuerpin)
    if((i != 4)&&(j != 6)) jojoPORTsinglePin (i,j,1);
  }
}
return 0;
}

////////////////////////////////////////////////////////////////////////
// wichtigste Funktionen:

void jojoDDRwholePort(int Port, int i)
// i zB 0xFF
//Port: 1 = A, 2 = B, 3 = C, 4 = D, 5 = E, 6 = F, 7 = G
{
  switch (Port)
  {
  case 1:
    DDRA = i;
    break;
  case 2:
    DDRB = i;
    break;
  case 3:
    DDRC = i;
    break;
  case 4:
    DDRD = i;
    break;
  }
}

void jojoPORTsinglePin (int Port, int i,int onofftoggle)
//Port: 1 = A, 2 = B, 3 = C, 4 = D, 5 = E, 6 = F, 7 = G
//i zwischen 0 und 7
// onofftoggle: 1 = an, 0 = aus, 2 = toggle
{
  switch (Port)
  {
  case 1:
    if (onofftoggle == 1) PORTA |=(1<<i);
    if (onofftoggle == 0) PORTA &=~(1<<i);
    if (onofftoggle == 2) PORTA ^= (1<<i);
    break;
  case 2:
    if (onofftoggle == 1) PORTB |=(1<<i);
    if (onofftoggle == 0) PORTB &=~(1<<i);
    if (onofftoggle == 2) PORTB ^= (1<<i);
    break;
  case 3:
    if (onofftoggle == 1) PORTC |=(1<<i);
    if (onofftoggle == 0) PORTC &=~(1<<i);
    if (onofftoggle == 2) PORTC ^= (1<<i);
    break;
  case 4:
    if (onofftoggle == 1) PORTD |=(1<<i);
    if (onofftoggle == 0) PORTD &=~(1<<i);
    if (onofftoggle == 2) PORTD ^= (1<<i);
    break;
  }
}

///////////////////////////////////////////////////////////////////////

Wäre super, wenn Ihr da mal draufsehen könntet!

Besten Dank!

Jo

von Mensch_Z (Gast)


Lesenswert?

kaufe zuerst ein NT fuer 1.50 euro

von (prx) A. K. (prx)


Lesenswert?

PC2..5 ist klar: JTAG sitzt da drauf und ist ab Werk eingeschaltet.

von Jonas M. (jonen)


Lesenswert?

das willst du:
if((i != 4)||(j != 6)) jojoPORTsinglePin(i,j,1);

von (prx) A. K. (prx)


Lesenswert?

Oder übersichtlicher:
  if (!(i == 4 && j == 6)) jojoPORTsinglePin(i,j,1);

von (prx) A. K. (prx)


Lesenswert?

Apropos Stromversorgung: Warum verwendest du nicht den Strom vom STK500? 
Der kann eine Zielschaltung ganz offiziell über den ISP-Stecker mit 
Strom versorgen. Bis zu 500mA oder so.

von JoBeginner (Gast)


Lesenswert?

Hallo,

Vielen herzlichen Dank schon mal für die guten Tips.
Vor allem das mit dem JTAG dürfte wohl das Nichtfunktionieren der Pins 
auf PORTC hervorrufen (habe ich das jetzt richtig verstanden, dass, 
sobald ich in den Fuses JTAG enable, diese Pins nicht mehr für die 
Anwendung zu verwenden sind?).

Hat vielleicht noch jemand eine Idee, warum der gesamte PORTD lahmgelegt 
ist? Immerhin funktionier ja der UART. Irgendwas im Programm vielleicht?

Besten Dank!

Jo

von (prx) A. K. (prx)


Lesenswert?

JoBeginner wrote:

> Hat vielleicht noch jemand eine Idee, warum der gesamte PORTD lahmgelegt
> ist?

Weil du in den schon erwähnten missglückten Programmzeilen die 
Verwendung vom kompletten Port D und von sämtlichen Bit 6 gezielt 
ausschliesst.

Wieviele Ideen hättest du denn gern? Die richtige stand schob oben, aber 
wenn du brav drum bittest liefere ich gerne noch ein paar falsche. ;-)

von (prx) A. K. (prx)


Lesenswert?

JoBeginner wrote:

> sobald ich in den Fuses JTAG enable, diese Pins nicht mehr für die
> Anwendung zu verwenden sind?).

Korrekt.

von JoBeginner (Gast)


Lesenswert?

Hi A.K.,

Danke für Deine vielen Beiträge.

Das probiere ich gleich nochmal aus.

Melde mich gleich nochmal!

Gruß
Jo

von JoBeginner (Gast)


Lesenswert?

Hurra,

Das Pintestprogramm läuft jetzt einwandfrei!

Vielen herzlichen Dank an alle Helfer!

Nun noch eine letzte Frage:
Ich hatte das JTAG die ganze Zeit über enabled.
Gerade habe ich (mal wieder ohne Erfolg) versucht, an PORTA und PORTB 
ein LCD zum laufen zu bringen. Kann das eingeschaltete JTAG darauf auch 
eine Auswirkung haben?

Schönen Sonntag noch!

Gruß
Jo

von Gast (Gast)


Lesenswert?

Dein Programm ist viel zu kompliziert. Ein Testprogramm sollte (im 
eigenen Interesse) immer einfach sein, damit man möglichst sicher sein 
kann, dass es korrekt arbeitet. Wenn man sich im Fehlerfall fragen muss, 
obs vielleicht am Testprogramm liegt, dann ist das Nonsens.

Du könntest z. B. nur eine 8-Bit-Variable hochzählen und sie auf alle 
Ports schreiben. Nach jedem Inkrementieren noch eine passende 
Verzögerungsschleife, damit es fürs Auge genügend langsam geht. Dann 
prüfen, ob alle LEDs an allen Ports blinken. Alles in allem vielleicht 
15 Zeilen Code, die ihren Zweck erfüllen.

von (prx) A. K. (prx)


Lesenswert?

JoBeginner wrote:

> ein LCD zum laufen zu bringen. Kann das eingeschaltete JTAG darauf auch
> eine Auswirkung haben?

Nein.

Bei A vergessen manche allerdings AVCC anzuschliessen.

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.