Forum: Mikrocontroller und Digitale Elektronik I2C Slave mit Attiny2313 und Mega644 als Master Bascom


von Simon H. (simon24j)


Lesenswert?

Hallo zusammen,

schildere hier mal mein Problem da ich nun wirklich nicht mehr weiter 
weiß,

habe folgende Konstelation

Master Mega644P mit software I2C und 2 funktionierende Slaves PC8574

wollte jetzt noch einen Attiny2313 mit in den I2C bus einbinden und mir 
die Lib von Bascom gekauft für Slave
und dann mal das Beispielprogramm für den PCF8574 verwendet, aber sobald 
ich den Tiny mit der Mega verbinde steht das Program vom Tiny und der 
Mega reagiert nur noch sehr langsam und die 2 weiteren Slaves (Pc8574) 
sind ohne Funktion, also stört der Tiny den ganzen bus und bleibt selber 
auch noch stehen.

Ich habe alle AVR auf der selben Spannungsversorgung und mit 30cm 
Kabellänge sind die SCL und SDA Leitungen verbunden.
am Tiny SCL = PD4 SDA = PD2

was bedeutet in "Config I2cslave = &B01100000 , int = int0 , timer = 
Timer1" das int = ist das der int den jeder I2C Baustein hat, oder???? 
muss dieser zwingend verwendet werden?

hier mein Beispielcode den ich zum Testen verwende.
wenn ich das config I2Cslave auskommentiere läuft das Programm und ich 
kann die RC5 befehle übers Terminal sehen, sobald das drin ist geht 
nichts mehr. :-(
1
$regfile = "attiny2313.dat"
2
$crystal = 8000000
3
$baud = 19200                                               
4
$swstack = 10                                               
5
$framesize = 40                                             
6
$lib "mcsbyte.lbx"
7
8
9
Config Rc5 = Pind.6 , Timer = 0 , Wait = 2000
10
11
Dim Address As Byte ,
12
dim Command As Byte
13
14
Config I2cslave = &B01100000 , int = int1 , timer = Timer1 'H60 Int0 ist ja bereits vom SDA belegt oder sehe ich das falsch?????                      
15
16
Dim Bfake As Byte
17
18
Print "waiting for command"
19
Enable Interrupts
20
21
Do
22
23
Getrc5(address , Command)
24
25
If Address < 255 Then
26
27
    Command = Command And &B01111111
28
29
    Print Address ; "  " ; Command
30
31
End If
32
33
 Loop
34
35
36
I2c_master_needs_data:
37
waitms 10
38
_a1 = Command                                           
39
Return
40
41
42
I2c_master_has_data:
43
waitms 10
44
Bfake =_a1                                                                                              
45
Return

hoffe ihr habt nen Rat für mich

Grüße
Simon

von BASCOM-User (Gast)


Lesenswert?

Hallo,

in der BASCOM-Hilfe zu dem "Config"-Kommando und auch im zugehörigen 
Beispielprogramm ist doch alles beschrieben. Die Lib und das 
Beispielprogramm läuft NUR auf einem AT90Sxxxx (mit xxxx = 2313, 2323, 
etc; siehe Hilfe) mit den angegebenen Voraussetzungen (Controller ohne 
Hardware-I2C-Modul) und nur mit INT0 und Timer0. Also NICHT auf einem 
Tiny2313. Für andere Timer oder Int's müsste die Lib neu compiliert 
werden, und sie ist ungeeignet für Chips mit I2C-Hardware.

Der Tiny2313 hat ein USI-Interface, das man auch ohne BASCOM 
I2C-Slave-Library "zu Fuss", also durch Programmieren der USI-Register, 
für I2C (hier TWI genannt) als Slave initialisieren kann. Näheres dazu 
findet man im Tiny-Datenblatt.

von Simon H. (simon24j)


Lesenswert?

Gibt es dann für Bascom ein kleines Demo Programm wie man die Hardware 
TWI vom Tiny2313 "oder anderen die eine Hardware TWI haben" benutzt.

Ich würde gerne vom Tiny Werte mit dem Mega auslesen, wie ich sie mit 
dem Mega anfrage ist kein Problem aber was muss ich beim Tiny anstellen 
damit der auch die Werte sendet wenn sie vom Mega angefragt werden???

Danke

von Simon H. (simon24j)


Lesenswert?

Hallo,

hab jetzt mal folgenden Code versucht auf meinem Tiny2313 mit jeder 
menge Fehlermeldungen, sobald ich als AVR nen mega88 angebe compiliert 
Bascom es ohne Probleme :-(
1
$regfile = "attiny2313.dat"                                     
2
$crystal = 8000000                                          
3
$baud = 19200                                               
4
 
5
Print "MCS Electronics TWI-slave demo"
6
 
7
Config Twislave = &H70 , Btr = 1 , Bitrate = 100000 , Gencall = 1
8
Enable Interrupts
9
Do
10
  nop
11
Loop
12
End
13
Twi_stop_rstart_received:
14
  Print "Master sent stop or repeated start"
15
Return
16
 
17
 
18
Twi_addressed_goread:
19
  Print "We were addressed and master will send data"
20
Return
21
 
22
 
23
Twi_addressed_gowrite:
24
  Print "We were addressed and master will read data"
25
Return
26
Twi_gotdata:
27
   Print "received : " ; Twi
28
Return
29
Twi_master_needs_byte:
30
  Print "Master needs byte : " ; Twi_btr
31
  Twi = 65                                                 
32
Return
33
Twi_master_need_nomore_byte:
34
  Print "Master does not need anymore bytes"
35
Return

folgende Fehlermeldungen bekomme ich
Error : 7     Line :   47    IF THEN expected
Error : 7     Line :   47    IF THEN expected
Error : 222   Line :   47    Illegal character [expected (, got '' 
[DDR]]
Error : 222   Line :   47    Illegal character [expected (, got '' 
[DDR]]
Error : 7     Line :   47    IF THEN expected
Error : 7     Line :   47    IF THEN expected
Error : 46    Line :   47    Assignment error [TWSR: 0   0: 112]
Error : 46    Line :   47    Assignment error [TWBR: 0   32: 112]
Error : 46    Line :   47    Assignment error [TWAR: 0   112: 112]
Error : 46    Line :   47    Assignment error [TWCR: 0   &B01000101: 
112]
Error : 117   Line :   47    Unknown interrupt [TWI]

Line 47 = Config Twislave = &H70 , Btr = 1 , Bitrate = 100000 , Gencall 
= 1

kann mir da jemand nen Grund nennen?

Danke

von Klaus2m5 (Gast)


Lesenswert?

Klar, denn der Tiny2313 hat nur USI und nicht TWI.

von Simon H. (simon24j)


Lesenswert?

aha, was ist dann der unterschied zwischen USI und TWI? schön langsam 
steig ich da garnicht mehr durch.

was muss ich dann machen um den Tiny über i2C als slave ansprechen zu 
können?? über einen Beispielcode wäre ich sehr dankbar.

von Klaus 2. (klaus2m5)


Lesenswert?

Ohne Library (die ja ohnehin nicht funktioniert):
http://www.roboternetz.de/community/threads/22452-USI-interface-an-tiny-2313

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.