Forum: Mikrocontroller und Digitale Elektronik Assembler, Register reagiert falsch


von Lingus (Gast)


Lesenswert?

Hallo :-)
Ich hoffe es ist jemand hier, der sich mit Assembler auskennt. Das ist 
der Codeschnippsel:

ldi r16, 1<<PCIE               ;Pin Change Interrupts on/Int0|Int1 off
out GIMSK, r16

Recht einfach, aber will nicht klappen. Im Simulator (AVR Studio 6.1) 
wird mir der Wert falsch angezeigt. PCIE ist das 5.Bit in GIMSK, sprich 
es hat einen Dezimalwert von 32. Im Simulator steht aber nach dem Laden 
der Wert "8" im Register, statt 32. Das ist theoretisch nicht moeglich, 
da nur die Bits 7-5 beschrei(b)bar sind :-) Der Rest ist ohne Funktion. 
Bug im Simulator?

von spess53 (Gast)


Lesenswert?

Hi

Welcher Controller?

MfG Spess

von chris (Gast)


Lesenswert?

probier doch mal nen sts GIMSK,R16 aus

von spess53 (Gast)


Lesenswert?

Hi

>probier doch mal nen sts GIMSK,R16 aus

Dann würde gar nichts geschrieben werden und nicht etwas falsches.

MfG Spess

von Peter R. (pnu)


Lesenswert?

ldi r16,(1<<PCIE)
out GIMSK,r16

von Lingus (Gast)


Lesenswert?

Target ist ein Attiny2313

Ich hab bereits alle moeglichen Ladebefehle durchprobiert, immer das 
gleiche Ergebnis.

von Lingus (Gast)


Lesenswert?

Nein, an den Klammern liegt nicht. Die sind nur noetig, wenn mehrere 
Bits geschaltet werden. Habs aber trotzdem probiert, negativ. Wieder 
0x08

von MWS (Gast)


Lesenswert?

Soll-Target = Ist-Target?
Schreib' mal 5 statt PCIE und teste was dann in R16 steht.

von Stefan E. (sternst)


Lesenswert?

Lingus schrieb:
> Target ist ein Attiny2313

Sicher, dass du nicht den ATtiny2313A eingestellt hast?

von Herr M. (herrmueller)


Lesenswert?

Schau doch mal im Disassembler nach, welchen Wert ,(1<<PCIE) ergibt und 
in welche Registeradresse der geschrieben wird. Die kannst Du ja dann 
mal im Datenblatt vergleichen.

Mit meinem AvrStudio 4.19 funktioniert der Befehl einwandfrei. 2313 oder 
auch 2313A (sollte eigentlich keine Unterschied sein)

von HerrMueller (Gast)


Lesenswert?

Lingus schrieb:
> Target ist ein Attiny2313
>
> Ich hab bereits alle moeglichen Ladebefehle durchprobiert, immer das
> gleiche Ergebnis.

warscheinlich verwendest du nicht die richtige include Datei 
tn2313def.inc vom Attiny2313, sondern die vom 90at2313 2313def.inc.

es ist immer besser, wenn man etwas mehr von seinem Programm preis gibt, 
als nur eine vermeindlich falsche Zeile.

von spess53 (Gast)


Lesenswert?

Hi

>warscheinlich verwendest du nicht die richtige include Datei
>tn2313def.inc vom Attiny2313, sondern die vom 90at2313 2313def.inc.

Dann müsste der Assembler über 'ldi r16, 1<<PCIE' stolpern, denn der 
AT90S2313 kennt kein PCIE.

MfG Spess

von Lingus (Gast)


Lesenswert?

Headerdatei ist korrekt, das war das erste, was ich geprueft habe. PCIE 
ist dort mit 5 definiert. Register R16 laed auch korrekt.

Hab gestern mal rumgetestet und GIMSK mit 255 geladen, dann die Bits 
einzeln genullt. Und es hat sich herausgestellt, dass der Simulator 
Bit.5 markiert, wenn ich ich ihm den Wert 16 schicke, sprich Bit.4. Aber 
anzeigen tut er 32, obwohl er 16 bekommen hat. Das sieht mir doch nach 
nem Bug im Simulator aus...

von Lingus (Gast)


Lesenswert?

