ATtiny13 und Konstanten vs. Variablen.

#3872966
Lesenswert?

Moin,

ich habe auf meinem STK600 ein ATtiny13 stecken. Dazu folgendes 
Programm:
1
volatile uint8_t pinmask = 0x55;
2

3
int main(void)
4
{
5
  DDRB = 0xff;
6
  
7
  //while(1 != 0) PORTB = pinmask;
8
  while(1 != 0) PORTB = 0x55;
9
}

Verwende ich die Variable "pinmask" (soll später im Timer geändert 
werden), werden entweder alls LED auf 1 gesetzt oder auf 0 (meistens auf 
1). Verwende ich die Konstante, funktioniert es.

Kann mir mal bitte jemand sagen was da schief läuft?

mfg, mogel
#3873066
Lesenswert?

Ronny G. schrieb:
> Kann mir mal bitte jemand sagen was da schief läuft?

Wahrscheinlich kompilierst du mit der Controllereinstellung für einen 
Atmega. Das Programm kommt zwar auch nicht dort zum Laufen, wo es 
normalerweise bei einem Attiny13 laufen sollte, da es aber kurz ist, 
passt es trotzdem noch rein.
Etwas anderes ist aber der RAM. Bei den Atmegas gibt es den Extended 
I/O-Bereich. Der ist fast dreimal so gross, wie das Daten-RAM des 13er. 
Danach kommt dann der Daten-RAM. Damit käme die Variable ungefähr 4,3mm 
neben dem Gehäuse deines Attiny zu liegen.

mfg.
#3873154
Lesenswert?

Klingt als würde er die globale Variable nicht initialisieren. Das wäre 
ein compiler bug.

Möglicherweise macht der Optimizer auch eine stillschweigend eine 
Registervariable draus, die kann man aber nicht mit einem Initializer 
automatisch initialisieren, vielleicht fällt das dann versehentlich 
unter den Tisch. Die .lss wäre wirklich aufschlussreich.
Gast #3873176
Lesenswert?

Was passiert, sieht man hier. Warum es passiert weiß ich leider nicht 
...
1
volatile uint8_t pinmask = 0x55;
2

