mikrocontroller.net

Forum: Compiler & IDEs I²C funktioniert nicht


Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

es ist jetzt schon nach Mitternacht und ich sitze immernoch an mein 
Problem fest.
Ich programiere einen AT90USB1287 mit CodeVisionAVR als Master. Als 
erstes würde ich gern einen IC per I²C-Schnittstelle ansprechen wollen. 
Nach dem Initialisieren meiner I2C gibt es immernoch keinen Takt auf der 
SCL Leitung. Lediglich gibt es nur eine kurze Flanke nach dem Erase bzw. 
Flashvorgang.
Ich vermute sehr stark, dass es an meinen Quelltext liegt, dass ich die 
I2C-Schnittstelle nicht richtig aktiviere, z.B. dass ein Register 
vergessen wurde zu setzen. Hat jemand vielleicht einen Vorschlag, dass 
er es mir mitteilen könnte?

Danke und gute Nacht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem die Funktionen i2c_xxxx() nicht mit dabei sind, bleibt nur die 
Kristallkugel:
Die CodeVisionAVR Lib macht eine Software-I2C. Diese Vermutung basiert 
auf den Zeilen
// I2C Bus functions
#asm
   .equ __i2c_port=0x0B; PORTD    
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>   // i2c der CodeVision-Bibliothek
und auf den Beitrag "CodeVision I2C Mega8"
und http://www.lmpforum.com/inforum/Hardware-I2c-twi-A...

Und du initialisierst zudem die Hardware-I2C Schnitte.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo vielen Dank, dass du mich auf der richtigen Spur gebracht hast!
Die Links enthalten aber nicht die Lösung des Problems.
Falls jemand ein ähnliches Problem hat, so habe ich es folgendermaßen 
hinbekommen, dass vor der main-Funktion diese Zeilen kommen:

// I2C Bus functions
#asm
   .equ __i2c_port=0x0B; PORTD
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>

Die ganzen Register für Two-Wire wie TWSR,TWBR,TWAR und TWCR sollten 
nicht gesetzt werden. Meine Vermutung ist, dass diese für Software-I²C 
dienen. In der main-Funktion dann kommt lediglich die Initialisierung:

i2c_init();

Womit ich mich gerade beschäftige ist die Geschwindigkeit der 
I²C-Schnittstelle. Mit den Oszi habe ich 44 kHz gemessen. Ob man diese 
Geschwindigkeit erhöhen kann, suche ich nach der Lösung.

Viele Grüße.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die ganzen Register für Two-Wire wie TWSR,TWBR,TWAR und TWCR sollten
>nicht gesetzt werden. Meine Vermutung ist, dass diese für Software-I²C
>dienen.

Nicht vermuten, Datenblatt lesen. Die sind für Hardware I2C.

>Womit ich mich gerade beschäftige ist die Geschwindigkeit der
>I²C-Schnittstelle. Mit den Oszi habe ich 44 kHz gemessen. Ob man diese
>Geschwindigkeit erhöhen kann, suche ich nach der Lösung.

Verabschiede dich von deinem Codegenerator und mach es zu Fuß
per Hardware. Und schon geht die Luzi ab.

Autor: Skittler Bruce (skittler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die Register sind Hardware Register der Hardware I2C.
Mit denen kannst du auf jeden Fall die Baudrate einstellen.
Die Hardware I2C Funktioniert auch ganz einfach. Schau dir mal die 
Register im Datenblatt an.

Die Software schnittstelle im codevision ist schlecht beschrieben. 
Baudrate konnte ich dort auch nicht verändern.

Gruß Skittler

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So zurück aus dem Urlaub und rein in I²C Probleme :-)

Ich hab seit gestern sehr viel probiert die Register wie ihr es 
vorgeschlagen habt zu setzen - ohne folgende Befehle:

// I2C Bus functions
#asm
   .equ __i2c_port=0x0B; PORTD
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm

stattdessen die Register setzen.

Leider bekomme ich eine Menge von Fehlermeldungen bei der .asm-Datei, 
die der Compiler selbst erzeugt.
Und zwar meint der Compiler bei allen Fehler:
undefined symbol: __i2c_port
undefined symbol: __i2c_scl_bit und
undefined symbol: __i2c_sda_bit

bestimmt weil ich die obigen Zuweisungen auskommentiert habe. Da das 
ganze in Assembler geschrieben ist, kann ich da nichts machen.

Es funktioniert wie gesagt nur bei der oben genannten Variante, wo ich 
die 44 kHz bekomme. Ich weiß nicht woher diese Frequenz herkommt. Egal 
ob ich gar kein Register von der 2Wire-Schnittstelle setze oder den 
Register TWBR setze, kommt trotzdem diese feste Frequenz. Bin schon 
lange am Überlegen aber keine Idee woran es liegt.

@ Skittler:
Weißt du wo die Source-Datei von i2c bei CodeVision ist? Ich finde nur 
die Header-Datei.
Wie hast du das im nachhinein gelöst? Wäre eine große Hilfe.

Viele Grüße

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.