www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei TWI Modul mit Atmega8 nötig


Autor: Tim Müller (astarot)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei für die Schule ein AVR Projekt auf die Beine zu 
stellen und bin in der ganzen Materie noch ziemlich unsicher (weil ich 
noch blutiger Anfänger bin). An C- gehe ich vorerst nicht ran und will 
erstmal sie Sache mit dem Assembler versuchen.

Es geht im Prinzip darum eine I2C Kommunikation mit einem 
Temperatursensor (LM75) aufzubauen.
Im ersten Schritt soll es erstmal um eine "Hardware TWI" mit nem Atmega8 
gehen, die dann (der Portierbarkeit wegen) später wenn ich alles 
verstanden habe, per Software TWI "nachgebaut" werden soll. Um dann auf 
nem 8051 (den wir in der Schule verwenden) ebenfalls lauffähig zu sein. 
Aber das  kommt dann erstmal später.

Ich habe es einfach mal versucht mit dem Datasheet und einigen 
Forenbeiträgen auf einen hoffentlich brauchbaren Quellcode zu kommen.

Ich habe allerdings ein Problem mit dem "Empfangen" von Daten und weiß 
beim besten Willen nicht ob die Routine so funktioniert wie ich sie 
aufgebaut habe.

Der LM75A sendet (lt. Datasheet) eine Antwort die 9 Bit lang ist, ich 
finde aber nirgends einen Hinweis der mir sagt wie ich die führende 0/1 
für die 2er Komplement Darstellung Puffern kann, da ja mein 
Empfangsregister nur 8 Bit "breit" ist.

Wenn mir da jemand weiterhelfen könnte wäre ich mehr als dankbar, ich 
habe die letzten Tage so viele Forenbeiträge und Suchergebnisse 
durchforstet das ich mittlerweile blind bin.

Vielen Dank im Voraus ;-)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
correct:
  push r16    ;R16 auf dem Stack sichern
  in   r16, twcr  ;twcr einlesen
  sbrs r16, twint ;skip if bit in register is set >> warten ob 
startbedingung
  rjmp correct  ;gesendet wurden

Wie oft möchtest du r16 denn hier per rjmp pushen?

Autor: Tim Müller (astarot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger,

leider weiß ich grad nicht so genau was du damit meinst... Habbich da 
nen Bock drin ??

mfg

Tim

Autor: Tim Müller (astarot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Iss mir nü auch aufgefallen :-) grins
Daran erkennt man den Anfänger....

Ich schätze mal das ich mir damit den Stack bis Oben hin zugemüllt hätte 
;-)

Habe nur versucht den Ratschlag aus dem AVR Tutorial zu beherzigen und 
jede Funktion die Register sichern zu lassen.

mfg

Tim

Autor: Tim Müller (astarot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir keiner weiterhelfen??

mfg

Tim

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der LM75A sendet (lt. Datasheet) eine Antwort die 9 Bit lang ist, ich
> finde aber nirgends einen Hinweis der mir sagt wie ich die führende 0/1
> für die 2er Komplement Darstellung Puffern kann, da ja mein
> Empfangsregister nur 8 Bit "breit" ist.

Du kannst ein weiteres Register oder eine Speicherstelle für dieses Bit 
opfern. Wenn es ganz kurzzeitig ist und absolut kein anderer Platz mehr 
vorhanden ist, könnte man auch ein Flag dafür nehmen z.B. Carry-Flag. 
Das ist aber eher keine Anfängerlösung.

Autor: Tim Müller (astarot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Register > also Platz ist erstmal reichlich vorhanden. Also muss ich das 
TWDR nur nochmal auslesen und in ein zweites Register verschieben.

Würde denn meine bisherige Routine überhaupt funktionieren ???

mfg

Tim

Autor: Tim Müller (astarot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe nochmal die letzten Gehirnwindungen ans laufen gebracht.

Wenn ich vom LM75 das erste Byte empfangen habe, rufe ich die 
Daten_empfangen_Ack: Routine auf.

Nach dem zweiten Byte rufe ich die Daten_empfangen_Nack: Routine auf um 
die Übertragung zu beenden.

Ist meine Reihenfolge der Befehle So richtig??

Daten_empfangen_Ack:
  ldi r16, TWDR      ;Daten aus dem TWDR in Register 16 schieben
  mov DATA_RXD2, r16    ;anschließend im Data_RXD ablegen
  ldi r16, (1<<TWINT) | (1<<TWEN) | (1<<TWEA)  ;Twint bit löschen (high 
setzen) um die Übertragung zu starten + Acknowledge senden
  out TWCR, r16

  rcall correct      ;abfrage ob die Routine abgearbeitet wurde
  ret


Daten_empfangen_Nack:
  ldi r16, TWDR      ;Daten aus dem TWDR in Register 16 schieben
  mov DATA_RXD1, r16    ;anschließend im Data_RXD ablegen
  ldi r16, (1<<TWINT) | (1<<TWEN)  ;Twint bit löschen Übertragung zu 
starten
  out TWCR, r16

  rcall correct      ;abfrage ob die Routine abgearbeitet wurde
  ret


Mfg

Tim

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, kann ich dir nicht helfen. Das habe ich noch nicht gemacht und 
ich habe keinen LM75 zur Hand. Ich würde mir ansehen:

AVR315: Using the TWI module as I2C master
http://www.atmel.com/dyn/resources/prod_documents/...

AVR TWI und AT91-TWI

Ist zwar alles C-Code, aber die Reihenfolge der Kommunikation erkennt 
man daraus.

In ASM gibt es noch Beitrag "TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8"

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.