Forum: Mikrocontroller und Digitale Elektronik Erkennen, ob ein unbeschriebener AVR läuft.


von Dussel (Gast)


Lesenswert?

Moin,

gerade bin ich bei meinen Eltern und habe eine Platine mit einem 
unbeschriebenen ATmega8 zusammengelötet. Leider habe ich den 
Programmieradapter vergessen. Der liegt in meiner Wohnung, wo ich aber 
kein Lötzeug für eventuelle Änderungen habe.
Gibt es irgendeine Möglichkeit zu sehen, ob ein neuer (unbeschriebener) 
AVR läuft?

An den Pins kann man es wohl nicht erkennen. Die sind im 
Auslieferungszustand hochohmig, wenn der Controller nicht läuft, 
wahrscheinlich auch.
Für die Taktanschlüsse müsste man wohl die Fuses entsprechend 
programmiert haben.
Wie sieht es mit der Stromaufnahme aus? Kann man daran erkennen, ob der 
Controller läuft oder sich vielleicht im Dauerreset befindet?

Gibt es andere Möglichkeiten?

von Johannes (Gast)


Lesenswert?

Was soll denn laufen, wenn der nicht geflasht ist?

von Dussel (Gast)


Lesenswert?

Ob er grundsätzlich lauffähig ist oder ob es irgendwo ein Problem gibt 
(kein Takt, Dauerreset, falsche Versorgung aus irgendeinem Grund).

von Dussel (Gast)


Lesenswert?

Wenn man ihn 'so' einschaltet, sollte er ja trotzdem etwas tun. Entweder 
die FF im Speicher überspringen oder ständig nach einer Anweisung 
resetten, je nachdem, was er eben bei dem Opcode FF macht.

von Peter (Gast)


Lesenswert?

Dussel schrieb:
> Wenn man ihn 'so' einschaltet, sollte er ja trotzdem etwas tun. Entweder
> die FF im Speicher überspringen oder ständig nach einer Anweisung
> resetten, je nachdem, was er eben bei dem Opcode FF macht.

Und wie erkennst du das von außen?

Du kannst nur die Stromaufnahme an Vcc messen und mit den Werten im 
Datenblatt abgleichen. Hat aber weiter nicht besonders viel 
Aussagekraft.

von bj (Gast)


Lesenswert?

...also von hier aus kann ich ganz deutlich sehen, das er läuft.

Man kann auch mal vorsichtig den Finger drauf legen.
Man müsste ja den Oszillator spüren, oder ??

von Brummbär (Gast)


Lesenswert?

bj schrieb:
> Man kann auch mal vorsichtig den Finger drauf legen.
> Man müsste ja den Oszillator spüren, oder ??

Falls er falsch angeschlossen ist, kann man das ebenfalls mit der 
Fingermethode ermitteln. (Das war kein Scherz)

von Thomas L. (ics1702)


Lesenswert?

falls dein PC noch eine parallele Schnittstelle hat, könntest du den AVR 
auch ohne Adapter beschreiben.

http://thomaspfeifer.net/einfaches_atmel_programmierkabel.htm

von Stefan F. (Gast)


Lesenswert?

Reset und Spannungsversorgung kannst du mit einem Multimeter prüfen.

Ein jungfräulicher AVR wird intern getaktet, da kannst du von außen 
weder etwas messen noch etwas falsch machen.

von MaWin (Gast)


Lesenswert?

Wenn der Reset Pin von außen high ist, dann läuft er.

von Dussel (Gast)


Lesenswert?

Peter schrieb:
> Dussel schrieb:
>> Wenn man ihn 'so' einschaltet, sollte er ja trotzdem etwas tun. Entweder
>> die FF im Speicher überspringen oder ständig nach einer Anweisung
>> resetten, je nachdem, was er eben bei dem Opcode FF macht.
>
> Und wie erkennst du das von außen?
Genau das ist ja die Frage.

Thomas L. schrieb:
> falls dein PC noch eine parallele Schnittstelle hat, könntest du den AVR
> auch ohne Adapter beschreiben.
>
> http://thomaspfeifer.net/einfaches_atmel_programmierkabel.htm
Daran habe ich auch gedacht, habe ich aber nicht.

