mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten einlesen


Autor: Pierre Gnauck (bqube)
Datum:

Bewertung
0 lesenswert
nicht 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.
.include "m8def.inc"

LDI R16,0x00    ;Register 16 mit 0 Laden
LDI r17,0xFF    ;Register 17 mit 255 Laden
OUT DDRD,r17    ;PORTD als ausgang setzen
OUT DDRB,R16        ;PORTB als eingang setzen

ldi R16, HIGH(RAMEND)            
out SPH, R16
ldi R16, LOW(RAMEND)             
out SPL, R16

P7H:      ;PORTD7
SBIS   PINB,1
RJMP  P7L
RCALL  Warten1
SBIS  PINB,2
RJMP  P7H
RCALL  Warten1
SBI    PORTD,7
RJMP  P6H
P7L:
SBIC  PINB,1
RJMP  P7H
RCALL  Warten1
SBIS  PINB,2
RJMP  P7L
RCALL  Warten1
CBI    PORTD,7
P6H:      ;PORTD6
SBIS   PINB,1
RJMP  P6L
RCALL  Warten1
SBIS  PINB,2
RJMP  P6H
RCALL  Warten1
SBI    PORTD,6
RJMP  P5H
P6L:
SBIC  PINB,1
RJMP  P6H
RCALL  Warten1
SBIS  PINB,2
RJMP  P6L
RCALL  Warten1
CBI    PORTD,6
P5H:      ;PORTD5
SBIS   PINB,1
RJMP  P5L
RCALL  Warten1
SBIS  PINB,2
RJMP  P5H
RCALL  Warten1
SBI    PORTD,5
RJMP  P4H
P5L:
SBIC  PINB,1
RJMP  P5H
RCALL  Warten1
SBIS  PINB,2
RJMP  P5L
RCALL  Warten1
CBI    PORTD,5
P4H:      ;PORTD4
SBIS   PINB,1
RJMP  P4L
RCALL  Warten1
SBIS  PINB,2
RJMP  P4H
RCALL  Warten1
SBI    PORTD,4
RJMP  P3H
P4L:
SBIC  PINB,1
RJMP  P4H
RCALL  Warten1
SBIS  PINB,2
RJMP  P4L
RCALL  Warten1
CBI    PORTD,4
P3H:      ;PORTD3
SBIS   PINB,1
RJMP  P3L
RCALL  Warten1
SBIS  PINB,2
RJMP  P3H
RCALL  Warten1
SBI    PORTD,3
RJMP  P2H
P3L:
SBIC  PINB,1
RJMP  P3H
RCALL  Warten1
SBIS  PINB,2
RJMP  P3L
RCALL  Warten1
CBI    PORTD,3
P2H:      ;PORTD2
SBIS   PINB,1
RJMP  P2L
RCALL  Warten1
SBIS  PINB,2
RJMP  P2H
RCALL  Warten1
SBI    PORTD,2
RJMP  P1H
P2L:
SBIC  PINB,1
RJMP  P2H
RCALL  Warten1
SBIS  PINB,2
RJMP  P2L
RCALL  Warten1
CBI    PORTD,2
P1H:      ;PORTD1
SBIS   PINB,1
RJMP  P1L
RCALL  Warten1
SBIS  PINB,2
RJMP  P1H
RCALL  Warten1
SBI    PORTD,1
RJMP  P0H
P1L:
SBIC  PINB,1
RJMP  P1H
RCALL  Warten1
SBIS  PINB,2
RJMP  P1L
RCALL  Warten1
CBI    PORTD,1
P0H:      ;PORTD0
SBIS   PINB,1
RJMP  P0L
RCALL  Warten1
SBIS  PINB,2
RJMP  P0H
RCALL  Warten1
SBI    PORTD,0
RJMP  END
P0L:
SBIC  PINB,1
RJMP  P0H
RCALL  Warten1
SBIS  PINB,2
RJMP  P0L
RCALL  Warten1
CBI    PORTD,0
END:
RJMP  END

;Warten Kurz
Warten1:
LDI R20,5
Ebene1:
DEC R20
BRNE Ebene1
ret

;Warten Lang
Warten2:
LDI  r22,6
Ebene10:
ldi     r21,255
Ebene20:
LDI     r20,255
Ebene30:
dec     r20
brne    Ebene30
dec     r21
brne    Ebene20
dec    r22
BRNE  Ebene10
ret

MFG Bqube

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pierre Gnauck (bqube)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pierre Gnauck (bqube)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pierre Gnauck (bqube)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.