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
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
So wie die warteschleifen unten die ich mit dem Stack benutze quasi dann
auch das Lesen und schieben in solche schleifen reinpacken.
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.
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
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
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.
|