Forum: Mikrocontroller und Digitale Elektronik Variable in AVRASM wird nicht anerkannt


von PureFranky (Gast)


Lesenswert?

Guten Abend zusammen!

Hab hier ein Problem, aus dem ich nicht schlau werden, und zwar habe ich 
einige Register als Variablen um zu benennen (ich hoffe, dat sagt man 
so)

Allerdings wird in jeder Zeile, wo die Variable "Farbe" angesprochen 
wird (18,36,43,96) vom Compiler angemeckert, dass diese Variable nicht 
deklariert sei. Hab schon folgendes Probiert:
-Neustart des Programms
-Variable umbenannt von Color auf Farbe (hätt ja n reserviertes Wort 
erwischt haben können)
-anderes Register gewählt
-declarations im code umplaziert, um evtl. beschränkung der 
Variablenmenge zu umgehen.

Achja, Chip ist ein ATtiny13 ;)

Hier der Code
1
;Blinker1.asm
2
.include "tn13def.inc"
3
;Variablen
4
.def Delay = r16
5
.def A     = r17
6
.def farbe = r19
7
.def Count = r18
8
;Ports benennen
9
.equ TXD   = 1
10
.equ RXD   = 2
11
.equ COL_ROT  =4
12
.equ COL_GRUEN=3
13
rjmp Anfang
14
;Alles vorbereiten
15
Anfang:
16
  sbi ddrb,COL_GRUEN
17
  sbi portb,COL_GRUEN
18
  sbi farbe,COL_GRUEN
19
20
Schleife:
21
  cpi A,0
22
  breq no_write
23
      rcall Write_Com
24
    no_write:
25
    rcall Read_Com
26
  cpi A,103
27
  breq gruen
28
  cpi A,114
29
  breq gruen
30
rjmp Schleife
31
  Gruen:
32
    cbi portb,COL_ROT
33
    cbi ddrb,COL_ROT
34
    sbi ddrb,COL_GRUEN
35
    sbi portb,COL_GRUEN
36
        cbi farbe,COL_GRUEN
37
    rjmp Schleife
38
    Rot:
39
      cbi portb,COL_GRUEN
40
    cbi ddrb,COL_GRUEN
41
    sbi ddrb,COL_ROT    
42
    sbi portb,COL_ROT
43
    cbi farbe,COL_ROT
44
    rjmp Schleife
45
46
47
;Warten, bis etwas geschickt wird
48
Read_Com:
49
     SBIS pinb,RXD
50
     rjmp Read_COM
51
     ldi Delay,58
52
;Kleiner Delay, warum auch immer
53
  D1:  dec Delay
54
     brne D1
55
     ldi A,0
56
     ldi Count,8
57
  L1:  lsr A
58
     sbic pinb,RXD
59
     ori A,128
60
     ldi Delay,38
61
  D2:  dec Delay
62
     brne D2
63
       dec count
64
     brne L1
65
     ldi Delay, 38
66
  D3:  dec Delay
67
       brne D3
68
     com A
69
     ret
70
71
72
;Etwas selbst versenden
73
Write_COM:
74
     SBI pinb,TXD
75
     ldi Delay,38
76
  D4:  dec Delay
77
       brne D4
78
       ldi count,8
79
  L2:  sbrc A,0
80
       rjmp OFF
81
     rjmp ON
82
  ON:  sbi pinb,TXD
83
       rjmp BitD
84
  OFF: cbi pinb,TXD
85
       rjmp BitD
86
  BitD:ldi Delay,38
87
  D5:  dec Delay
88
       brne D5
89
     lsr A
90
       dec Count
91
     brne L2
92
     cbi Pinb,TXD
93
     ldi Delay,38
94
   D6: dec Delay
95
       brne D6
96
     cbi portb,RXD
97
     sbi portb,farbe
98
     ret

von Johannes M. (johnny-m)


Lesenswert?

Erstens gibt es in Assembler keine Variablen, zweitens hat das nichts 
mit GCC zu tun (falsches Forum) und drittens versuchst Du auf ein 
Rechenregister, das Du mit dem Bezeichner "farbe" versehen hast, per 
cbi zuzugreifen. cbi bedeutet aber "Clear Bit in I/O register". 
"farbe" ist aber kein I/O-Register.

Du solltest Dich außerdem mal entscheiden, ob Du die Assembler-mnemonics 
groß oder klein schreibst. Eine völlig willkürliche Mischung von beidem 
ist der Übersichtlichkeit abträglich. Mit sonstigen 
Übersichtlichkeitsförsderungsmaßnahmen wie konsequentem, sinvollem 
Einrücken hast Du es offensichtlich auch nicht...

von PureFranky (Gast)


Lesenswert?

>>>Erstens gibt es in Assembler keine Variablen
Gibt´s dafür nen Fachterminus? Denn was sind schon Variablen, wenn ich 
in Basic ne Variable globalisiere, heißt das ja auf der normalen 
PC-Platform auch nur, dass ein Speicher reserviert wird und die Variable 
auch nur ein Register ist. (Ich hoffe, du verstehst, was ich meine)

>>>zweitens hat das nichts mit GCC zu tun (falsches Forum)
Oh, sorry :-(
Wusste nicht so recht, wo´s rein sollte, vielleicht is ja ein Admin so 
net und verschiebt es :)


>>>und drittens versuchst Du auf ein Rechenregister, das Du mit dem Bezeichner 
"farbe" versehen hast, per cbi zuzugreifen. cbi bedeutet aber "Clear Bit in I/O 
register". "farbe" ist aber kein I/O-Register.
Ah, ok. Ausser bei
sbi portb,farbe
hab ich´s beheben können, den rest find ich auch noch


>>>Mit sonstigen Übersichtlichkeitsförsderungsmaßnahmen wie konsequentem, 
sinvollem Einrücken hast Du es offensichtlich auch nicht...

Ist beim kopieren etwas kaputt gegangen.
Hab es so aufgebaut:
Sprungpunkt:
           Funktion
           cpi x,3
           brne danach
                 Funktion in If-Abfrage
           danach:
           .....
    Rücksprung, falls immer ausgeführt

Zudem leicht, aber nicht völlig zurückgerückte Sprungpunkte (Labels), 
wenn sie nur innerhalb einer größeren procedure aufgerufen werden 
(sprich, die werden nur über xxxcall aufgerufen)

Irgendwelche Tipps dazu?

Mit Groß- und Kleinschreibung, ja, das muss ich mir mal angewöhnen.
Ist glaubig ne weit verbreitete Krankheit von Leuten, die mit Sprachen 
aufgewachsen sind, die nicht mehr Case-Sensitive sind. ;)

Mfg Purefranky

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

PureFranky wrote:

>>>>zweitens hat das nichts mit GCC zu tun (falsches Forum)
> Oh, sorry :-(
> Wusste nicht so recht, wo´s rein sollte, vielleicht is ja ein Admin so
> net und verschiebt es :)

done.

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.