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
kaufe zuerst ein NT fuer 1.50 euro
das willst du: if((i != 4)||(j != 6)) jojoPORTsinglePin(i,j,1);
Oder übersichtlicher: if (!(i == 4 && j == 6)) jojoPORTsinglePin(i,j,1);
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. ;-)
JoBeginner wrote: > sobald ich in den Fuses JTAG enable, diese Pins nicht mehr für die > Anwendung zu verwenden sind?). Korrekt.
Hi A.K., Danke für Deine vielen Beiträge. Das probiere ich gleich nochmal aus. Melde mich gleich nochmal! Gruß Jo
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.