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
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
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
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
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
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.
Hi
>die zip's helfen mir leider nichts arbeite in bascom
Schön, das du jetzt damit heraus rückst.
MfG Spess
>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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.