-
Hallo zusammen,
ich kann mich oberen Meinungen nur anschließen...
Hab auch keine Slave lib. etc. und geht bei mir auch mit allem drum und dran...
Und unter "Bastlern": Wenn ich einen TWI-Slave brauche, spielen dann die 1,50 € eine Rolle die zwischen einem AT90s, einem Tiny oder einem AVR mit Hardware-Twi liegen?
Und interessierte finden (fast) immer was, für dieses (fast) dachte ich eigentlich sei dieses Forum.
MFG RP
-
Nö,die Kosten sind eher untertgeordnet solange man keine Massenproduktion anstrebt.
Was aber manchmal ne Rolle spielt ist die Größe.
90er und Tinys bekommt man auch als 8 Polige,die Megas fangen erst bei 28 Poligen Gehäusen an was auch als SMD manchmal schon zuviel platz kosten kann.
Da wünsch ich mir noch nen 8 oder 14 Poligen Mega.
Mal sehen,kommt vieleicht doch noch.
-
@linux_80
wie kann ich denn mit deinem Programm etwas über die RS232 Schnittstelle senden, damit ich sehe ob ich was empfangen kann?
Der Master sendet über die RS232 immer Error : 1
PS: also hab ich mir die Lib umsonst gekauft so wie ich das verstehe
-
Der Testaufbau für die oberen Programm ist dieser:
PC -> RS232 -> 1.Mega -> TWI -> 2.Mega -> anzeige auf LEDs
Wenn ich dem 1.Mega zahlen über RS232 eingebe, sendet dieser den Wert über TWI an den 2.Mega, dieser zeigt den Wert dann über PortD an den LEDs an, 8 Bit.
Beim Master wird noch ein Errorcode über RS232 ausgegeben, damit man sieht ob er den Wert senden konnte. 0 - OK, 1 - Fehler.
Was willst Du genau bauen, evtl. bekommen wir da was zusammen ?
schaumamoi
-
ich möchte später mal einen LCD und eine Tastatur an dem 2. atmega dran hängen und dies dann an den 1. atmega senden oder auch von diesem empfangen.
Jetzt will ich nur einmal eine Verbindung zwischen den wei atmega32 herstellen und dies irgendwie sichtbar machen.
Also wenn er mir error 1 sendet dann ist ein fehler aufgetreten.
Ich weis aber nicht was ich noch falsch mache.
Ich habe die zwei Atmega32 nach der Grundbeschaltung miteinander verbunden. http://www.robotikhardware.de/bilder...stepmega16.gif
Außerdem hab ich dein Programm auf atmega32 umgeschrieben und den PortD auf PortA
Das Byte B hab ich einfach mal auf 200 gesetzt damit ich nichts über die RS232 eingabe falsch machen kann. Das müsste doch so funktionieren oder?
Master:
Code:
' TWI Testprogramm aus der Hilfe (abgespeckt)
' mit PCF8574
'The chip will work in TWI/I2C master mode
'Connected is a PCF8574 8-bits port extender
$regfile = "M32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600 ' baud rate
$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
I2cinit ' we need to set the pins in the proper state
Config Twi = 100000 ' wanted clock frequency
Dim B As Byte
Print "TWI master"
Do
B = 200
I2csend &H40 , B ' send the value
Print B ;
Print " Error : " ;
Print Err ' show error status
Loop
End
Slave:
Code:
' TWI-slave test
' zum simulieren eines PCF8574
$regfile = "m32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600
Config Porta = Output ' kopletter PortD als Ausgang
Dim Twi_status As Byte
Dim Twi_data As Byte
Declare Sub Twi_init_slave
Declare Function Twi_wait() As Byte
Twi_data = 0
Call Twi_init_slave ' TWI aktivieren
' Hauptschleife
Do
Twi_status = Twi_wait()
If Twi_status = &H80 Then
Porta = Twi_data ' Daten auf PortD ausgeben
End If
Loop
End
' Unterprogramme
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twcr = &B00000100 ' erstmal nur TWI aktivieren
Twar = &H40 ' Slaveadresse setzen
Twcr = &B01000100 ' dann ACK einschalten
End Sub
' schauen ob was gekommen ist, Status zurückgeben, Daten in globale variable
Function Twi_wait() As Byte
Local Twcr_local As Byte
Twi_wait = &HF8
' warten bis TWINT gesetzt ist
Twcr_local = Twcr And &H80
If Twcr_local = &H80 Then
Twi_data = Twdr ' Daten sichern
Twi_wait = Twsr And &HF8 ' status zurückgeben
Twcr = Twcr Or &B10000000 ' TWINT löschen, erzeugt ACK
End If
End Function
-
jetzt funktionierts ich hab im compiler die I2C SLC und SDA Port eingestellt. Jetzt müsste ich halt nur noch vom Slave aus senden können. brauch ich die zwei Pullups an SDA und SCL auch?
-
Die Pullups insgesamt einmal pro Leitung, egal wo.
Funktionierts mit der Lib oder mit dem Testprogramm ?
Wenn der Slave senden soll, muss man in Twi_wait() nur den richtigen Status abfragen und darauf reagieren, dH. mind. ein Byte zurücksenden.
Jetzt wird nur das angekomme Byte gesichert.
-
Ich habe dein Programm hergenommen und das funktioniert.
Wie geb ich da den Status in Twi_wait ein?
Was muss ich da im Master eingeben damit der empfangen kann?
Gibt es da auch gute Bücher oder im Internet Hilfethemen wo man das etwas nachlesen kann, denn ich steige in dieses Gebiet erst ein.
-
Du kanst Dir die Datenblätter von Atmel angucken, zuerst die des Mega32, dann gibts ein paar AppNotes und zwar u.a. AVR311.
guckst Du hier:
http://www.atmel.com/dyn/products/ap...?family_id=607
dann nach TWI suchen, und PDF und Zip runterladen und aufsaugen :-)
Für Bascom dann etwas umbauen, denn die Beispiele sind in C und ASM, das sollte aber nicht das Problem sein.
-
ob mir diese datenblätter von atmel etwas helfen weis ich noch nicht. C sieht ja wieder ganz anderst als Bascom aus. Findest du dass das AVR Lehrbuch von Roland Walter einige Informationen enthält, die mir weiter helfen können? ich hab ja schon das AVR Risk Mikrokontroller, doch da steht nicht viel über TWI drin.