Forum: Mikrocontroller und Digitale Elektronik Daten einlesen


von Pierre G. (bqube)


Lesenswert?

Guten Tag,
seid Tagen versuch ich 8Bit Daten von einem Atmega8 zu einem anderen zu 
schicken ich schick zu erst den zu Stand high oder low und etwas 
zeitversetz kommt dann das Taktsignal sobald dann High auf dem Takt bin 
anliegt wird der zustand von Bit 7 Bis Bit 0 nacheinander geschickt.

Das senden klappt auch nur das empfangen nicht so wirklich und ich weiß 
nicht warum

PORTB,1 ist für Daten
PORTB,2 ist für den Takt

Die Spannung ist bei beiden gleich weil ich keinen Optokoppler hab
bei dem emfang Atmega hab ich beide eingänge über 1K auf masse gezogen
damit kein falscher zustand entsteht.
1
.include "m8def.inc"
2
3
LDI R16,0x00    ;Register 16 mit 0 Laden
4
LDI r17,0xFF    ;Register 17 mit 255 Laden
5
OUT DDRD,r17    ;PORTD als ausgang setzen
6
OUT DDRB,R16        ;PORTB als eingang setzen
7
8
ldi R16, HIGH(RAMEND)            
9
out SPH, R16
10
ldi R16, LOW(RAMEND)             
11
out SPL, R16
12
13
P7H:      ;PORTD7
14
SBIS   PINB,1
15
RJMP  P7L
16
RCALL  Warten1
17
SBIS  PINB,2
18
RJMP  P7H
19
RCALL  Warten1
20
SBI    PORTD,7
21
RJMP  P6H
22
P7L:
23
SBIC  PINB,1
24
RJMP  P7H
25
RCALL  Warten1
26
SBIS  PINB,2
27
RJMP  P7L
28
RCALL  Warten1
29
CBI    PORTD,7
30
P6H:      ;PORTD6
31
SBIS   PINB,1
32
RJMP  P6L
33
RCALL  Warten1
34
SBIS  PINB,2
35
RJMP  P6H
36
RCALL  Warten1
37
SBI    PORTD,6
38
RJMP  P5H
39
P6L:
40
SBIC  PINB,1
41
RJMP  P6H
42
RCALL  Warten1
43
SBIS  PINB,2
44
RJMP  P6L
45
RCALL  Warten1
46
CBI    PORTD,6
47
P5H:      ;PORTD5
48
SBIS   PINB,1
49
RJMP  P5L
50
RCALL  Warten1
51
SBIS  PINB,2
52
RJMP  P5H
53
RCALL  Warten1
54
SBI    PORTD,5
55
RJMP  P4H
56
P5L:
57
SBIC  PINB,1
58
RJMP  P5H
59
RCALL  Warten1
60
SBIS  PINB,2
61
RJMP  P5L
62
RCALL  Warten1
63
CBI    PORTD,5
64
P4H:      ;PORTD4
65
SBIS   PINB,1
66
RJMP  P4L
67
RCALL  Warten1
68
SBIS  PINB,2
69
RJMP  P4H
70
RCALL  Warten1
71
SBI    PORTD,4
72
RJMP  P3H
73
P4L:
74
SBIC  PINB,1
75
RJMP  P4H
76
RCALL  Warten1
77
SBIS  PINB,2
78
RJMP  P4L
79
RCALL  Warten1
80
CBI    PORTD,4
81
P3H:      ;PORTD3
82
SBIS   PINB,1
83
RJMP  P3L
84
RCALL  Warten1
85
SBIS  PINB,2
86
RJMP  P3H
87
RCALL  Warten1
88
SBI    PORTD,3
89
RJMP  P2H
90
P3L:
91
SBIC  PINB,1
92
RJMP  P3H
93
RCALL  Warten1
94
SBIS  PINB,2
95
RJMP  P3L
96
RCALL  Warten1
97
CBI    PORTD,3
98
P2H:      ;PORTD2
99
SBIS   PINB,1
100
RJMP  P2L
101
RCALL  Warten1
102
SBIS  PINB,2
103
RJMP  P2H
104
RCALL  Warten1
105
SBI    PORTD,2
106
RJMP  P1H
107
P2L:
108
SBIC  PINB,1
109
RJMP  P2H
110
RCALL  Warten1
111
SBIS  PINB,2
112
RJMP  P2L
113
RCALL  Warten1
114
CBI    PORTD,2
115
P1H:      ;PORTD1
116
SBIS   PINB,1
117
RJMP  P1L
118
RCALL  Warten1
119
SBIS  PINB,2
120
RJMP  P1H
121
RCALL  Warten1
122
SBI    PORTD,1
123
RJMP  P0H
124
P1L:
125
SBIC  PINB,1
126
RJMP  P1H
127
RCALL  Warten1
128
SBIS  PINB,2
129
RJMP  P1L
130
RCALL  Warten1
131
CBI    PORTD,1
132
P0H:      ;PORTD0
133
SBIS   PINB,1
134
RJMP  P0L
135
RCALL  Warten1
136
SBIS  PINB,2
137
RJMP  P0H
138
RCALL  Warten1
139
SBI    PORTD,0
140
RJMP  END
141
P0L:
142
SBIC  PINB,1
143
RJMP  P0H
144
RCALL  Warten1
145
SBIS  PINB,2
146
RJMP  P0L
147
RCALL  Warten1
148
CBI    PORTD,0
149
END:
150
RJMP  END
151
152
;Warten Kurz
153
Warten1:
154
LDI R20,5
155
Ebene1:
156
DEC R20
157
BRNE Ebene1
158
ret
159
160
;Warten Lang
161
Warten2:
162
LDI  r22,6
163
Ebene10:
164
ldi     r21,255
165
Ebene20:
166
LDI     r20,255
167
Ebene30:
168
dec     r20
169
brne    Ebene30
170
dec     r21
171
brne    Ebene20
172
dec    r22
173
BRNE  Ebene10
174
ret