MaWin schrieb:
> Wenn der Reset Pin von außen high ist, dann läuft er.
Auch wenn der Controller einen Fertigungsfehler hat? Auch wenn er beim 
Löten zu heiß wurde? Auch wenn die Pins nicht richtig angeschlossen sind 
(gut, das kann man mit einem Multimeter prüfen). Auch wenn es Störungen 
gibt, die ein sauberes Anschwingen nicht erlauben?

Stefan U. schrieb:
> Ein jungfräulicher AVR wird intern getaktet, da kannst du von außen
> weder etwas messen noch etwas falsch machen.
Das habe ich mir gedacht. Aber ich wollte doch mal fragen, ob es nicht 
irgendwelche Tricks gibt.
Dann bleibt mir wohl nichts anderes übrig, als es zu riskieren.

Danke für die Antworten.

von Jacko (Gast)


Lesenswert?

Ja - und selbst, wenn du läuft/läuft nicht herausgefunden
hättest. Was machst du dann ohne Prog-Adapter?

Programmieren geht doch sowieso nicht. Auf dem Stand bist du
(wieder zu Hause) in wenigen Minuten genau so.

- Vielleicht unterhältst du dich mal mit den Eltern?
- Unternimmst was mit den Jugend-Bekanntschaften?
- ???

von michael_ (Gast)


Lesenswert?

Dussel schrieb:
> Dann bleibt mir wohl nichts anderes übrig, als es zu riskieren.

Riskiere es!
Das ganze Leben besteht aus Risiken!
Milliarden solcher Prozessoren werden so bestückt und hinterher 
programmiert.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Irgendwie verstehe ich das grundlegende Problem nicht.
Wobei mir auch nicht in den Sinn käme, extra zu meinen Eltern zu fahren, 
um dort einen µC zu verlöten ;)
Nun denn, das Ding ist verlötet - mit Spannung dran KÖNNTE der µC 
Lebenszeichen von sich geben, unprogrammiert aber wohl eher nicht.

Zu Deinen Mutmaßungen, was wohl ist, wenn 'sonst was' zutrifft - Du hast 
vergessen zu fragen, ob der µC noch läuft, wenn man - aus Versehen - ein 
oder mehrere Beinchen abflext - nein, dann ist Er hin (mit Bordmitteln 
zumindest).

Also: Wie meinen?

MfG

von M. K. (sylaina)


Lesenswert?

Dussel schrieb:
> Gibt es irgendeine Möglichkeit zu sehen, ob ein neuer (unbeschriebener)
> AVR läuft?

jaein, gibt es nicht. In Werksauslieferung sind alle IOs als Eingänge 
beschaltet, das (äquivalente) Programm, dass läuft lautet
1
int main(void){
2
  return 0;
3
}

der Atmega tut also nichts. Das einzige, was man "sehen" kann ist, dass 
der Atmega Strom aufnimmt. Aber das als Indiz zu betrachten, dass er 
läuft halt ich für zweifelhaft.

von Dussel (Gast)


Lesenswert?

michael_ schrieb:
> Dussel schrieb:
>> Dann bleibt mir wohl nichts anderes übrig, als es zu riskieren.
>
> Riskiere es!
> Das ganze Leben besteht aus Risiken!
> Milliarden solcher Prozessoren werden so bestückt und hinterher
> programmiert.
So hoch ist das Risiko natürlich jetzt nicht. :D
Es wäre nur schön gewesen, Fehler vorher ausschließen zu können.

Patrick J. schrieb:
> Irgendwie verstehe ich das grundlegende Problem nicht.
> Wobei mir auch nicht in den Sinn käme, extra zu meinen Eltern zu fahren,
> um dort einen µC zu verlöten ;)
Mein ganzes Lötzeug steh bei meinen Eltern und das will ich auch nicht 
in meine Wohnung mitnehmen (u.A. wegen Platz und Gewicht). Bei meinen 
Eltern bin ich gerade zu Besuch und habe nebenbei was gelötet. Das 
Programmiergerät liegt aber in meiner Wohnung. Das habe ich da 
vergessen.

Patrick J. schrieb:
> Also: Wie meinen?
Es gibt ein paar nicht offensichtliche Fehlerquellen und ich wollte 
sichergehen, dass keine davon vorliegt.