Hier der Quelltext:
1
;=====================================================
2
;                  Headerfile
3
;=====================================================
4
;
5
.nolist
6
.include "tn2313def.inc" 
7
.list
8
;
9
;=====================================================
10
;               Registers Renaming                            
11
;=====================================================
12
;
13
.def sreg_bu = r15
14
.def counter_l = r24
15
.def counter_h = r25
16
;
17
;=====================================================
18
;            Declarations of Constants                            
19
;=====================================================
20
; 
21
22
;
23
;=====================================================
24
;           Declarations of Datasegments                            
25
;=====================================================
26
;
27
.dseg
28
.org sram_start
29
Databuffer: .byte 32
30
;
31
;=====================================================
32
;              Interrupt Vector Table                            
33
;=====================================================
34
;
35
.cseg
36
.org 0x00                
37
rjmp Init        ;Reset
38
reti             ;External Interrupt0
39
reti             ;External Interrupt1
40
reti             ;Input capture interrupt 1
41
reti             ;Timer/Counter1 Compare Match A     
42
reti             ;Overflow1 Interrupt 
43
reti             ;Overflow0 Interrupt
44
reti             ;USART0 RX Complete Interrupt
45
reti             ;USART0 Data Register Empty Interrupt
46
reti             ;USART0 TX Complete Interrupt 
47
reti             ;Analog Comparator Interrupt 
48
reti             ;Pin Change Interrupt
49
reti             ;Timer/Counter1 Compare Match B
50
reti             ;Timer/Counter0 Compare Match A     
51
reti             ;Timer/Counter0 Compare Match B     
52
reti             ;USI start interrupt
53
reti             ;USI overflow interrupt
54
reti             ;EEPROM write complete
55
reti             ;Watchdog Timer Interrupt
56
;
57
;=====================================================
58
;            Interrupt Service Routines                            
59
;=====================================================
60
;
61
;
62
;=====================================================
63
;                  Initialization                            
64
;=====================================================
65
;
66
Init:
67
;
68
cli                            ;Global Interrupts off
69
;
70
;------------------ Stackpointer ---------------------
71
;
72
ldi r16, Ramend                ;Stackpointer to RAMEND
73
out spl, r16
74
;
75
;---------------- Analog Comperator ------------------
76
;
77
ldi r16, (1<<ACD)                ;Analog Comparator off
78
out ACSR, r16           
79
;
80
;----------------- Ext. Interrupts -------------------
81
;
82
ldi r16, (1<<PCIE)             ;Pin Change Interrupts on/Int0|Int1 off
83
out GIMSK, r16                 
84
ldi r16, (1<<PCINT0)|(1<<PCINT1)|(1<<PCINT4)
85
out PCMSK, r16
86
;
87
;-------------------- Timer0/1 -----------------------
88
;
89
clr r16
90
out TIMSK, r16                 ;All Timer0/1 Interrupts off
91
;
92
;----------------------- USI -------------------------
93
;
94
;clr r16
95
out USICR, r16                 ;USI Interrupts off
96
;
97
;---------------------- EEPROM -----------------------
98
;
99
;clr r16
100
out EECR, r16                  ;EEPROM Interrupts off
101
;
102
;---------------------- USART ------------------------
103
;
104
;clr r16
105
out UBRRH, r16                 ;USART Baud to 9600 Baud (High=0/Low=95) by 14,7456MHz
106
ldi r16, 95
107
out UBRRL, r16
108
;                               
109
ldi r16, (31<<TXEN)              ;USART Rx, Tx, all Interrupts activated          
110
out UCSRB,r16
111
;                               
112
ldi r16, (3<<UCSZ0)              ;USART frame format: 8data, 1stop bit
113
out UCSRC,r16
114
;
115
;-------------------- Watchdog -----------------------
116
;
117
wdr                            ;Reset Watchdog
118
in r16, MCUSR                  ;Clear WDRF in MCUSR
119
andi r16, (0xff & (0<<WDRF))
120
out MCUSR, r16
121
in r16, WDTCSR                 ; Write logical one to WDCE and WDE
122
ori r16, (1<<WDCE) | (1<<WDE)
123
out WDTCSR, r16
124
ldi r16, (0<<WDE)              ; Turn off WDT
125
out WDTCSR, r16
126
;
127
;----------------- Pins and Ports --------------------
128
;
129
ldi r16, 0b00000111
130
out DDRA, r16
131
;
132
ldi r16, 0b11101100
133
out DDRB, r16
134
;
135
clr r16
136
out DDRD, r16
137
;
138
;
139
;
140
;=====================================================
141
;                   Main Routine                           
142
;=====================================================
143
144
145
146
147
main:
148
rjmp main