3
int main(void)
4
{
5
  DDRB = 0xff;
6
  38:  8f ef         ldi  r24, 0xFF  ; 255
7
  3a:  87 bb         out  0x17, r24  ; 23
8
  
9
  while(1 != 0) PORTB = pinmask;
10
  3c:  80 91 60 00   lds  r24, 0x0060
11
  40:  88 bb         out  0x18, r24  ; 24
12
  42:  fc cf         rjmp  .-8        ; 0x3c <main+0x4>
13

14
00000044 <_exit>:
15
  44:  f8 94         cli
16

17
00000046 <__stop_program>:
18
  46:  ff cf         rjmp  .-2        ; 0x46 <__stop_program>
19

20

21

22
volatile uint8_t pinmask = 0x55;
23

24
int main(void)
25
{
26
  DDRB = 0xff;
27
  38:  8f ef         ldi  r24, 0xFF  ; 255
28
  3a:  87 bb         out  0x17, r24  ; 23
29
  
30
  //while(1 != 0) PORTB = pinmask;
31
  while(1 != 0) PORTB = 0x55;
32
  3c:  85 e5         ldi  r24, 0x55  ; 85
33
  3e:  88 bb         out  0x18, r24  ; 24
34
  40:  fe cf         rjmp  .-4        ; 0x3e <__SP_L__+0x1>
35

36
00000042 <_exit>:
37
  42:  f8 94         cli
38

39
00000044 <__stop_program>:
40
  44:  ff cf         rjmp  .-2        ; 0x44 <__stop_program>
#3873183
Lesenswert?

Dieter Frohnapfel schrieb:
> volatile uint8_t pinmask = 0x55;
>
> int main(void)
> {
>   DDRB = 0xff;
>   38:  8f ef         ldi  r24, 0xFF  ; 255
>   3a:  87 bb         out  0x17, r24  ; 23
>
>   while(1 != 0) PORTB = pinmask;
>   3c:  80 91 60 00   lds  r24, 0x0060
>   40:  88 bb         out  0x18, r24  ; 24
>   42:  fc cf         rjmp  .-8        ; 0x3c <main+0x4>
>
> 00000044 <_exit>:
>   44:  f8 94         cli
>
> 00000046 <__stop_program>:
>   46:  ff cf         rjmp  .-2        ; 0x46 <__stop_program>



Wo ist der Teil der die Variable initialisiert, das volatile uint8_t 
pinmask = 0x55; das suche ich:

sts  0x0060, ...

fehlt, oder ist das irgendwo weiter oben? Poste doch mal die ganze Datei 
und nicht nur einen winzigen Schnipsel.
Gast #3873188
Lesenswert?

O.K., hier komplett ...
1
Attiny13 Test.elf:     file format elf32-avr
2

3
Sections:
4
Idx Name          Size      VMA       LMA       File off  Algn
5
  0 .text         00000048  00000000  00000000  00000074  2**1
6
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
7
  1 .data         00000002  00800060  00000048  000000bc  2**0
8
                  CONTENTS, ALLOC, LOAD, DATA
9
  2 .stab         000006b4  00000000  00000000  000000c0  2**2
10
                  CONTENTS, READONLY, DEBUGGING
11
  3 .stabstr      00000097  00000000  00000000  00000774  2**0
12
                  CONTENTS, READONLY, DEBUGGING
13
  4 .comment      0000002f  00000000  00000000  0000080b  2**0
14
                  CONTENTS, READONLY
15
  5 .debug_aranges 00000020  00000000  00000000  0000083a  2**0
16
                  CONTENTS, READONLY, DEBUGGING
17
  6 .debug_info   0000009e  00000000  00000000  0000085a  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  7 .debug_abbrev 0000006b  00000000  00000000  000008f8  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  8 .debug_line   000000de  00000000  00000000  00000963  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
  9 .debug_frame  00000024  00000000  00000000  00000a44  2**2
24
                  CONTENTS, READONLY, DEBUGGING
25
 10 .debug_str    000000b6  00000000  00000000  00000a68  2**0
26
                  CONTENTS, READONLY, DEBUGGING
27
 11 .debug_ranges 00000010  00000000  00000000  00000b1e  2**0
28
                  CONTENTS, READONLY, DEBUGGING
29

30
Disassembly of section .text:
31

32
00000000 <__vectors>:
33
   0:  09 c0         rjmp  .+18       ; 0x14 <__ctors_end>
34
   2:  19 c0         rjmp  .+50       ; 0x36 <__bad_interrupt>
35
   4:  18 c0         rjmp  .+48       ; 0x36 <__bad_interrupt>
36
   6:  17 c0         rjmp  .+46       ; 0x36 <__bad_interrupt>
37
   8:  16 c0         rjmp  .+44       ; 0x36 <__bad_interrupt>
38
   a:  15 c0         rjmp  .+42       ; 0x36 <__bad_interrupt>
39
   c:  14 c0         rjmp  .+40       ; 0x36 <__bad_interrupt>
40
   e:  13 c0         rjmp  .+38       ; 0x36 <__bad_interrupt>
41
  10:  12 c0         rjmp  .+36       ; 0x36 <__bad_interrupt>
42
  12:  11 c0         rjmp  .+34       ; 0x36 <__bad_interrupt>
43

44
00000014 <__ctors_end>:
45
  14:  11 24         eor  r1, r1
46
  16:  1f be         out  0x3f, r1  ; 63
47
  18:  cf e9         ldi  r28, 0x9F  ; 159
48
  1a:  cd bf         out  0x3d, r28  ; 61
49

50
0000001c <__do_copy_data>:
51
  1c:  10 e0         ldi  r17, 0x00  ; 0
52
  1e:  a0 e6         ldi  r26, 0x60  ; 96
53
  20:  b0 e0         ldi  r27, 0x00  ; 0
54
  22:  e8 e4         ldi  r30, 0x48  ; 72
55
  24:  f0 e0         ldi  r31, 0x00  ; 0
56
  26:  02 c0         rjmp  .+4        ; 0x2c <__do_copy_data+0x10>
57
  28:  05 90         lpm  r0, Z+
58
  2a:  0d 92         st  X+, r0
59
  2c:  a2 36         cpi  r26, 0x62  ; 98
60
  2e:  b1 07         cpc  r27, r17
61
  30:  d9 f7         brne  .-10       ; 0x28 <__do_copy_data+0xc>
62
  32:  02 d0         rcall  .+4        ; 0x38 <main>
63
  34:  07 c0         rjmp  .+14       ; 0x44 <_exit>
64

65
00000036 <__bad_interrupt>:
66
  36:  e4 cf         rjmp  .-56       ; 0x0 <__vectors>
67

68
00000038 <main>:
69

70
volatile uint8_t pinmask = 0x55;
71

72
int main(void)
73
{
74
  DDRB = 0xff;
75
  38:  8f ef         ldi  r24, 0xFF  ; 255
76
  3a:  87 bb         out  0x17, r24  ; 23
77
  
78
  while(1 != 0) PORTB = pinmask;
79
  3c:  80 91 60 00   lds  r24, 0x0060
80
  40:  88 bb         out  0x18, r24  ; 24
81
  42:  fc cf         rjmp  .-8        ; 0x3c <main+0x4>
82

83
00000044 <_exit>:
84
  44:  f8 94         cli
85

86
00000046 <__stop_program>:
87
  46:  ff cf         rjmp  .-2        ; 0x46 <__stop_program>
Gast #3873202
Lesenswert?

Thomas Eckmann schrieb:
> Bist du jetzt Ronny G., der unter anderem Namen postet? Oder was soll
> das?

Kannst Du mir das bitte erläutern? Was habe ich falsch gemacht? Habe 
lediglich das Code-Snippet in das Atmel-Studio 6.1 gepackt und 
compiliert. C-File = Angabe oben + #include <avr/io.h>, .lss-File wie 
gezeigt.

Kann eigentlich jeder andere auch machen - wollte nur helfen.
Gast #3873228
Lesenswert?

Thomas Eckmann schrieb:
> Das Programm, in beiden Versionen, kann gar nicht anders als
> funktionieren.

Na, dann hättest Du vielleicht mal den Vergleichs-Post anschauen sollen

while(1 != 0) PORTB = pinmask;
  3c:  80 91 60 00   lds  r24, 0x0060


versus


//while(1 != 0) PORTB = pinmask;
  while(1 != 0) PORTB = 0x55;
  3c:  85 e5         ldi  r24, 0x55  ; 85


Das kann man sogar bei MEINEN File-Auszügen erkennen - wenn man den 
hinschaut.
#3873236
Lesenswert?

1
00000038 <main>:
2

3
volatile uint8_t pinmask = 0x55;
4

5
int main(void)
6
{
7
  pinmask = 0x55;
8
  38:  85 e5         ldi  r24, 0x55  ; 85
9
  3a:  80 93 60 00   sts  0x0060, r24
10
  DDRB = 0xff;
11
  3e:  8f ef         ldi  r24, 0xFF  ; 255
12
  40:  87 bb         out  0x17, r24  ; 23
13
  
14
  while(1 != 0) PORTB = pinmask;
15
  42:  80 91 60 00   lds  r24, 0x0060
16
  46:  88 bb         out  0x18, r24  ; 24
17
  48:  fc cf         rjmp  .-8        ; 0x42 <__SREG__+0x3>

Das muss funktionieren. Ich sehe keinen Fehler.
#3873257
Lesenswert?

Dieter Frohnapfel schrieb:
> O.K., hier komplett ...

So blöd es auch klingt.
Aber jetzt muss auch noch das Hex-File her


Denn hier
1
  1c:  10 e0         ldi  r17, 0x00  ; 0
2
  1e:  a0 e6         ldi  r26, 0x60  ; 96
3
  20:  b0 e0         ldi  r27, 0x00  ; 0
4
  22:  ee e4         ldi  r30, 0x4E  ; 78
5
  24:  f0 e0         ldi  r31, 0x00  ; 0
6
  26:  02 c0         rjmp  .+4        ; 0x2c <__do_copy_data+0x10>
7
  28:  05 90         lpm  r0, Z+
8
  2a:  0d 92         st  X+, r0
9
  2c:  a2 36         cpi  r26, 0x62  ; 98
10
  2e:  b1 07         cpc  r27, r17
11
  30:  d9 f7         brne  .-10       ; 0x28 <__do_copy_data+0xc>

wird aus dem Flash die Intialisierung in den Speicher bugsiert.
Hier werden Bytes vom Flash 0x004E ins SRAM 0x0060 kopiert, von wo sich 
dann ...
1
  while(1 != 0) PORTB = pinmask;
2
  42:  80 91 60 00   lds  r24, 0x0060
3
  46:  88 bb         out  0x18, r24  ; 24

... das Programm den Wert holt.

D.h. die Frage lautet; wieso steht im Flash an der Adresse 0x004E nicht 
die 0x55, die dort eigentlich stehen sollten.

Leider sieht man das aber im LSS File nicht. Das hört ...
1
0000004c <__stop_program>:
2
  4c:  ff cf         rjmp  .-2        ; 0x4c <__stop_program>
... korrekterweise bei 0x4c/0x4d auf. Gleich dahinter müsste allerdings 
noch ein Byte mit dem Wert 0x55 stehen.

im Hex-File müsste man allerdings sehen, ob es da ist.
#3873272
Lesenswert?

Dieter Frohnapfel schrieb im Beitrag #3873259:
> Bernd K. schrieb:
>> ...und weiter oben bei __do_copy_data wird ebenfalls der Speicher bei
>> 0060 initialisiert.
>
> Und womit? Ich würde gerne etwas hinzulernen. Ich sehe da kein 0x55 ...
> bin aber auch kein Assembler-Kenner ...
>
>
> 0000001c <__do_copy_data>:
>   1c:  10 e0         ldi  r17, 0x00  ; 0

Hier soll es hinkopiert werden, das ist der Startwert für das X Register 
(X = r26,r27)
>   1e:  a0 e6         ldi  r26, 0x60  ; 96
>   20:  b0 e0         ldi  r27, 0x00  ; 0

Und hier soll es herkommen, das ist der Startwert für das Z-Register 
(r30,r31)
>   22:  ee e4         ldi  r30, 0x4E  ; 78
>   24:  f0 e0         ldi  r31, 0x00  ; 0

>   26:  02 c0         rjmp  .+4        ; 0x2c <__do_copy_data+0x10>

inhalt von Programmspeicheradresse Z nach RAM-Speicheradresse X und 
beide eins erhöhen
>   28:  05 90         lpm  r0, Z+
>   2a:  0d 92         st  X+, r0

loop again until (X == 0062)
>   2c:  a2 36         cpi  r26, 0x62  ; 98
>   2e:  b1 07         cpc  r27, r17
>   30:  d9 f7         brne  .-10       ; 0x28 <__do_copy_data+0xc>

done with loop, now jump to main
>   32:  02 d0         rcall  .+4        ; 0x38 <main>
>   34:  0a c0         rjmp  .+20       ; 0x4a <_exit>
#3873276
Lesenswert?

im HEX-File steht die 55 auch da.

Ich habe aber das Problem gefunden. Die ISP Frequenz war zu niedrig, so 
das ein Timeout kam. Eigentlich bei jeder Variante. Nur lief eben die 
Variante mit der Konstante, wärend die Variablen-Variante nicht lief. 
Daher habe ich den Fehler beim Flashen erstmal ignoriert.

danke für eure Hilfe
#3873285
Lesenswert?

Was lernen wir daraus?
Dass das Problem sich wieder einmal vor dem PC befand.

Kopf >>- Tisch, 3 Mal!

Marc Vesely schrieb:
> Ronny G. schrieb:
>> ich habe das Programm entsprechend angepasst -> keine Verbesserung
>
>  Keine Chance.
>  Das, was du gepostet hast, funktioniert.
>  PortB hat keine bits 6-7, bit 5 ist Reset, also:
>  PB.0, PB.2, PB.4 gehen auf Log.1
>  PB.1, PB.3 gehen auf Log.0

Du warst zu langsam.

mfg.
Gast #3873288
Lesenswert?

Karl Heinz schrieb:
> Hier werden Bytes vom Flash 0x004E ins SRAM 0x0060 kopiert, von wo sich
> dann ...

Bernd K. schrieb:
> Und hier soll es herkommen, das ist der Startwert für das Z-Register
> (r30,r31)

O.K., ich habe meinen Post gelöscht, nachdem ich den Beitrag von 
Karl-Heinz gelesen habe ... sorry, aber da hatte ich zumindest 
verstanden (hoffentlich), das der Wert 0x55 aus dem Flash ins SRAM 
kopiert werden sollte.

Wenn ich das dann korrekt interpretiere, sollte im Hex-File an Stelle 
0x004E (Flash) eine 0x55 stehen - tut es aber nicht. Dort steht eine 
0x50, wenn ich das richtig sehe:

:1000000009C019C018C017C016C015C014C013C04D
:1000100012C011C011241FBECFE9CDBF10E0A0E671
:10002000B0E0E8E4F0E002C005900D92A236B1071E
:10003000D9F702D007C0E4CF8FEF87BB8091600073
:0800400088BBFCCFF894FFCF50
:02004800550061
:00000001FF
Gast #3873298
Lesenswert?

Karl Heinz schrieb:
> 4c:  ff cf         rjmp  .-2        ; 0x4c <__stop_program>

> ... korrekterweise bei 0x4c/0x4d auf. Gleich dahinter müsste allerdings
> noch ein Byte mit dem Wert 0x55 stehen.

Da hätte ich jetzt erwartet, das nach ff cf -> 55 kommt. Vielleicht ist 
es aber auch schon zu spät und ich sollte mich lieber in die Ecke 
stellen und schämen ... :-(
#3873302
Lesenswert?

Dieter Frohnapfel schrieb:
> :02004800550061

Dieter Frohnapfel schrieb:
> Wenn ich das dann korrekt interpretiere, sollte im Hex-File an Stelle
> 0x004E (Flash) eine 0x55 stehen - tut es aber nicht. Dort steht eine
> 0x50, wenn ich das richtig sehe:
>
> :1000000009C019C018C017C016C015C014C013C04D
> :1000100012C011C011241FBECFE9CDBF10E0A0E671
> :10002000B0E0E8E4F0E002C005900D92A236B1071E
> :10003000D9F702D007C0E4CF8FEF87BB8091600073
> :0800400088BBFCCFF894FFCF50

hier:
> :02 0048 00 5500 61

> :00000001FF

das ist adresse 0048 und nicht 004e aber die 55 ist da, bist Du sicher 
daß das hex zum .lss passt? Evtl nochmal kompilieren nachdem Du die eine 
Zeile noch eingefügt hast?
#3873308
Lesenswert?

Bernd K. schrieb:

> das ist adresse 0048 und nicht 004e aber die 55 ist da, bist Du sicher
> daß das hex zum .lss passt? Evtl nochmal kompilieren nachdem Du die eine
> Zeile noch eingefügt hast?

Marc schrieb
> Das ist mit Sicherheit nicht der Hex-File vom geposteten Programm.


@Dieter
Du siehst hoffentlich, was du angerichtet hast.
Dein hilfreicher Versuch in allen Ehren. Aber jetzt kommt Verwirrung 
rein.


An alle:
Alles in Ordnung. Dieter hat seine Version des Programms benutzt,
Beitrag "Re: ATtiny13 und Konstanten vs. Variablen."
in der die Init Sequenz
1
  1c:  10 e0         ldi  r17, 0x00  ; 0
2
  1e:  a0 e6         ldi  r26, 0x60  ; 96
3
  20:  b0 e0         ldi  r27, 0x00  ; 0
4
  22:  e8 e4         ldi  r30, 0x48  ; 72
5
  24:  f0 e0         ldi  r31, 0x00  ; 0
so aussieht. Kopieren von 0x0048 nach 0x0060

Alles: Alles in Ordnung. Anderes Programm - andere Adresslage.
#3873324
Lesenswert?

Marc Vesely schrieb:
> Wie, zu niedrig ?

ich bin mit dem STK600 gerade am Testen bzw. Einarbeiten. Mit dem 
mega2560 funktionierte es alles (mehr oder weniger) auf Anhieb. Dann 
habe ich auf der Kleinen gewechselt und nichts ging mehr. Mit viel 
Suchen und Einstellungen und Tests habe ich das dann irgendwie halbwegs 
zum Laufen bekommen. Dabei habe ich aber auch die ISP Geschwindigkeit 
auf 5kHz gesetzt.
#3873327
Lesenswert?

Man kann übrigens das hex file auch mit avr-objdump parsen und 
disassemblieren lassen, dann sieht man auch die 55 am Ende:
1
$ avr-objdump -j .sec1 -d -m avr5 test.hex 
2

3
test.hex:     Dateiformat ihex
4

5

6
Disassembly of section .sec1:
7

8
00000000 <.sec1>:
9
   0:   09 c0           rjmp    .+18            ;  0x14
10
   2:   19 c0           rjmp    .+50            ;  0x36
11
   4:   18 c0           rjmp    .+48            ;  0x36
12
   6:   17 c0           rjmp    .+46            ;  0x36
13
   8:   16 c0           rjmp    .+44            ;  0x36
14
   a:   15 c0           rjmp    .+42            ;  0x36
15
   c:   14 c0           rjmp    .+40            ;  0x36
16
   e:   13 c0           rjmp    .+38            ;  0x36
17
  10:   12 c0           rjmp    .+36            ;  0x36
18
  12:   11 c0           rjmp    .+34            ;  0x36
19
  14:   11 24           eor     r1, r1
20
  16:   1f be           out     0x3f, r1        ; 63
21
  18:   cf e9           ldi     r28, 0x9F       ; 159
22
  1a:   cd bf           out     0x3d, r28       ; 61
23
  1c:   10 e0           ldi     r17, 0x00       ; 0
24
  1e:   a0 e6           ldi     r26, 0x60       ; 96
25
  20:   b0 e0           ldi     r27, 0x00       ; 0
26
  22:   e8 e4           ldi     r30, 0x48       ; 72
27
  24:   f0 e0           ldi     r31, 0x00       ; 0
28
  26:   02 c0           rjmp    .+4             ;  0x2c
29
  28:   05 90           lpm     r0, Z+
30
  2a:   0d 92           st      X+, r0
31
  2c:   a2 36           cpi     r26, 0x62       ; 98
32
  2e:   b1 07           cpc     r27, r17
33
  30:   d9 f7           brne    .-10            ;  0x28
34
  32:   02 d0           rcall   .+4             ;  0x38
35
  34:   07 c0           rjmp    .+14            ;  0x44
36
  36:   e4 cf           rjmp    .-56            ;  0x0
37
  38:   8f ef           ldi     r24, 0xFF       ; 255
38
  3a:   87 bb           out     0x17, r24       ; 23
39
  3c:   80 91 60 00     lds     r24, 0x0060
40
  40:   88 bb           out     0x18, r24       ; 24
41
  42:   fc cf           rjmp    .-8             ;  0x3c
42
  44:   f8 94           cli
43
  46:   ff cf           rjmp    .-2             ;  0x46
44
  48:   55 00           .word   0x0055  ; ????


letzte Zeile:
1
48:   55 00           .word   0x0055  ; ????

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren