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
> 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.
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
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.
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
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. ;-)
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
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.
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.