: Bearbeitet durch User
von Davis (Gast)


Lesenswert?

Lingus schrieb:

> Das sieht mir doch nach nem Bug im Simulator aus...

Auf keinem Fall schreiben, welchen Simulator du verwendest. Du verdirbst 
damit den Leuten nur den Spaß, dir die Würmer aus der Nase zu ziehen.


P. S. Ich weiß wo dein Problem liegt.

von spess53 (Gast)


Lesenswert?

Hi

>Auf keinem Fall schreiben, welchen Simulator du verwendest. Du verdirbst
>damit den Leuten nur den Spaß, dir die Würmer aus der Nase zu ziehen.

Das ATMEL Studio 6.1 hat nur einen Simulator für Assembler.

@ Lingus (Gast)

Für Assembler lohnt sich das 6er Studio nicht. Viel zu aufgeblasen. Mit 
dem AVR Studio 4.19 bist du besser bedient.

Bekommst du hier:

http://www.atmel.com/tools/studioarchive.aspx

MfG Spess

von Lingus (Gast)


Lesenswert?

Davis schrieb:
> Auf keinem Fall schreiben, welchen Simulator du verwendest. Du verdirbst
> damit den Leuten nur den Spaß, dir die Würmer aus der Nase zu ziehen.
>
> P. S. Ich weiß wo dein Problem liegt.

Wer lesen kann ist klar im Vorteil, oben im ersten Beitrag steht, dass 
ich AVR Studio 6.1 benutze und das hat nur einen einzigen Simulator.

Wenn Du weisst, wo das Problem liegt, warum schreibst Du es dann nicht?


>Für Assembler lohnt sich das 6er Studio nicht. Viel zu aufgeblasen. Mit
>dem AVR Studio 4.19 bist du besser bedient.

Studio 4 hab ich auf meinem Laptop. Allerdings gefaellt mir die 6.1 
besser, auch wenn sie in vielen Dingen aufgeblasen ist, das ist wahr. 
Auch die staendigen Konflikte mit Microsofts Visual 2010 nerven.

von chris (Gast)


Lesenswert?

hallo,

so ich habs mal für mich ausprobiert mit deinem code und ja auch bei mir 
tritt das phönomen auf das anstatt $20=PCIE in refister gesetzt und $08 
in das GIMSK geschrieben wird auch beim tiny2313A.

Wenn man das ding händisch setzt passiert nix ausser das die INT0/1 
keine flags setzen und wenn man denn den PCIE setzt und dazu den 
entsprechenden pin setzt wird auch das flag gesetzt zum anspringen der 
ISR aber nop kein sprung in die ISR.

könnts vielleicht nen BUG sein in der 6er??

habs auch mit der 4.19er versucht passt soweit man sollte das I-Bit noch 
setzen UND dann gehts los UDRIE=1 fährt dir dein prgramm zu, weil
(>>>>31<<<<<<<TXEN) gesetzt wird.

ldi r16, (31<<TXEN)   ;USART Rx, Tx, all Interrupts activated
out UCSRB,r16

fix ausgebessert und in der 4.19er PIN0/1/4 durchgetestet und die ISR 
wird angesprungen.

von Lingus (Gast)


Lesenswert?

Versuche mal statt Bit.5 fuer PCIE Bit.4 (ohne Belegung) zu setzen und 
kuck was passiert.

>UDRIE=1 fährt dir dein prgramm zu, weil (>>>>31<<<<<<<TXEN) gesetzt wird.

Was meinst Du damit?

von chris (Gast)


Lesenswert?

na der int wird immer ausgelöst weil UDR empty als Interrupt freigegeben 
war und solange das UDRE leer ist löst das ding halt aus und dein 
programm ist immer nur mit der ISR beschäftigt, kann natürlich sein das 
du es brauchst aber das kann man aus deinem programm so nicht eindeutig 
erkennen.

>>UDRIE=1 fährt dir dein prgramm zu, weil (>>>>31<<<<<<<TXEN) gesetzt wird.

>Was meinst Du damit?

entweder
ldi r16,(1<<RXCIE|1<<TXCIE|0<<UDREI|1<<TXEN|1<<RXEN.....)
out UCSRB,r16

wegen der übersichtlichkeit

bei dir steht jedoch

