Forum: Mikrocontroller und Digitale Elektronik SPI Master-Slave kommunikation


von hilfe_suchender (Gast)


Lesenswert?

Hi,

ich bin ein bischen am Verzweifeln weil ich nicht wirklich weiterkomme 
:(

Ich versuche eine einfach kommunikation zwischen einem ATxmega 
128A3(slave) und einem atmega8515(Master) auf dem STK500 Board 
aufzubauen. (Hardwaretechnisch alles 5 mal kontrolliert  und 
leitungslängen liegen ca bei 8 cm )

Ziel ist es erstmal nur ein Reg. hin und herzuschicken und mit jedem 
Umlauf zu inkrementieren und an den 8 LEDs auszugeben ( mit bischne zeit 
zwischen dem senden damit ich was sehe :D )

ich schicke mal den code schnipsel des Masters und des Slaves mit , ich 
hoffe einer von euch kann da schon einen Fehler entdecken:

Slave (xmega128A3)
1
;*************************************************************************************
2
;*                                           *
3
;*                                           *
4
;*     Controller-Typ:   AT_XMEGA128A3                       *
5
;*     Taktfrequenz:     32 MHz Interner Oszilator                  *
6
;*     Beschreibung:    SPI slave test mit stk500                 *
7
;*                                           *
8
;*                                           *
9
;*************************************************************************************
10
11
  .include  "ATxmega128A3def.inc"
12
13
  .def    accu1  = r20          // Arbeitsregister highlow_re cnt
14
  .def    accu2  = r21          // Arbeitsregister 2
15
  .def    accu3  = r22          // Arbeitsregister pwm low
16
  .def    accu4  = r23          // Arbeitsregister pwm high
17
18
  .org    0x000
19
    rjmp    Conf
20
  .org    SPIE_INT_vect
21
  rjmp    SPIE_INT_handler
22
/*--------------------------------------------------------------------------------- */
23
/*----------------------------     Stackpointer     --------------------------------*/ 
24
/*--------------------------------------------------------------------------------- */
25
26
  ldi      accu1,low(RAMEND)    
27
  out      CPU_SPL,accu1      
28
  ldi      accu1,high(RAMEND)    
29
  out      CPU_SPH,accu1
30
31
/*--------------------------------------------------------------------------------- */
32
/*----------------------------     Konfigurierung     ------------------------------*/ 
33
/*--------------------------------------------------------------------------------- */
34
Conf:
35
  ldi      accu1, 0b00000010
36
  sts      PORTE_DIR, accu1        // SPI Port E MISO =out
37
38
  ldi      accu1, 0b00001100
39
  sts      PORTB_DIR, accu1        // PortB (Pin2+3) DAC richtung OUT
40
41
  ldi      accu2, 0b00000001        // 32 MHz intern oszilator
42
  sts      OSC_RC32MEN_bm, accu2
43
  ldi      accu2, 0b00000001        // 32 MHz oszilator als clock-source
44
  sts      CLK_SCLKSEL_RC32M_gc, accu2
45
46
  rcall    dac_init
47
  rcall    spi_init
48
/*--------------------------------------------------------------------------------- */
49
/*-------------------------------    loop    -------------------------------*/ 
50
/*--------------------------------------------------------------------------------- */
51
52
sei
53
54
loop:
55
  
56
  rjmp    loop
57
/*--------------------------------------------------------------------------------- */
58
/*-------------------------------    auslesen spi    -------------------------------*/ 
59
/*--------------------------------------------------------------------------------- */
60
start_vergl:    
61
  lds      accu1,SPIE_DATA
62
    cpi      accu1,0b00000001
63
    brne    zweig_0 
64
65
  rjmp    loop
66
67
zweig_0:
68
    cpi      accu1,0b00000010
69
    brne    kein_treffer
70
71
    rjmp    loop
72
73
kein_treffer:
74
75
  rjmp    loop
76
/*--------------------------------------------------------------------------------- */
77
/*-------------------------------    spi interrupt    ------------------------------*/ 
78
/*--------------------------------------------------------------------------------- */
79
80
81
SPIE_INT_handler:
82
  push accu4                  // Sichern auf Stack            
83
  in   accu4,CPU_SREG              // Einlesen des SREG           
84
  push accu4                    // Schreiben von  SREG  im Stack (KOPIE)  
85
86
  rcall start_vergl              // Prüfung        
87
88
  pop  accu4                  // LESEN von SREG vom STACK (KOPIE)    
89
  out  CPU_SREG,accu4              // Wiederherstellen von SREG           
90
  pop  accu4                  // Wiederherstellen von "accu"         
91
92
  reti
93
/*--------------------------------------------------------------------------------- */
94
/*-------------------------------    spi initial    --------------------------------*/ 
95
/*--------------------------------------------------------------------------------- */
96
spi_init:
97
  ldi      accu1,0b01000000        // SPIE enable slavemode
98
  sts      SPIE_CTRL,accu1
99
100
  ldi      accu1,0b00000010        // mid lvl interrupt
101
  sts      SPIE_INTCTRL,accu1
102
  ret
103
/*--------------------------------------------------------------------------------- */
104
/*--------------------------------    DAC initial    -------------------------------*/ 
105
/*--------------------------------------------------------------------------------- */
106
dac_init:  
107
  ldi      accu2, 0b00001000          
108
  sts      DACB_CTRLC, accu2        // DAC Ref AVcc
109
110
  ldi      accu2, 0B01000000        
111
  sts      DACB_TIMCTRL, accu2        // DAC conversion intervall 16 clk
112
113
  ldi      accu2, 0b00000101          
114
  sts      DACB_CTRLA, accu2        // DAC an Port B Ch0 + overall enable
115
  ret






Master: ( atmega8515 )
1
;*************************************************************************************
2
;*                                           *
3
;*                                           *
4
;*     Controller-Typ:   atmega8515  / STK500                   *
5
;*                                            *
6
;*                                           *
7
;*                                           *
8
;*************************************************************************************
9
10
; ATmega8        
11
.include "8515def.inc"
12
13
14
.def SENDE_DATA  = R1
15
.def temp     = r16
16
.def temp1     = r17
17
.def temp2     = r18
18
.def temp3     = r19
19
20
.cseg      ;Beginn eines Code-Segmentes        
21
.org 0      ;Startadresse=0                            
22
rjmp RESET      ; Reset Handler                           
23
24
/*--------------------------------------------------------------------------------- */
25
/*----------------------------     Konfigurierung     ------------------------------*/ 
26
/*--------------------------------------------------------------------------------- */
27
RESET:                        
28
;STACK initialisieren
29
  ldi temp, LOW(RAMEND)
30
    out SPL, temp
31
    ldi temp, HIGH(RAMEND)
32
    out SPH, temp
33
34
; PORT B initialisieren      
35
  ldi temp, 0b10110000  // sck, mosi und ss auf out
36
  out DDRB,temp        
37
; PORT D initialisieren      
38
  ldi temp, 0b11111111  // alles Ausgänge für 8x LED
39
  out DDRD, temp  
40
41
; SPI_INITIALISIERUNG
42
  rcall SPI_INITIALISIERUNG
43
  clr SENDE_DATA
44
/*--------------------------------------------------------------------------------- */
45
/*----------------------------------    loop    ------------------------------------*/ 
46
/*--------------------------------------------------------------------------------- */
47
LOOP:
48
  rcall  wait_1s        ; 1s PAUSE          
49
  
50
  inc    SENDE_DATA      ; +1            
51
  mov    temp, SENDE_DATA  ; KOPIEREN nach TEMP          
52
  rcall  SPI_SENDEN        ; SPI SENDEN   INP: TEMP    
53
54
  rcall  SPI_EMPFANGEN    ; SPI EMPFANGEN OUT: TEMP  
55
  rjmp  LOOP
56
/*          
57
/*--------------------------------------------------------------------------------- */
58
/*----------------------------    spi initial    -----------------------------------*/ 
59
/*--------------------------------------------------------------------------------- */
60
SPI_INITIALISIERUNG:
61
              
62
  ldi temp,(0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(1<<SPR0)
63
  out SPCR,temp
64
ret
65
/*--------------------------------------------------------------------------------- */
66
/*---------------------------------   senden    ------------------------------------*/ 
67
/*--------------------------------------------------------------------------------- */                                  
68
SPI_SENDEN:      
69
  cbi    PORTB, 5        // SS Pin
70
  out    SPDR,temp
71
SPI_SENDEN_w:
72
  sbis  SPSR,SPIF        //  skip if interrupt flag in spsr register ( status reg) is set
73
  rjmp  SPI_SENDEN_w        
74
  sbi    PORTB, 5        // SS Pin
75
ret
76
/*--------------------------------------------------------------------------------- */
77
/*-------------------------    rückgabe einlesen    --------------------------------*/ 
78
/*--------------------------------------------------------------------------------- */
79
SPI_EMPFANGEN:
80
  in temp, SPDR  ; einlesen      
81
82
  out PORTB, temp ; auf PORT D ausgeben
83
84
ret
85
/*--------------------------------------------------------------------------------- */
86
/*----------------------------    warteschleife    ---------------------------------*/ 
87
/*--------------------------------------------------------------------------------- */
88
; bei 1 MHz Takt ca.1s Pause                          
89
WAIT_1s:
90
  push temp1           ; temp1 auf dem Stack sichern            
91
  push temp2           ; temp2 auf dem Stack sichern            
92
  push temp3
93
;------------
94
  ldi temp3,18
95
  clr temp2
96
  clr  temp1      
97
wait1s_w:  
98
  dec  temp1
99
  brne  wait1s_w
100
  dec  temp2    
101
  brne  wait1s_w
102
  dec  temp3    
103
  brne  wait1s_w
104
;------------
105
  pop temp3
106
  pop temp2          ; temp2 wiederherstellen                    
107
  pop temp1          ; temp1 wiederherstellen                    
108
ret

Ich hoffe diese Informationen reichen um meinen Fehler zu erkennen

vielen dank schonmal
J.

von Dumpf Backe (Gast)


Lesenswert?

Naja, das Lesen der SPI als Master ist nicht wirklich so implementiert. 
Schau nochmals das Datenblatt an.

Der wesentliche Punkt ist : ....

von Ralph (Gast)


Lesenswert?

Und wieder einer der sich mit Assembler rumquält wo es absolut keinen 
Sinn macht.

Viel Spass

von Dumpf Backe (Gast)


Lesenswert?

Es geht nicht um ASM oder was anderem, sondern ob man die SPI verstanden 
hat. Das ist hier nicht der Fall.
Die Frage bleibt : Wie liest der Master von der SPI Schnittstelle?

von hilfe_suchender (Gast)


Lesenswert?

Hi,

danke schonmal für die Antwort. Ich muss leider ehrlich gestehen ich 
weis nicht wodrauf du hinauswillst.

Grundlegend kann der Master nicht gleichzeitig senden und empfangen, 
dass das Senden abgeschlossen ist, fange ich ja mit dem Inter. Flag ab 
?! Muss ich nun das Gleiche beim Empfangen machen (erst ausgeben nach 
abfrage)?

Ich habe mir das Datenblat nochmal durchgelesen und einige PDF´s zu SPI 
ich bin aber anscheinend zu blöd oder ich suche nach dem falschen Ansatz 
um mein Problem den mir vorliegenden Informationen zu lösen.

Wenn du vieleicht konkreter werden könntest was ich suchen muss wäre das 
nett :)

grüße
J.

von Dieter Werner (Gast)


Lesenswert?

hilfe_suchender schrieb:
> Grundlegend kann der Master nicht gleichzeitig senden und empfangen...

Doch, genau das ist der Trick an SPI - es wird sychron gesendet und 
emfangen. Es gibt daher auch keine getrennten TX und RX Interrupts.
Die während des Sendens am DataIn anliegenden Daten landen nach 
Abschluss des Vorgangs im RX-Register.

von Dumpf Backe (Gast)


Lesenswert?

Die Daten ins SPI Register zu schreiben ist eine Sache.
Die Frage ist wer bringt den Clock und wie bringt er den Clock ?

von Falk B. (falk)


Lesenswert?

@Dumpf Backe (Gast)

>Die Daten ins SPI Register zu schreiben ist eine Sache.
>Die Frage ist wer bringt den Clock und wie bringt er den Clock ?

Der Master. Das passiert automatisch beim AVR, wenn man ein Byte in SPDR 
schreibt, dann wird die Übertragung incl. Takterzeugung automatisch für 
ein Byte gestartet. Wie beim UART, nur mit Takt.

von hilfe_suchender (Gast)


Lesenswert?

Ich will das ja verstehen , dafür bin ich hier !

ich habe nochmals im Datasheet geguckt :

"When configured as a Master, the SPI interface has no automatic control 
of the SS line. This must be handled by user software before 
communication can start. When this is done, writing a byte to the SPI 
Data Register starts the SPI clock generator, and the hardware shifts 
the 8 bits into the Slave."

so für mich heißt das "clear SS  schreib ins data-reg und er macht alles 
allein und setze wieder SS " :D

anscheinend bin ich da auf dem Holzweg :(

von hilfe_suchender (Gast)


Lesenswert?

liegt der Fehler denn im Master oder im Slave ?

von Dampf Backe (Gast)


Lesenswert?

Ne. die Richtung ist gut. Weiter...

von Peter D. (peda)


Lesenswert?

hilfe_suchender schrieb:
> liegt der Fehler denn im Master oder im Slave ?

Stimmt, Du hast 2 Baustellen gleichzeitig auf.

Ich würde daher erstmal den Master mit einem 74HC595 testen
(RCLK = /SS).

von hilfe_suchender (Gast)


Lesenswert?

wie ? weiter .. :D

ich dachte dies habe ich so umgesetzt ^^

"After shifting one byte, the SPI clock generator
stops, setting the end of Transmission Flag (SPIF)"

den habe ich auch abgefragt glaube ich ..^^

"The last incoming byte will be kept in the Buffer Register for later
use."

und ja da steht für mich das der letzte reingekommene Wert im 
Dataregister steht

von hilfe_suchender (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Stimmt, Du hast 2 Baustellen gleichzeitig auf.
>
> Ich würde daher erstmal den Master mit einem 74HC595 testen
> (RCLK = /SS).

 ja da hast du recht...

aber nu weis ich schon wieder nicht was ein 74HC595 ist ;)

von Dampf Backe (Gast)


Lesenswert?

>"The last incoming byte will be kept in the Buffer Register for later
use."
und ja da steht für mich das der letzte reingekommene Wert im
Dataregister steht


Ja. wenn es denn hereinkommt. Und wie kommt es herein ?

von Dampf Backe (Gast)


Lesenswert?

Der 74HC595 ist insofern wichtig, als man sich einen SPI Master und 
slave mit je einem 74HC595 selber basteln kann. Und wenn man diese zwei 
verbunden begriffen hat ist alles trivial.

von hilfe_suchender (Gast)


Lesenswert?

Über das Dataregister vom Slave ( MISO-Leitung ) würde ich so spontan 
behaupten :D

von Dampf Backe (Gast)


Lesenswert?

Mit welchem clock ?

von hilfe_suchender (Gast)


Lesenswert?

Mit der Master clk , in meinem Fall SPR1=0 SPR0=1 --> f_osc/16

von Peter D. (peda)


Lesenswert?

hilfe_suchender schrieb:
> aber nu weis ich schon wieder nicht was ein 74HC595 ist ;)

Google hilft.

Ist ein Ausgaberegister (SIPO).
Man kann bis zu 8 LEDs ranhängen und dann schauen, ob sie wie erwartet 
reagieren.

Ein Eingaberegister (PISO) wäre der 74HC165.

von hilfe_suchender (Gast)


Lesenswert?

Da ich nicht weiterkomme mit 2 baustellen könnte ich eigentlich 
prinzipiell auf dem xmega ( der hat ja mehrere spi schnitstellen ) 
master und slave implementieren und damit rum testen ?

von Dampf Backe (Gast)


Lesenswert?

>>>Über das Dataregister vom Slave ( MISO-Leitung ) würde ich so spontan
behaupten
>>Mit welchem clock ?
>Mit der Master clk , in meinem Fall SPR1=0 SPR0=1 --> f_osc/16

Aber wie kommt die Clock raus? Clock ist ja kein CW signal, das immer 
kommt.

von Dampf Backe (Gast)


Lesenswert?

>Ein Eingaberegister (PISO) wäre der 74HC165.

Der 74HC597 ist moderner.

von Dampf Backe (Gast)


Lesenswert?

Auf einem XMega geht's nicht schneller.

FOsc/16 is etwas schnell... weshalb ist bald klar.

Der Slave hat also ein Datenbyte empfangen, und gelesen. Dann macht er 
etwas und kann als einzige Moeglichkeit wieder ein Datenbyte in die SPI 
schreiben. Wie kommt das Byte nun an den Master ?

von Purzel H. (hacky)


Lesenswert?

Loesen wir's doch auf. Der Master liest von einem Slave, indem er ein 
dymmy-Write macht. Schreibe 0x00 und der Slave bekommt den noetigen 
Clock. Wann sollder Master den Write machen? Na. Wenn der slave fertig 
ist.

von hilfe_suchender (Gast)


Lesenswert?

Ganz ehrlich ich verstehe nicht was ihr meint :( ich habe doch auf dem 
Master eine Schleife fertig gemacht in der ich ständig den akuellen Wert 
inkrementiere und wieder sende. Warum muss ich nun ein Dummy Wert 
nochmal senden ?
1
LOOP:
2
  rcall  WAIT_1s                ; 1s PAUSE          
3
  
4
  inc    SENDE_DATA             ; +1            
5
  mov    temp, SENDE_DATA       ; KOPIEREN nach TEMP
6
7
  rcall  SPI_SENDEN             ; SPI SENDENINP:TEMP    
8
  rcall  SPI_SPSR_AUSWERTEN     ; SPSR-Rgister auswerten
9
  rcall  SPI_EMPFANGEN          ; SPI EMPFANGEN OUT: TEMP 
10
 
11
  rjmp  LOOP

habe jetzt noch kurz eine WCOL abfrage dazwischen gehauen

warten -> ss low senden (bis SPIF 1 ist) ss high -> WCOL abfragen -> 
empfangen

und das ganze in einer Loop damit ich eine dauerhafte Komunikation habe. 
Ich bin froh wenn man versucht mir zu helfen, aber ich verstehe ehrlich 
gesagt immernoch nicht was eigentlich falsch läuft bei mir, weil aus 
Antworten die mir gegeben werden größtenteils Fragen werden... sry aber 
diese Art der Hilfe bringt mir momentan nicht viel  ;)

Dampf Backe schrieb:
> FOsc/16 is etwas schnell... weshalb ist bald klar.

warum zu schnell ? mein xmega läuft mit 32MHz und der 8515 mit default 
einstellung ( wies grad nicht wieviel das ist aber auf jedenfall weit 
unter dem XMega.)

von Dampf Backe (Gast)


Lesenswert?

>Dampf Backe schrieb:
> FOsc/16 is etwas schnell... weshalb ist bald klar.

Naja. Der Slave muss den Wert rausziehen, irgendwas damit machen und 
dann kommt schon der Naechste. Da ist null Buffer dazwischen. Ein 
Interrupt mit push & pop, call & ret verplemert schon 8 oder so takte. 
Und wenn da nur 16 Takte dabei sind wird's eng.


Empfangen liest das Byte aus dem SPI input buffer. Es ist aber noch im 
outputbuffer des Slaves. Und muss erst ruebergeclockt werden.


Egal, schau's dir an, das waren die tips.

von hilfe_suchender (Gast)


Lesenswert?

Gut kein problem machen wir des Ding langsamer hab nun 1/128

Das ändert nicht daran das ich immernoch nicht verstehe was du meinst, 
da ich doch nach jedem senden, wieder sende ( loop ?!?!?!?! ) und somit 
den letzten Wert aus dem Slave raus clocke , warum ist es so schwer wenn 
man mir schon helfen will eine präzise Antwort zu geben :(

von Dieter Werner (Gast)


Lesenswert?

Was nutzt eine präzise Antwort, wenn du sie - aus welchem Grund auch 
immer - nicht verstehst?

Wenn ein Sendevorgang abläuft (MOSI, CLK) ist damit unweigerlich exakt 
zeitgleich über MISO und CLK auch ein Empfangsvorgang gekoppelt.

Oder etwas ausführlicher
Wenn man etwas sendet wird zwangsläufig auch empfangen. Ob man die 
empfangenen Daten auch benötigt und auswertet hängt vom Slave ab.
Das Empfangsregister (bei vielen µC gleiche Adresse wie Senderegister) 
sollte aber auf jeden Fall gelesen werden, sonst kann es zu Fehlern 
kommen.

Wenn man etwas empfangen möchte, ist ebenfalls zwangsläufig auch eine 
Sendung notwendig. Die gesendeten Daten dürfen den Slave aber auf keinen 
Fall stören (mache Slaves haben dafür sogar einen "NOP" Befehl).


Das ist der Hintergrund von SPI Übertragungen und da führt kein Weg dran 
vorbei.

von Bastler (Gast)


Lesenswert?

Zeichne dir doch mal zwei Blöcke auf, Master und Slave.
Verbinde diese mit CLK, MISO, MOSI.
Dann spiel mal eine Übertragung durch.
Denk daran, dass beide als Schieberegister arbeiten.

Was muss der Master machen um den Slave zu lesen?
(Stichwort Dummybyte)

Ein Blatt Papier kann oft helfen...

von hilfe_suchender (Gast)


Lesenswert?

ja soweit habe ich das auch verstanden das Prinzip hinter SPI ist mir 
nicht bis ins detail aber in der Semantic bekannt.

Was ich unter präzise Antwort verstehe ist mein Fall: was genau ich 
falsch, weil ich denke anscheinend richtig habe es aber falsch umgesetzt 
oder ich denke auch noch falsch das kann sein ;) aber zu meinen 
Gedanken:

Wenn ich eine Loop im Master fertig mache in der ich was verschicke ist 
durch diese Schiebe register zwangläufig der Fall das gleichzeitig das 
im slave vorliegende Byte im Schieberegister wieder an den Master sende. 
( Ich hoffe ich denke da richtig ) . so nun In meinem programm Packe ich 
doch mit jedem Umlauf einen Wert in das Schiebe register und versende es 
?!dh also im 2. Umlauf ist es wieder beim Master (richtig?)

Ich will nun eigentlich nichts weiter wissen WAS genau ich in meiner 
Ausführung falsch mache ,bzw. was muss ich zusätzlich tuen ? was habe 
ich vergessen zu tuen ? das verstehe ich halt unter Präzise  ;)