MFG Bqube

von Karl H. (kbuchegg)


Lesenswert?

Pierre Gnauck schrieb:
> Guten Tag,
> seid Tagen versuch ich 8Bit Daten von einem Atmega8 zu einem anderen zu
> schicken ich schick zu erst den zu Stand high oder low und etwas
> zeitversetz kommt dann das Taktsignal sobald dann High auf dem Takt bin
> anliegt wird der zustand von Bit 7 Bis Bit 0 nacheinander geschickt.

Aber doch hoffentlich, indem nach jedem Bit der Taktpin kurz auf 0 geht. 
Dann wird das nächste Bit auf den Ausgang gesetzt und der Taktpin geht 
wieder auf 1 um anzuzeigen, dass das Bit jetzt gültig ist.
>
> Das senden klappt auch nur das empfangen nicht so wirklich und ich weiß
> nicht warum
>
> PORTB,1 ist für Daten
> PORTB,2 ist für den Takt

Vereinfache das doch mal.
Schleifen und Schiebebefehle sind schon lange erfunden.
Dein Code ist durch die schiere Länge extrem unübersichtlich. Das alles 
kann man in weniger als 15 Zeilen Code ausdrücken (wenn man Schleifen 
benutzt)

  zählregister = 0
  ergebnis = 0

  Taktpin einlesen           <-----+  <---------+
  solange Taktpin gleich 0   ------+            |
                                                |
  Datenpin einlesen                             |
  ergebnis um 1 Stelle nach links schieben      |
  Datenpin als Bit 0 hineinverodern             |
                                                |
  Taktpin einlesen           <------+           |
  solange Taktpin gleich 1   -------+           |
                                                |
  zählregister inkrementieren                   |
  ist es auf 8?   nein -------------------------+

  ja! fertig

von Pierre G. (bqube)


Lesenswert?

So wie die warteschleifen unten die ich mit dem Stack benutze quasi dann 
auch das Lesen und schieben in solche schleifen reinpacken.

von Karl H. (kbuchegg)


Lesenswert?

Pierre Gnauck schrieb:
> So wie die warteschleifen unten die ich mit dem Stack benutze quasi dann
> auch das Lesen und schieben in solche schleifen reinpacken.

Mir sind ehrlich gesagt deine Warteschleifen schon nicht klar. Wenn du 
das richtig machst (synchrone Übertragung) dann brauchst du keine 
Warteschleifen, weil dir das Taktsignal sowieso sagt, wann das nächste 
Bit am Dateneingang bereitsteht.

von Pierre G. (bqube)


Lesenswert?

Ja schon richtig aber entweder ist nix passiert oder alle Led's waren 
high
Deswegen hab ich das mit dem warten gemacht. weil ich dachte das
Sich Vill codezeilen überschneiden oder so Bon halt ein wenig baff
Weil ich schon dachte das der Code recht simpel sei von
Der Logik her

MfG bqube

von Pierre G. (bqube)


Lesenswert?

Wie kann ich den einen wert Peer variable
Verändern.

Z.b
PORTD,1
PORTD,2 usw

Wollt ich so schreiben
.EQU PP=7
PORTD,PP

Wie kann ich nun den wert PP um eins verringern
So das PP=7 Net mehr 7 ist sondern 6 ?

MFG Bqube

von Karl H. (kbuchegg)


Lesenswert?

Pierre Gnauck schrieb:
> Wie kann ich den einen wert Peer variable
> Verändern.

du hast den Wert in einem Register stehen.
Und du kannst ein Register zb inkementieren (INC) oder dekrementieren 
(DEC).

>
> Z.b
> PORTD,1
> PORTD,2 usw
>
> Wollt ich so schreiben
> .EQU PP=7
> PORTD,PP
>
> Wie kann ich nun den wert PP um eins verringern
> So das PP=7 Net mehr 7 ist sondern 6 ?

  OUT PORTD, r15
  dec r15


Vielleicht mal ein paar Kapitel des
AVR-Tutorial
durcharbeiten. Das was du vorhast ist schon nicht mehr unbedingt 
trivial. Da solltest du eigentlich die Basics in Assembler schon drauf 
haben.

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.