M. K. schrieb:
> Dussel schrieb:
>> Gibt es irgendeine Möglichkeit zu sehen, ob ein neuer (unbeschriebener)
>> AVR läuft?
>
> jaein, gibt es nicht. In Werksauslieferung sind alle IOs als Eingänge
> beschaltet, das (äquivalente) Programm, dass läuft lautet
> int main(void){
>   return 0;
> }
> der Atmega tut also nichts.
Aber der Takt läuft ja schon und der Prozessor arbeitet die Befehle ab, 
auch wenn es eben nur FF ist.

M. K. schrieb:
> Das einzige, was man "sehen" kann ist, dass
> der Atmega Strom aufnimmt. Aber das als Indiz zu betrachten, dass er
> läuft halt ich für zweifelhaft.
Das denke ich auch. Deshalb fällt das auch raus.

Tja, bald werde ich es wissen.

von Brummbär (Gast)


Lesenswert?

Dussel schrieb:
> Aber der Takt läuft ja schon und der Prozessor arbeitet die Befehle ab,
> auch wenn es eben nur FF ist.

Das schon. Jedoch wirst Du keinen Unterschied bemerken, wenn er es nicht 
tut.

von M. K. (sylaina)


Lesenswert?

Dussel schrieb:
> Aber der Takt läuft ja schon und der Prozessor arbeitet die Befehle ab,
> auch wenn es eben nur FF ist.

Welche Befehle? Ein unbeschriebener AVR hat keine Befehle, die er 
abarbeiten könnte. Der ist direkt fertig mit dem Programm, was im 
Allgemeinen untypisch ist da Programme in der Regel immer Endlos Loops 
sind.

von MaWin (Gast)


Lesenswert?

M. K. schrieb:
> er ist direkt fertig mit dem Programm,

Und was macht er dann?

von M. K. (sylaina)


Lesenswert?

MaWin schrieb:
> M. K. schrieb:
>> er ist direkt fertig mit dem Programm,
>
> Und was macht er dann?

Nix mehr außer Strom verbrauchen. Der Befehlscounter steht am Ende und 
wartet auf einen Reset. Da die automatischen Resets ja auch nicht aktiv 
sind bei einem unbeschriebenen AVR wartet er auf den St. Nimmerleinstag 
sofern nicht die Resetleitung auf 0 gezogen wird oder man was anderes 
Sinnvolles mit dem AVR macht.

von Thomas L. (ics1702)


Lesenswert?

falls du einen Arduino hast, kannst du mit dem einen AVR beschreiben

https://www.arduino.cc/en/Tutorial/ArduinoISP

von Stefan F. (Gast)


Lesenswert?

> Der Befehlscounter steht am Ende und wartet auf einen Reset.

Ich dachte er läuft dann über.

Was ist 0xFF eigentlich für eine Operation? Ich habe sie im "Atmel AVR 
8bit Instruction Set" PDF nicht gefunden.

von lalelu (Gast)


Lesenswert?

0xFFFF gibt es nicht als OpCode, gab es aber wohl 1997 noch. Und laut 
[1] wurde zumindest bei den AVRs in 2004 noch SBRS r31,7 ausgeführt.

Ob das immernoch so ist, weiß ich nicht. Aber da der Controller dabei 
sowieso nichts erkennbares macht, hilft es dem TO auch nicht.

[1] http://www.avrfreaks.net/comment/83257#comment-83257

von Jobst M. (jobstens-de)


Lesenswert?

M. K. schrieb:
> Welche Befehle? Ein unbeschriebener AVR hat keine Befehle, die er
> abarbeiten könnte. Der ist direkt fertig mit dem Programm, was im

!?
Er nimmt sich ein Wort und arbeitet es ab. Ein Ende sieht der nicht.
Es gibt ja keine Endekennung.


Stefan U. schrieb:
> Ich dachte er läuft dann über.

Tut er auch.


> Was ist 0xFF eigentlich für eine Operation? Ich habe sie im "Atmel AVR
> 8bit Instruction Set" PDF nicht gefunden.

0xFFFF (16-Bit Befehle)
Aber tatsächlich scheint es keinen zu geben. Der AVR hält aber auch 
nicht an, wenn er darauf trifft.

lalelu schrieb:
> Und laut
> [1] wurde zumindest bei den AVRs in 2004 noch SBRS r31,7 ausgeführt.

Das wäre dann ein Decoderfehler.
SBRS R31, 7 ist eigentlich 0xFFF7
Kann natürlich sein, dass man sich die Überprüfung dieses Bits gespart 
hat.


Mögliche Lösung für den TO:

