Forum: Mikrocontroller und Digitale Elektronik I2C für Anfänger


von Christoph (Gast)


Lesenswert?

Hallo zusammen,

Ich habe mir mal wieder das thema bascom vorgenommen aber beim i2c 
scheiterts und egal wie lange ich schon in google und in foren gesucht 
habe ich werde nicht schlau.


Ich möchte von einem mega8-16pu zu einem anderen mega8-16pu eine 
dreistellige zahl schicken. die ich dann im 2. also im slave auswerte.

Jetzt scheiterts aber beim i2c

kennt jmd ein EINFACHES I2c Beispiel script das ich mir mal einverleiben 
kann?



Danke schonmal für euere Hilfe


Christoph

von Icke ®. (49636b65)


Lesenswert?

Christoph schrieb:
> kennt jmd ein EINFACHES I2c Beispiel script das ich mir mal einverleiben
> kann?

Naja, wirklich einfach ist das nicht, außer hinterher, wenn man es 
begriffen hat. Ich hatte auch einige Beispielprogramme angeschaut, bin 
dann jedoch mit der Beschreibung im Datenblatt des ATmega am besten klar 
und letztendlich zum Ziel gekommen.

Nachtrag:
Die Kommunikation zwischen zwei µCs ist als Einstieg in I2C nicht 
empfehlenswert, da zuviel Fehlerpotential besteht. Nimm zuerst was 
einfacheres, z.B. eine DS1307 auslesen.

: Bearbeitet durch User
von Christoph S. (christoph_s94)


Lesenswert?

hey

ich weiß dass das nicht einfach ist aber mit einem sample dass ich erst 
einmal nur eine 1 oder eine 0 übertragen kann wäre mir schon sehr 
geholfen!

Hat jmd bitte in sample code für mich?P


lg christoph

von Spess53 (Gast)


Lesenswert?

Hi

>ich weiß dass das nicht einfach ist aber mit einem sample dass ich erst
>einmal nur eine 1 oder eine 0 übertragen kann wäre mir schon sehr
>geholfen!

Ich glaube du solltest dich erst mal über I2C schlau machen:

Absolutes Muss:
http://www.nxp.com/documents/user_manual/UM10204.pdf

Außerdem Datenblatt vom ATmega8 ab S.157:

Master, Beschreibung und Software:
http://www.atmel.com/Images/doc2564.pdf
http://www.atmel.com/Images/AVR311.zip

Slave, Beschreibung und Software:
http://www.atmel.com/Images/doc2565.pdf
http://www.atmel.com/Images/AVR311.zip

Lies das alles erst mal durch und entscheide dann, ob du es noch machen 
willst.

MfG Spess

von Christoph S. (christoph_s94)


Lesenswert?

danke für die antwort
aber ich bleib dabei =)) bin sturr ich weiß

die zip's helfen mir leider nichts arbeite in bascom




hab selber versucht was zu basteln funzt aber nicht


Master
1
' TWI Testprogramm aus der Hilfe (abgespeckt)
2
' mit PCF8574
3
4
'The chip will work in TWI/I2C master mode
5
'Connected is a PCF8574 8-bits port extender
6
7
$regfile = "M8adef.dat"                                     ' the used chip
8
$crystal = 16000000                                         ' frequency used
9
$baud = 9600                                                ' baud rate
10
11
$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
12
13
14
15
Config Scl = Portc.5
16
Config Sda = Portc.4
17
18
19
20
Config Twi = 100000                                         ' wanted I2C clock frequency
21
Twcr = &H80                                                 ' TWEN
22
23
Dim B As Byte
24
25
Do
26
27
28
  B = 1
29
  Input B
30
  I2csend &H80 , B                                          ' send the value
31
  Print B ;
32
  Print " Error : " ;
33
  Print Err
34
35
  Waitms 50
36
37
  B = 0
38
  Input B
39
  I2csend &H80 , B                                          ' send the value
40
  Print B ;
41
  Print " Error : " ;
42
  Print Err
43
44
  Waitms 50
45
                                                   ' show error status
46
Loop
47
End


Slave
1
' TWI-slave test
2
' zum simulieren eines PCF8574
3
4
$regfile = "m8adef.dat"                                      ' the used chip
5
$crystal = 7372800                                          ' frequency used
6
7
8
Config Scl = Portc.5
9
Config Sda = Portc.4
10
11
12
13
Config Portb.1 = Output                                     ' kopletter PortD als Ausgang
14
Config Portb.1 = 0
15
16
17
18
Dim Twi_status As Byte
19
Dim Twi_data As Byte
20
21
Declare Sub Twi_init_slave
22
Declare Function Twi_wait() As Byte
23
24
Twi_data = 0
25
Call Twi_init_slave                                         ' TWI aktivieren
26
27
' Hauptschleife
28
Do
29
    Twi_status = Twi_wait()
30
    If Twi_status = &H80 And Twi_data = 1 Then
31
        Portb.1 = 0                                         ' Daten auf PortD ausgeben
32
    End If
33
    waitms 10
34
35
    Twi_status = Twi_wait()
36
    If Twi_status = &H80 And Twi_data = 0 Then
37
        Portb.1 = 1                                         ' Daten auf PortD ausgeben
