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


von Tim M. (astarot)


Angehängte Dateien:

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 ;-)

von holger (Gast)


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?

von Tim M. (astarot)


Lesenswert?

Hallo Holger,

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

mfg

Tim

von Tim M. (astarot)


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

von Tim M. (astarot)


Lesenswert?

Kann mir keiner weiterhelfen??

mfg

Tim

von Stefan B. (Gast)


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.

von Tim M. (astarot)


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

von Tim M. (astarot)


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

von Stefan B. (Gast)


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/doc2564.pdf

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"

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.