ldi r16,(31<<TXEN) ;hier ist die 31
out UCSRB,r16

siehe post von Autor: Lingus (Gast) Datum: 25.11.2013 13:05

wenn du allerdings die 31 absichtlich gesetzt hast denn ok hat mich nur 
erschrocken weil wie oben beschrieben das ding andauernd aufgerufen wird 
in der simulation und ich zumindest nur beim simulieren keinen weiteren 
zusammenhang erkennen konnte.

von Lingus (Gast)


Lesenswert?

Ja, die 31 war absichtlich gesetzt als Maske zum setzen der 
erforderlichen Bits

von chris (Gast)


Lesenswert?

ok denn hab i nix gesagt.

aber funktioniert nun dein programm so wie du es dir vorgestellt hast??

ach und ja $10 ins reg laden und auf das GIMSK geben hat den 
entsprechenden effekt das PCIE=1 wird ich gahe mal von nen bug aus.

von MWS (Gast)


Lesenswert?

Lingus schrieb:
> Hier der Quelltext:

Es ist schlicht und einfach Simulatormurks im Studio 6.1, denn lädt man 
das von 6.1 erzeugte Hex in Studio 4 und simuliert dort, verhält es sich 
so wie vorgesehen: PCIE wird gesetzt. Der compilierte Code ist also 
lauffähig, die Simulation scheitert dagegen.

von Lingus (Gast)


Lesenswert?

Na wenigstens eine gute Nachricht. Das waere ja mal ne Fehlersuche, wenn 
der Code korrekt ist aber der Compiler ne Macke hat

von (prx) A. K. (prx)


Lesenswert?

Lingus schrieb:
> Na wenigstens eine gute Nachricht. Das waere ja mal ne Fehlersuche, wenn
> der Code korrekt ist aber der Compiler ne Macke hat

Nicht der Compiler. Der Simulator.

von Lingus (Gast)


Lesenswert?

Ja, das meine ich ja. Gottseidank das nur der Simulator. Muss wohl doch 
auf Studio 4 ausweichen. Ohne Simulator werd ich fuer mein Projekt 
viermal soviel Zeit brauchen und der PCINT ist einer der wichtigsten 
Bestandteile dabei. So ein Mist, Armutszeugnis fuer Atmel

von der alte Hanns (Gast)


Lesenswert?

Die Quarze singen es im Chor
es weiß der letzte Widerstand
das ist kein Simulator -
das ist ein Simulant!

von Lingus (Gast)


Lesenswert?

Hab den Bug gestern Abend noch an Atmel geschickt, hier nochmal rein 
informativ die Antwort dazu von heute:

2013-11-25 21:04:25 CET

Dear sir and madam,

there is a bug in the simulator for AVR-Assembler. I've tried to 
simulate the
commands:

ldi r16, (1<<PCIE)
out GIMSK, r16

PCIE is the 5. Bit in GIMSK, the result should be 0x20 in the register. 
But the
result is 0x08. If you now set Bit.4 in GIMSK, which has no function, 
GIMSK
shows 0x20 (should be 0x10) and PCIE is activated in simulation.

Target device is Attiny2313, I'm using Atmel Studio 6.1 Service Pack 2

I have posted this bug to some friends, they have tested it too with the 
same
result.

------------------------------------------------------------------------ 
---

[reply] [-] Comment 1 Morten Engelhardt Olsen 2013-11-26 07:37:04 CET

This looks like a simulator issue. Bug AVRSIM-294 reported to the 
simulator
team.

[reply] [-] Comment 2 Morten Engelhardt Olsen 2013-11-26 09:05:27 CET

This was a confusing one, but here is the long an detailed explanation:

tiny2313 is a reduced tiny4313. tiny4313 has 3 PCIE-bits located at 
GIMSK[5:3].

One would normally think that the three bits were placed as follows:
bit5 = pcie2, bit4 = pcie1, bit3 = pcie0

Which is why we mapped pcie[2:0] to GIMSK[5:3].

It turns out that the bits are placed as follows:
bit5 = pcie0, bit4 = pcie2, bit3 = pcie1
This means that since tiny2313 only has pcie0 this has ended up at bit3 
of
GIMSK in the simulator model, rather than bit5.

Keep in mind that this only affects how the bit is presented in the 
IO-view in
Atmel Studio. It will look a bit odd, but the device will behave as it 
is
supposed to.

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.