Mir zu erklären wie SPI allgemein funktioniert bringt mir nicht viel. Es 
tut mir leid vlt reden wir auch aneinander vorbei ;)

Ich habe zu anderen Programmiersprachen auch schon 2 3 mal Foren zu rate 
gezogen, in 90% aller Foren wird dann auf den Fehler hingedeutet( oft 
mit kleinen code schnipsel) und im besseren Fall noch erklärt warum das 
so ist ;)
Ich habe es auch schon so gehandhabt wenn ich mal helfen konnte und mehr 
will ich auch nicht :D

von Dieter Werner (Gast)


Lesenswert?

> In meinem programm Packe ich doch mit jedem Umlauf einen Wert in das
> Schiebe register und versende es ?!dh also im 2. Umlauf ist es wieder
> beim Master (richtig?)

Im Prinzip ja - aaaber im Normalfall liest der Slave die Daten aus 
seinem Schieberegister um irgendwas damit zu machen und ersetzt sie 
durch Daten die er dem Master schicken will/soll.

Welche das sind ist entweder im Slave fest vorprogrammiert oder der 
Master muss es mit seiner vorherigen Sendung dem Slave gesagt haben.

Die SPI Schnittstelle überträgt nur die Daten, was damit passieren soll 
muss in einem übergeordneten Protokoll festgelegt werden - halt 
innerhalb der Möglichkeiten die der Slave zur Verfügung stellt.