Spannung anlegen.
/RESET auf GND ziehen.
Mittels MOSI und SCK die drei Bytes $AC $53 und $00 in den Controller 
schieben. (Siehe 'Serial Programming Algorithm' im Datenblatt)
Während das dritte Byte in den Controller geschoben wird, bekommt man an 
MISO $53 zurück.

Das kann man z.B. mit entprellten Tastern und einer LED (mit Widerstand) 
machen.
Dann weiß man, dass der Controller läuft und Takt hat.


Gruß
Jobst

von c-hater (Gast)


Lesenswert?

Brummbär schrieb:

> Dussel schrieb:
>> Aber der Takt läuft ja schon und der Prozessor arbeitet die Befehle ab,
>> auch wenn es eben nur FF ist.
>
> Das schon. Jedoch wirst Du keinen Unterschied bemerken, wenn er es nicht
> tut.

Doch, natürlich. Wenn er aus irgendeinem Grunde nicht läuft (z.B. weil 
Reset durch einen Zinnpopel auf GND liegt), wird die Stromaufnahme sehr 
viel geringer sein, weil dann nämlich die MCU "steht". Der Sachverhalt 
entspricht in etwa dem "IDLE"-Stromsparmodus.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

"Mein ganzes Lötzeug steh bei meinen Eltern und das will ich auch nicht 
in meine Wohnung mitnehmen (u.A. wegen Platz und Gewicht). Bei meinen 
Eltern bin ich gerade zu Besuch und habe nebenbei was gelötet. Das 
Programmiergerät liegt aber in meiner Wohnung. Das habe ich da 
vergessen."

Dagegen hilft nur, Werkstatt und Lebensschwerpunkt geordnet unter einen 
Hut zu bringen.

MfG

von lalelu (Gast)


Lesenswert?

Jobst M. schrieb:
> lalelu schrieb:
>> Und laut
>> [1] wurde zumindest bei den AVRs in 2004 noch SBRS r31,7 ausgeführt.
>
> Das wäre dann ein Decoderfehler.
> SBRS R31, 7 ist eigentlich 0xFFF7
> Kann natürlich sein, dass man sich die Überprüfung dieses Bits gespart
> hat.

In dem verlinkten Kommentar wurde geschrieben, dass der Opcode früher 
(1997) nicht als 1111 111r rrrr 0bbb, sondern 1111 111r rrrr _X_bbb 
spezifiziert war. Da für den Opcode 0xFFFF mWn kein Verhalten 
spezifiziert ist, würde ich das auch nicht als Fehler bezeichnen.

Zusatzfakt: Beim Z80 wurde auch bei der Dekodierung gespart. Die 
unspezifizierten Opcodes haben nützliche, neue Funktionen gebracht, die 
dann untersucht und dokumentiert wurden: 
http://www.z80.info/z80undoc3.txt

Und noch was zum Thema:
Falls die Schaltung noch mehr als den µC enthält, wird der Strom 
eventuell schwierig zu messen sein. Aber wenn die Stromaufnahme nicht 
übermäßig hoch (Kurzschluss/Verpolung) ist und alle Pins sauber gelötet 
sind, sollte der Controller auch funktionieren. Die ICs werden ja nach 
der Fertigung überprüft und die größten Risiken danach sind mMn Hitze 
beim Löten und ESD. Beides lässt sich ausschließen, wenn man ordentlich 
arbeitet und die ICs aus einer "normalen" Quelle hat.

von MaWin (Gast)


Lesenswert?

M. K. schrieb:
> Der Befehlscounter steht am Ende und wartet auf einen Reset.

Nein. Er läuft immer weiter und arbeitet das unbeschriebene Flash ab.

von M. K. (sylaina)


Lesenswert?

MaWin schrieb:
> M. K. schrieb:
>> Der Befehlscounter steht am Ende und wartet auf einen Reset.
>
> Nein. Er läuft immer weiter und arbeitet das unbeschriebene Flash ab.

Udn was macht er wenn er am Ende des Flashs ist? Bei mir hat noch nie 
ein Programm von vorne begonnen wenn ich keine Endlosschleife drum 
gebastelt habe.

von Stefan F. (Gast)


Lesenswert?

> Bei mir hat noch nie
> ein Programm von vorne begonnen wenn ich keine Endlosschleife
> drum gebastelt habe.

