Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
Das hat auch nichts mit dem I2Cinit zu tun sondern mit deiner zusätzlichen Do Loop.
Es kann nun mal nur eine Hauptschleife geben. Weitere Do Loop Schleifen haben dann eine Bedingung zum Beenden eingebaut.
Lass die einfach mal weg und schreibe nur Portb = 1.
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
Der Code ist der Originalcode von Michael aus 2017, mit dem Unterschied, daß ich einen Atmega16L und Michael einen Atmega32 verwendet hat. Die unterscheiden sich aber nur in der Größe des Ram. Grob jedenfalls, denke ich.
Der Code ohne meinen Loop läuft auch nicht. Ich habe sicherheitshalber noch einen Mega32 bestellt.
Wie bekommt man eine Code für den M32 in einen M16? Mit Pony "reingetreten" ?
Da stimmen die Stak Sprungadressen nicht und er landet im Nirwana.
Compilier mal mit $regfile = "m16def.dat" dann sollte es gehen.
mit dem Unterschied, daß ich einen Atmega16L und Michael einen Atmega32 verwendet hat.
Dann solltest du auch Atmega16 bei $regfile eintragen
Ab Zeile 7 kommt das Programm nochmal, sicher ein Kopierfehler.
Welche Bascom-Version verwendest du? (steht ganz obenin der Leiste im geöffneten Bascom)
Versuch bitte das nächste Mal, das Programm als Code hier anzuhängen, nicht als Text.
Beim Schreiben des Beitrags das Symbol </> in der Leiste über dem Beitrag nutzen.
@wolleausmallo
In der Abbildung aus Post #34 kann man erkennen, dass die PullUp's für den I2C-Bus mit 8,2 kOhm Widerständen realisiert sind.
Ich finde das reichlich hochohmig. Du solltest da 1k0 bis 2k2 Ohm verwenden.
Dann sehe ich im Code auch keine Angabe, mit welchem Takt der I2C-Bus betrieben werden soll.
Es fehlt eine Angabe wie
BASCOM-Quellcode
Config TWI =400000 ' 400kHz I2C-Clock
Es wurde bereits von Vorrednern gesagt, dass der Controller bei $RegFile falsch angegeben ist.
Das solltest du unbedingt berichtigen! Vielleicht ist das die Ursache, warum bei dir I2CInit hängt.
Richtige Angabe:
BASCOM-Quellcode: Controller korrekt angeben!
$RegFile="m16def.dat"
Beim Auslesen der Registerwerte für X, Y, und Z machst du auch einen Fehler.
Hier liest du in der Schleife 6 Bytes aus mir ACK, und dann liest du noch ein Byte (Byte 7), und speicherst das nochmal in Register(6).
Damit überschreibst du das 2. Byte von Ack_z.
Richtig muss es so lauten (Augenmerk auf Zeile 3, nur bis 5 zählen):
BASCOM-Quellcode
I2cstart
I2cwbyte R_addr ' Adresse I2C lesen
For Z =1To5 ' nur Byte1-5 lesen
I2crbyte Register(z) , Ack
Next
I2crbyte Register(6) , Nack ' Byte6 lesen
I2cstop
Dann gibt es noch eine Stelle im Programm, die da lautet:
BASCOM-Quellcode
Swap Acc_x 'die Register sind MSB first, AVR aber LSB first
Swap Acc_y
Swap Acc_z
Der Kommentar gibt an, dass die Reihenfolge der Bits gespiegelt ist.
Mit Swap wird aber nur unteres und oberes Nibble vertauscht.
Um die Bits zu spiegeln müsste Flip verwendet werden.
Wie die Bits jetzt rein kommen weiß ich nicht. Habe weder ins Datenblatt geschaut, noch habe ich den Sensor verfügbar.
Aber entweder ist der Kommentar falsch oder die Swap-Funktion muss durch Flip-Funktion ersetzt werden.
Soll mit dem Swap das Low-Byte mit dem High-Byte getauscht werden, wäre der Kommentar auch falsch.
Was auch gerne mal passiert, dass man Clock und Data vom Bus vertauscht anschließt. Das kannst du auch mal prüfen.
Der Kommentar gibt an, dass die Reihenfolge der Bits gespiegelt ist.
Mit Swap wird aber nur unteres und oberes Nibble vertauscht.
Um die Bits zu spiegeln müsste Flip verwendet werden.
MSB = most significant byte, LSB = least significant byte, es ist ja ein 2-Byte Wert.
Das Programm funktioniert ja auch so, oder warum muss es jetzt Flip sein?
Keine Fehlermeldung beim Brennen(V2.0.7.9) mit m32def.dat und STK500. sonst wäre es sogar mir aufgefallen. Hat nur länger gedauert. Den Code werde ich beim nächsten mal an richtiger Stelle </> einfügen.