Forum: Mikrocontroller und Digitale Elektronik AVR Attiny 13A: defekt, verfust oder "sleep forever"?


von Np R. (samweis)


Lesenswert?

Hallo,

zunächst einmal vielen Dank an alle, die mir bisher unbewusst geholfen 
haben - denn ich bin schon eine Weile "passiver Nutzer" dieses Forums 
und des Wikis. ;-)


Meine aktive Teilnahme beginnt leider gleich mit einer Frage statt mit 
einer Antwort:

Mein Attiny13A muckst sich nicht mehr. Warum?

Das Problem in Kurzform:
Programmer: USB AVR Lab mit AVRISPMkII Firmware

Fuses:
CKDIV8 geändert von 0 auf 1
SUT[1:0] geändert von 01 auf 10
CKSEL[] geändert von 10 auf 01

Code (Ausschnitt):
1
ISR(PCINT0_vect)
2
{
3
  return; // nur benutzt, um sleep-mode zu beenden
4
}
5
.....
6
int main()
7
{
8
io_init();
9
while(1)
10
  {
11
  switch(modus)
12
    {
13
    case POWER_OFF:
14
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);
15
      sleep_enable();
16
                  PCMSK |= (1<<TASTER_IN); /*Taster für PCINT0 freischalten*/
17
      sei();
18
      sleep_cpu();
19
      cli();
20
                        PCMSK |= (1<<TASTER_IN); /*Taster für PCINT0 freischalten*/      
21
      sleep_disable();
22
      start_countdown();
23
      break;
24
.....

Beim erneuten Programmier-Versuch meldet AVRdude:
1
/usr/bin/avrdude -C /etc/avrdude.conf -p t13 -P usb -c avrispmkII -F -U hfuse:r:/tmp/hfuse7308438643436458320.hex:r -U lfuse:r:/tmp/lfuse8891256296707036853.hex:r 
2
3
avrdude: stk500v2_command(): command failed
4
avrdude: stk500v2_command(): command failed
5
avrdude: stk500v2_program_enable(): cannot get connection status
6
avrdude: initialization failed, rc=-1
7
avrdude: AVR device initialized and ready to accept instructions
8
avrdude: Device signature = 0x000000
9
avrdude: Yikes!  Invalid device signature.
10
avrdude: Expected signature for ATtiny13 is 1E 90 07


Wie man sieht, fehlt dem Programm oben  das
1
      GIMSK |= (1<<PCIE); /* PCINT0 Interrupt aktivieren*/
d.h. er geht in PWR_DOWN und das war's.

Aber eigentlich müsste er doch vom Programmer wieder geweckt werden?
Auch bei den Fuses bin ich mir keiner Schuld bewusst. Deshalb habe ich 
es auch noch nicht mit einem externen Takt an CLKI versucht (naja, 
deshalb, und weil ich keinen habe ;-) )

Gestern hatte ich das Problem schon einmal und habe ihn dann wie hier 
beschrieben [AVR_Fuses] mit einem 100k Widerstand zwischen Reset und GND 
wiederbeleben können. Das war auf meinem Exp-Board, über das neben 5V 
auch noch 13,6V Versorgungsspannung läuft, etwas fummelig, mit dem 
Widerstand in der Hand am IC-Sockel... aber es funktionierte!
Neu programmiert - dabei vor lauter Euphorie das GIMSK Register 
vergessen. Und heute geht nix mehr.

Ich hab's mit dem Widerstand probiert, mit 100k, 27k. Auf dem 
Breadboard, damit's nicht so fummelig ist und weg von den 13V.
Mit AVRdude -B 10.
-B 20, -B 50. -B 0.1, - was weiß ich.


Was nun? Habe ich ihn geschrottet? OK, dann kann ich die 1,10 (oder 
0,60) abschreiben. Tough luck.
Oder habe ich einen systematischen Denkfehler gemacht und der nächste 
und übernächste geht genauso ins Nirwana?

Viele Grüße und vielen Dank für Eure Tipps

Samweis

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich kann dich insofern beruhigen, als das das Programm während des 
Programmierens keine Rolle spielt, der Tiny wird die ganze Zeit im Reset 
gehalten, kann also gar nicht losrennen. Allerdings kenne ich deinen 
Programmierer nicht, ich benutze den AVR ISPMkII aus AS4 heraus. Dein 
Fuses File im Avrdude Kommando sieht m.E. ein bisschen merkwürdig aus, 
aber das kann normal sein(?). Was steht in hfuseXXXX.hex und 
lfuseXXXX.hex drin?

von Np R. (samweis)


Lesenswert?

Hallo Matthias,

danke für die schnelle Reaktion.
Ich benutze AVR-burn-o-mat.
Die Ziel-Dateien für die Fuse-Daten sind temporäre Dateien, die mit 
zufälligen Namen in /tmp erzeugt werden. Deshalb sehen die so merkwürdig 
aus.

Die Dateien sind leer (0 byte).
Offenbar findet gar keine Kommunikation statt.
"cannot get connection status
avrdude: initialization failed, rc=-1"

Dass er danach trotzdem "avrdude: AVR device initialized and ready to 
accept instructions" meldet, liegt an dem -F Schalter.

Ich hatte das hier im Wiki AVR Fuses, Abschnitt 4.2 zum Tiny13, so 
verstanden, dass das Programm einen Einfluss haben kann.

Ansonsten bin ich ratlos. An den anderen Fuses war ich nicht. Am 
Register CLKPR auch nicht. Lediglich im TCCR0B habe ich den Prescaler 
eingestellt.

Kann man durch Spannungs-Spikes am Reset Register überschreiben?

Viele Grüße

Samweis

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schau doch erstmal, ob der Programmierer selbst als USB Device auftaucht 
und die Treiber geladen sind.
Unter Linux : lsusb -a
Unter Windows : Gerätemanager und nach Jungo suchen.
Der -Force Schalter sollte ja eigentlich nicht nötig sein. Für mich 
siehts so aus, als findet avrdude gar nicht erst den Programmer.

no public real name schrieb:
> Kann man durch Spannungs-Spikes am Reset Register überschreiben?

Man kann ihn mit den o.a. 12-13 Volt zu den lieben Engelein schicken, 
jo. Aber das Reset Register? Wie jetzt? Eigentlich nicht, wenn du die 12 
Volt vom MC ferngehalten hast. Wie gesagt, während des 
Programmiervorganges ist der MC im Reset und alle Register sind wurscht. 
Nur die Fuses sind aktiv.

von Np R. (samweis)


Lesenswert?

Der Programmer wird gefunden. (Sonst quietscht AVRdude auch gleich 
"avrdude: usbdev_open(): did not find any USB device "usb")

Ich habe auch zwei unterschiedliche Kabel versucht.
Inzwischen ist mir eingefallen, dass ich noch einen Attiny24A habe - den 
hat AVRdude sofort problemlos ausgelesen. Mit demselben Programmer und 
demselben Kabel.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

np rn schrieb:
> den
> hat AVRdude sofort problemlos ausgelesen. Mit demselben Programmer und
> demselben Kabel.

Tja, dann wirds wohl doch eine CLK Option sein. Falls du aus Versehen 
auf 128kHz Takt gestellt hast und dann noch CLKDIV8 gesetzt hast, kann 
es sein, das du -b auf Schnarchnasen Tempo setzen musst. Allerdings hast 
du damit schon rumprobiert? Dann ist der Tiny wohl doch in den ewigen 
Jagdgründen, oder du musst dir mal einen TTL-Oszillator (1-8Mhz) 
beschaffen und an CLKi anschliessen.

von Np R. (samweis)


Lesenswert?

CLKDIV8 war ab Werk gesetzt. Ich habe sie in "1" geändert, damit er 
etwas schneller läuft.
M.E. müsste er jetzt mit 4,8MHz laufen. Fuses siehe oben.

Ich habe ihn gerade einmal durchgemessen:
PB5 (Reset, interner Pull-up): 4,33V
PB3 (programmiert als Ausgang, high): 4,7V
PB2 (programmiert als Eingang mit internem Pull-up): 4,0V
alle anderen programmiert als Ausgang, low: 0V
Stromverbrauch: niente. Irgendwo <50µA

Es sieht also so aus, als ob er doch noch etwas macht, oder?. 
Initialisierung und dann PWR_DOWN...

Matthias Sch. schrieb:
> auf 128kHz Takt gestellt hast und dann noch CLKDIV8 gesetzt hast, kann
> es sein, das du -b auf Schnarchnasen Tempo setzen musst.
-b pder -B?
Welche Werte schlägst Du vor?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

np rn schrieb:
> -b pder -B?
> Welche Werte schlägst Du vor?

Wie oben schon erwähnt, kann ich dir zu avrdude nicht helfen, eines 
dieser Kommandos ändert die Bitrate des SPI. Sag mal, kann es evtl. 
sein, das du aus Versehen RSTDISBL gesetzt hast und PB5 damit zum I/O 
gemacht hast? RSTDISBL kannst du nur per HV Programmierer rückgängig 
machen.

np rn schrieb:
> CLKDIV8 war ab Werk gesetzt.

Jups, das ist immer so.

np rn schrieb:
> Es sieht also so aus, als ob er doch noch etwas macht, oder?.

Naja, er ist in einem Sleep Modus ;-)

von Np R. (samweis)


Lesenswert?

Matthias Sch. schrieb:
> eines dieser Kommandos ändert die Bitrate des SPI.
Ich habe gerade mal mit
1
avrdude -c avrispmkii -p t13 -P usb -t -F
den Terminal-Modus von AVRDude aufgerufen. Dort knn man per "SCK" die 
SCK periode, also 1/f in Stufen von 0.25, 0,5, 1, 2, 4 bis 8 ändern, 
also 125kHz bis 4MHz.
Hat alles nichts gebracht.

> Sag mal, kann es evtl.
> sein, das du aus Versehen RSTDISBL gesetzt hast und PB5 damit zum I/O
> gemacht hast? RSTDISBL kannst du nur per HV Programmierer rückgängig
> machen.

Eigentlich nicht. Die RSTDISBL ist bei AVR8-burn-o-mat rot unterlegt. 
Außerdem so weit weg von allem anderen, was ich an den Fuses gemacht 
habe, dass man auch nicht "aus Versehen daneben klicken" kann.
Also - eigentlich nicht.
Es sei denn, mann kann durch Spannungs-Spikes das Ding umprogrammieren. 
Irgendwo hatte ich mal so etwas gelesen....
Und wenn man mit 'nem Widerstand in der Hand zwischen Reset und GND 
herumfuchtelt, dann könnte es wohl mal Spikes geben. Einen, oder zwei 
;-)

Ich habe gerade im ATtiny24A Datenblatt gefunden, dass der einen 
CKOUT-Ausgang hat. Morgen werde ich den mal am CLKI des ATtiny13A 
probieren.

Sonst werde ich ihn wohl an die Seite legen, bis ich mir mal einen 
HV-Programmer gebaut habe.
Der Kleine ärgert mich - ich krieg das noch raus, was er hat... ;-)

von Np R. (samweis)


Lesenswert?

Update:
Auch das CKOUT-Signal vom ATtiny 24A hat nichts gebracht.
Irgendwann werde ich mir wohl mal so etwas hier
http://www.simpleavr.com/avr/hvsp-fuse-resetter zusammenstecken.
Rein schon aus Neugierde...

Aber Danke für Deine Tipps!

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.