PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardware I2C bei M16 in Bascom



sam86
02.10.2004, 20:44
Hallo Leute,

wie spricht man den I2C-Bus von einem ATMega16 in Bascom an?

Die Slave-Beispiele von Bascom funktionieren nur mit den kleineren AVR's.

In den Bascom-Hilfe-Dateien steht, dass man beim M16 den
Hardware-I2C verwenden soll, was ja auch sinnvoll wäre.
Doch wie spricht man ihn an, ich finde dafür leider nur
Assembler-Beispiele.

Bin dankbar für jede Hilfe.

mfg

sam86

Florian
02.10.2004, 20:50
Hi sam86!
Wo hast Du die ganzen Assembler-Beispiele gefunden?
Ich finde nämlich kaum welche! :o(
Für Bascom findest Du was in der Artikelliste ganz oben! :o)
TWI!

tobimc
02.10.2004, 20:51
HI!

Habe auch gerade ein Problem mit dem I²C und dem Mega16.
Kann es sein dass das NUR auf diesen Pins funktioniert??

Viele Grüße,
Tobi

Frank
02.10.2004, 21:18
Auf welchen PIN´s der I2C Bus liegt kann in Bascom ja frei gewählt werden. Derzeit wird nicht der Hardware I2C-Bus genutzt, vemutlich ist dies aber ab der nächsten Version der Fall.
Momentan kannst du die Bascom I2C Befehle mit beliebigen PIN´s nutzen. DIe PIN´s kannst du so einstellen:

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1

tobimc
02.10.2004, 21:27
HI Frank!

Ich habe das so gemacht, aber es kommt laut Speicheroszilloskop nix raus! Pullups usw...

Mein Quellcode:


Config Sda = Porta.0 'I²C SDA
Config Scl = Porta.1 'I²C SCL



Beep Alias Portd.2

595dat Alias Portc.6
595takt Alias Portc.1
595act Alias Portc.0

165dat Alias Pinc.7 '!!WICHTIG: Beim EINLESEN IMMER PinX.Y
165takt Alias Portb.1
165act Alias Portb.0

'===FUNKTIONEN===
Declare Function 595akt() As Byte
Declare Function Get165() As Byte

Declare Function Send_to_slave() As Byte
Declare Function Slv_input() As Byte

Declare Function Errorbeep(byval Number As Byte) As Byte
Declare Function Sirene(byval Oft As Byte) As Byte

Declare Function Rechts_vor() As Byte
Declare Function Rechts_rueck() As Byte
Declare Function Rechts_stop() As Byte

Declare Function Links_vor() As Byte
Declare Function Links_rueck() As Byte
Declare Function Links_stop() As Byte

Declare Function Beide_vor() As Byte
Declare Function Beide_rueck() As Byte
Declare Function Beide_stop() As Byte
Declare Function Beide_links() As Byte
Declare Function Beide_rechts() As Byte

Declare Function Mstop() As Byte

'===VARIABLEN===

Dim A As Byte
Dim B As Byte
Dim D As Byte
Dim E As Byte
Dim Tmpink As Byte

Dim 165pinstate(2) As Byte
Dim 595pinout(3) As Byte

Dim F As Byte
Dim S As Byte
Dim Actualslaveip As Byte
Dim Stscom As String * 4

Const 595online = 2 + 1
Const 165online = 1 + 1

'===PROGRAMMBEGINN===

Begin:

595act = 0 'activate '595 auf null
595takt = 0 'takt
595dat = 0 'data

165act = 1 'activate '595 auf null
165takt = 0 'takt

S = Asc( "s" ) 'S für success
F = Asc( "f" ) 'f für failure

595pinout(2) = 0 '595er auf null
595pinout(3) = 0
A = 595akt()

Sound Beep , 250 , 1000 'Ein bisschen gepiepse zum Anfang...
Sound Beep , 250 , 900
Sound Beep , 250 , 800
Sound Beep , 500 , 500


Starting:

A = Sirene(3) 'IICCCCCCCCCCHHHHHHHHHHH KKKOOOOOOMMMMMMMMMMMMMMMMMMMMMMMMMMEEEEEEEE!!

Waitms 500 'Watren


'====Eigentlicher PROGRAMMSTART====


Source: 'TESTPROGRAMM

B = &B01110001 'Addresse des Datenchip Daten
D = &B01110011 'steuer

I2cstart
I2cwbyte D
I2cwbyte &B00000000
I2cstop

Waitms 25

I2cstart
I2cwbyte B
I2cwbyte &B00001100
I2cstop

Waitms 25

I2cstart
I2cwbyte D
I2cwbyte &B10000000
I2cstop

Waitms 25

I2cstart
I2cwbyte D
I2cwbyte &B00000000
I2cstop

Waitms 25

I2cstart
I2cwbyte B
I2cwbyte 97
I2cstop

Waitms 25

I2cstart
I2cwbyte D
I2cwbyte &B10000000
I2cstop

Waitms 25

I2cstart
I2cwbyte D
I2cwbyte &B00000000
I2cstop

End 'ENDE!!

Ich weis, es gibt dieses Codefenster, aber ich find's so übersichtlicher...

Zu den Pins kommt absolut nada raus. Meine Pullups sind 5,6kOhm.

Achso, ich steure damit 2 PCF8574P an. Das ist ein LCD wie auf
http://www.destroy-yourself.de/julian/juliprograms/amr/i2clcd.htm

Ich schätze, dass es irgendwie an der Programmierung liegt, aber...
Ihr kennt euch da besser aus. Bin I²C Noob.

Viele liebe Grüße,
Tobi

avatar
02.10.2004, 21:29
fehlt da nicht der i2cinit ???

tobimc
02.10.2004, 21:38
Hi!

Siehe PM... keine Ahnung! das Buch das ich habe, ist dazu etwas ungeeignet.

Viele liebe Grüße, Tobi

sam86
03.10.2004, 09:10
Hi!
@Florian: Die Asm-Beisp. waren im Datenblatt vom M16.
Für den Master müssten doch die Befehle I2csend und I2creceive funktionieren. Doch die Bascom-Beispiele für den Slave funktionieren nicht mit dem M16. Der Compiler meldet dann, dass das I2C-Library nicht mit dem M16 funktioniert.

Florian
03.10.2004, 09:18
Hi sam86!
Danke für den Tipp, da ich derzeit nur den Mega8 benutze, habe ich das völlig übersehen!

Danke nochmals! :o)

sam86
03.10.2004, 09:46
Hi,
vielleicht sollte ich meine Frage mal anders formulieren:
Wenn die BasCom-Hife meint, ich soll die "harware I2C implementation" verwenden, dann heißt das doch, dass ich die Steuerregister setzen und die Interupts verwalten soll.
Blos wie kann ich in BasCom die Register setzen und die Interrupts verwalten?

Frank
03.10.2004, 12:43
In Bascom kann man ganz genauso wie in C auf alle Register direkt zugreifen. Die Syntax ist sogar nahezu gleich.
Aber das wäre im Falle von TWI etwa sfür den erfahreneren AVR Programmierer. Ich würde zu den Bascom I2C Befehlen raten.

Bezüglich oberen Problem bitte auch Thread https://www.roboternetz.de/phpBB2/viewtopic.php?t=3742 beachten

sam86
03.10.2004, 14:32
OK. Wird wohl im Moment die beste Lösung sein.
Die Master-Samples gehn einwandfrei.
Blos beim Slave-Beispiel kommt die Fehlermeldung, dass er die "I2CSLAVE.LBX" nicht findet, und sie ist auch nicht im LIB-Verzeichnis.

sam86
03.10.2004, 19:30
ot