von hilfe_suchender (Gast)


Lesenswert?

jo ok soweit so gut mit den daten will ich vor erst auf dem slave ja 
nichts machen :D

ich wollte in meinem fall nur immer wieder einen wert der stetig größer 
wird ( incr. ) im 1 s takt schicken und mir das was ich geschickt habe 
an 8 LED´s am Master angucken , sozusagen als bestätigung das die 
komunikation geklappt hat
dh also Slave macht nichts  master macht alles und slave dient nur  als 
"spiegel"

das klappt wie gesagt bei mir  nicht und ich würde halt einfach den 
grund dafür erfahren :D

Muss ich vlt die daten die er bekommen hat im gleich atemzug nochma in 
das Datenregister vom SPI ( im slave ) reinschreiben also während des 
Interrupts ?

von Peter D. (peda)


Lesenswert?

hilfe_suchender schrieb:
1
 loop: 
2
   rjmp    loop 
3
//...
4
 start_vergl: 
5
//...
6
   rjmp    loop 
7
8
 SPIE_INT_handler:
9
//... 
10
   rcall start_vergl              // Prüfung
11
12
// all code after this line: never reached !!!

Um mal auf den Code zurück zu kommen, der ist Nonsens.

Hättest Du das in C geschrieben, hätte das schon längst jemand gemerkt,
bzw. sogar Du selber.

Und solche Fallstricke, wie etwas aufrufen (rcall) und dann rausspringen 
(rjmp), läßt C erst garnicht zu.

von hilfe_suchender (Gast)


Lesenswert?

Ja stimmt das is blödsinn habe ich auch mitlerweile entfernt, ich bin 
nicht gut in ASM aber ich bin noch schlechter in C ;) deswegen schreibe 
ich in ASM

ist denn noch irgendwas dadrin was blödsinn ist ?

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.