38
    End If
39
    Waitms 10
40
41
42
Loop
43
44
End
45
46
' Unterprogramme
47
48
' TWI als slave aktivieren
49
Sub Twi_init_slave
50
    Twsr = 0                                                ' status und Prescaler auf 0
51
    Twdr = &HFF                                             ' default
52
    Twcr = &B00000100                                       ' erstmal nur TWI aktivieren
53
    Twar = &H80                                             ' Slaveadresse setzen
54
    Twcr = &B01000100                                       ' dann ACK einschalten
55
End Sub
56
57
' schauen ob was gekommen ist, Status zurückgeben, Daten in globale variable
58
Function Twi_wait() As Byte
59
    Local Twcr_local As Byte
60
    Twi_wait = &HF8
61
    ' warten bis TWINT gesetzt ist
62
    Twcr_local = Twcr And &H80
63
    If Twcr_local = &H80 Then
64
        Twi_data = Twdr                                     ' Daten sichern
65
        Twi_wait = Twsr And &HF8                            ' status zurückgeben
66
        Twcr = Twcr Or &B10000000                           ' TWINT löschen, erzeugt ACK
67
    End If
68
69
End Function

fällt euch ein fehler auf?

: Bearbeitet durch User
von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Hallo

Also hier habe ich ein I2C Beispiel in Bascom mit zwei Attiny45:
Der Master sendet den Wert 4 per I2C an den Slave. Der Slave addiert 20 
dazu, und der Master liest den Wert wieder vom Slave. Der Wert wird nun 
vom Master per RS232 ausgegeben und sollte nun 24 sein.

Der Master verwendet das Software I2C von Bascom. Der Slave verwendet 
das Hardware USI interface.

ACHTUNG: In der ISR "I2c_read_write" vom Slave, wird das SREG nicht 
gespeichert, wenn man nun das Beispiel mit eigenem Code erweitert, 
können plötzlich komische Fehler auftreten.

Für ein anderes Projekt habe ich den Code weiterentwickelt, unter 
anderem wird auch das SREG gespeichert. Wenn nun Interesse besteht, kann 
ich das Beispiel auf die aktuelleste Version anpassen.

von Spess53 (Gast)


Lesenswert?

Hi

>die zip's helfen mir leider nichts arbeite in bascom

Schön, das du jetzt damit heraus rückst.

MfG Spess

von katastrophenheinz (Gast)


Lesenswert?

>fällt euch ein fehler auf?
Ja, zuviele potentielle Fehlerquellen in deinem Beispielcode und keine 
Chance, die zu finden. So wird das nichts. Keine Ahnung, was deine lib 
da macht, aber ich sehe nirgendwo Debug-Output, z.B. mal zwischendurch 
das TWSR ausgeben, ganz zu schweigen von definiertem Verhalten im 
Fehlerfall.

Warum beherzigst du nicht Icke's Tip von oben und nimmst erstmal einen 
i2c-Slave, von dem du weißt das er funktioniert? Damit kannst du die 
möglichen Fehlerquellen schon mal um 50% reduzieren.

Auch oben schon gesagt: TWI ist die Komponente im AVR, die die höchste 
Komplexität mitbringt. Das ist nicht mal eben kurz hinprogrammiert wie 
z.B. LED-Blinken oder UART-Echo. Du kommst um das Lesen und Verstehen 
des AVR-Manuals und der Application Notes nicht drum rum, und sei es 
nur, um festzustellen, dass du die PullUps vergessen hast.


Gruss, Heinz

von Bernd T. (bastelmensch)


Lesenswert?

Spess53 schrieb:
> Hi
>
>>die zip's helfen mir leider nichts arbeite in bascom
>
> Schön, das du jetzt damit heraus rückst.
>
> MfG Spess

Steht schon im Eröffnungsbeitrag das er was mit Bascom macht.

von Klaus (Gast)


Lesenswert?

Spess53 schrieb:
>>die zip's helfen mir leider nichts arbeite in bascom
>
> Schön, das du jetzt damit heraus rückst.

daß die .zips nicht für bascom taugen, hat er schnell rausgefunden. Aber 
daß du einen Link auf die I2C Spec in Mandarin gepostet hast, ist ihm 
nicht aufgefallen. Das merkt man erst beim Lesen :-(

MfG Klaus

von Spess53 (Gast)


Lesenswert?

Hi

>Aber daß du einen Link auf die I2C Spec in Mandarin gepostet hast, ist ihm
>nicht aufgefallen.

Eigentlich gibt es das Dokument nur noch in Nihongo. In Mandarin kenne 
ich es nicht. Vielleicht deute ich aber als Handyverweigerer nur deinen 
Smilie falsch. Bei mir erscheint der Link in gutem Englisch.

MfG Spess

von Klaus (Gast)


Lesenswert?

Spess53 schrieb:
> Vielleicht deute ich aber als Handyverweigerer nur deinen
> Smilie falsch.

Ich hab mir den auch erst ergoogelt.

Was ist ein Handy? Ist das diese merkwürdige Leuchte, mit der sich vor 
allem Radfahrerinnen nachts ihre Gesichter anstrahlen? </ironie>

diesmal klassisch
MfG Klaus

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.