Vermutlich, weil dein Compiler genau wie meiner in solchen Fällen 
automatisch eine Endlosschleife an das Programm anhängt. Die main() 
Funktion wird niemals verlassen.

Beispiel für eine leere main() Funktion beim ATtiny13, cmpiliert mit 
avr-gcc 5.3.0:
1
Test.elf:     file format elf32-avr
2
3
Sections:
4
Idx Name          Size      VMA       LMA       File off  Algn
5
  0 .text         0000002c  00000000  00000000  00000054  2**1
6
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
7
  1 .data         00000000  00800060  00800060  00000080  2**0
8
                  CONTENTS, ALLOC, LOAD, DATA
9
  2 .stab         00000078  00000000  00000000  00000080  2**2
10
                  CONTENTS, READONLY, DEBUGGING
11
  3 .stabstr      0000005b  00000000  00000000  000000f8  2**0
12
                  CONTENTS, READONLY, DEBUGGING
13
  4 .comment      00000011  00000000  00000000  00000153  2**0
14
                  CONTENTS, READONLY
15
  5 .note.gnu.avr.deviceinfo 0000003c  00000000  00000000  00000164  2**2
16
                  CONTENTS, READONLY
17
  6 .debug_info   000002b8  00000000  00000000  000001a0  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  7 .debug_abbrev 00000294  00000000  00000000  00000458  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  8 .debug_line   0000001d  00000000  00000000  000006ec  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
  9 .debug_str    000000f6  00000000  00000000  00000709  2**0
24
                  CONTENTS, READONLY, DEBUGGING
25
26
Disassembly of section .text:
27
28
00000000 <__vectors>:
29
   0:    09 c0           rjmp    .+18         ; 0x14 <__ctors_end>
30
   2:    0e c0           rjmp    .+28         ; 0x20 <__bad_interrupt>
31
   4:    0d c0           rjmp    .+26         ; 0x20 <__bad_interrupt>
32
   6:    0c c0           rjmp    .+24         ; 0x20 <__bad_interrupt>
33
   8:    0b c0           rjmp    .+22         ; 0x20 <__bad_interrupt>
34
   a:    0a c0           rjmp    .+20         ; 0x20 <__bad_interrupt>
35
   c:    09 c0           rjmp    .+18         ; 0x20 <__bad_interrupt>
36
   e:    08 c0           rjmp    .+16         ; 0x20 <__bad_interrupt>
37
  10:    07 c0           rjmp    .+14         ; 0x20 <__bad_interrupt>
38
  12:    06 c0           rjmp    .+12         ; 0x20 <__bad_interrupt>
39
40
00000014 <__ctors_end>:
41
  14:    11 24           eor    r1, r1
42
  16:    1f be           out    0x3f, r1      ; 63
43
  18:    cf e9           ldi    r28, 0x9F     ; 159
44
  1a:    cd bf           out    0x3d, r28     ; 61
45
  1c:    02 d0           rcall    .+4         ; 0x22 <main>
46
  1e:    04 c0           rjmp    .+8          ; 0x28 <_exit>
47
48
00000020 <__bad_interrupt>:
49
  20:    ef cf           rjmp    .-34         ; 0x0 <__vectors>
50
51
00000022 <main>:
52
  22:    80 e0           ldi    r24, 0x00     ; 0
53
  24:    90 e0           ldi    r25, 0x00     ; 0
54
  26:    08 95           ret
55
56
00000028 <_exit>:
57
  28:    f8 94           cli
58
59
0000002a <__stop_program>:
60
  2a:    ff cf           rjmp    .-2          ; 0x2a <__stop_program>

Man beachte die letzte Zeile mit dem rjmp befehl.

von Carl D. (jcw2)


Lesenswert?

Stefan U. schrieb:.
> Vermutlich, weil dein Compiler genau wie meiner in solchen Fällen
> automatisch eine Endlosschleife an das Programm anhängt. Die main()
> Funktion wird niemals verlassen.

Aber sicher doch!
Nur folgt dann gleich der Aufruf von exit(), was bei der AVRlibc 
(mangels Betriebssystem, das übernehmen könnte) eine Endlosschleife (bei 
ausgeschalteten Interrupts) ist.

Edit:
Wie du dankenswerterweise gleich dokumentiert hast ;-)

von Stefan F. (Gast)


Lesenswert?

> Nur folgt dann gleich der Aufruf von exit()

Ja stimmt, hast Recht.

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.