Forum: Compiler & IDEs I²C funktioniert nicht


von Gast (Gast)


Angehängte Dateien:

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
1
// I2C Bus functions
2
#asm
3
   .equ __i2c_port=0x0B; PORTD    
4
   .equ __sda_bit=1
5
   .equ __scl_bit=0
6
#endasm
7
#include <i2c.h>   // i2c der CodeVision-Bibliothek
und auf den Beitrag "CodeVision I2C Mega8"
und http://www.lmpforum.com/inforum/Hardware-I2c-twi-Atmeg-t3706.html

Und du initialisierst zudem die Hardware-I2C Schnitte.

von Gast (Gast)


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.

von holger (Gast)


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.

von Skittler B. (skittler)


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

von Gast (Gast)


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

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.