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 ;-)
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?
Hallo Holger, leider weiß ich grad nicht so genau was du damit meinst... Habbich da nen Bock drin ?? mfg Tim
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
> 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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.