Wie kommt das (master)Programm jemals aus "prg1" wieder raus ?Code:Prg1: If Poweron = 1 Then .... Goto Prg1 Else Portf.1 = 0 Return End If
Hallo alle Zusammen,
Nachdem ich nun schon seit ein paar Tagen dieses Forum nach einer Lösung durchforste, diese aber nicht finde muß ich hier meine Frage
loswerden:
Mein Master ist ein Mega128, mit dem habe ich eigentlich kein Problem,
dieser sendet brav seine I2C Kommandos wie ich mit dem Oszi sehen
kann.
Der Slave ist das Problem, ich hab die Slave Library von MCS gekauft,
und auf einen Tiny13 ein Programm geschrieben, wenn ich das Programm
auf dem Master starte funktioniert der erste Slave einmal, danach sind alle Slaves tot, der I2C-Bus aber nicht, der sendet brav weiter, wie oben schon erwähnt. Der Slave muß auch nur Daten empfangen, also keine zurück senden.
Nun ein paar Code Schnipsel:
Master:
Slave1:Code:$regfile = "M128def.dat" $crystal = 2000000 $lib "i2c_twi.lbx" Config Scl = Portd.0 Config Sda = Portd.1 Config Twi = 4000 I2cinit Ddra = &B0000000 Porta = &B11111111 Ddrf = &B11111111 Dim Poweron As Bit Dim S As Byte Declare Sub An Declare Sub Prg1 Do Debounce Pina.0 , 0 , An , Sub Debounce Pina.1 , 0 , Prg1 , Sub Loop An: Toggle Poweron If Poweron = 1 Then Portf.0 = 1 Else Portf.0 = 0 End If Return Prg1: If Poweron = 1 Then Portf.1 = 1 S = 5 Waitms 2 I2cstart Waitms 20 I2cwbyte &H0A 'Motor1 Waitms 20 I2cwbyte S Waitms 20 I2cstop Waitms 12000 I2cstart Waitms 20 I2cwbyte &H0E 'Motor3 Waitms 20 I2cwbyte S Waitms 20 I2cstop Waitms 12000 Goto Prg1 Else Portf.1 = 0 Return End If End
bitte Code-Tags verwenden (PicNick)Code:$regfile = "attiny13.dat" $crystal = 9600000 Config Pinb.3 = Output Config Pinb.4 = Input Config I2cslave = &B00001010 , Int = Int0 , Timer = Timer0 Dim Bfake As Byte Declare Sub Stop1 Do If Bfake = 5 Then Portb.3 = 1 Waitms 3000 Goto Stop1 Else Loop End If Stop1: If Pinb.4 = 1 Then Goto Stop1 Else Waitms 50 Portb.3 = 0 Bfake = 0 End If Return I2c_master_has_data: Waitms 10 Bfake = _a1 Return
Wie kommt das (master)Programm jemals aus "prg1" wieder raus ?Code:Prg1: If Poweron = 1 Then .... Goto Prg1 Else Portf.1 = 0 Return End If
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo PicNick,
Danke für den Hinweis mit den Codetags, hab ich übersehen.
Nun zu meinem Problem.
Der Master kommt aus PRG1 raus indem ich ihn ausschalt.
Spaß beiseite, das Masterprogramm dient nur zum Test des I2C-Bus,
und der funktioniert nicht auf der Slave Seite.
Ahja. "auto-iterativ" nennen das die Fachleute.
Aber nochwas beim Slave is sub-optimal
Goto Stop1
Stop1:
Return
Das soll sicher "GOSUB Stop1" heissen, sonst rappelt's in der Kiste
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Robert,
Hab alle goto's durch gosub's ersetzt,
leider ist alles beim alten.
Ich muß noch dazu sagen das ich die waitms ganz weggelassen hab,
auf 2 reduziert hab usw. hat aber leider auch nichts verändert.
Mfg
Ottmar
Würd mal sagen, die Slaves hängen sich irgendwie auf.
Du solltest beim master nach dem adresse-schicken
I2cwbyte &H0A 'Motor1
abfragen, ob ERR = 1 , d.h ob der Slave geACKed hat oder nicht.
(wenn nicht, brauchst du nicht weiterzusenden)
Ich muß mich über die I2CSlave -Lib erstmal ein wenig schlau machen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hab nun einfach folgende Codezeile nach jeder
Adressierung eingesetzt:
Der erste Slave verrichtet brav seine Arbeit,Code:Portf.2 = Err 'Kontroll LED an PortF.2
sobald an den Zweiten adressiert wird leuchtet die "ERR-LED".
Also hat Robert recht, nur was jetzt?
Die Adressen des zweiten Slaves hab ich schon mehrfach verändert,
und ihn natürlich auch schon als ersten gesetzt, dann funktioniert er,
liegt also nicht an der Hardware.
Danke schonmal fürs weiterhelfen.
MfG
Ottmar
Ich muß noch eine Entdeckung dazu schreiben:
Wenn ich das Masterprogramm umschreibe, so daß nur noch ein
Slave angesprochen wird und nur noch der angeschloßen ist, funktioniert alles.
Kann es sein, das der zweite die Fehladressierung irgendwie
falsch auslegt?
MfG
Ottmar
Hallo Ottmar,
ich versuche mal zusammenzufassen was ich bisher verstanden habe:Zitat von Otti66
Du sprichst mit dem Mega 128 zwei Tiny13 als Slave an.
Tiny13 - 1 hat Adresse &h0A
Tiny13 - 2 hat Adresse &h0E
Sobald Du beide Slaves ansprichst, hängt sich das Programm auf.
In Deinem Slaveprogrammen kann ich keinen Fehler entdecken. Master tut es ja prinzipiell offensichtlich nun auch.
Mir fällt unter den gegebenen Umständen nur noch ein, daß bei zwei angeschlossenen Slaves die Spannungen bzw. deren Flanken nicht mehr sauber sind. Also ein Hardwareproblem. Das hatte ich bisweilen auch schon. Wenn ich die bei mir standardmäßig auf 10kOhm ausgelegten Pullups auf 4,7kOhm verringere oder am Busende einfach noch mal 10k pulle (kommt auf das selbe heraus), ist der Spuk dann vorbei.
Leider stochere ich im Nebel, gerade bei solchen Sachen müsste man die Hardware vor sich haben, um zielstrebig weiter zu helfen. Tiny13 habe ich im Augenblick nicht da.
Grüße
Henrik
Hallo Hendrik,
Danke für deine Tips. Du hast das ganze in soweit richtig verstanden,
außer das der erste Slave richtig funktioniert und der nächste dann nicht mehr.
Als Pullups hab ich mittlerweile interne, zweimal 10k, einmal10k probiert,
werde aber morgen auf 5k und 2,5k runter gehn.
OK, ich gebs zu, die Hardware "was made quick and dirty" aber die Pegel sehen auf dem Speicher Oszi direkt am Pin super aus.
Den Tiny13 hat mir Mark Albers erst vor kurzem in BascomAVR I2CSlave implementiert, da ja Int0 und Tmr0 die gleichen Pins sind wie bei den anderen Tiny's.
Im Moment glaube (ich weiß, daß tut man in der Kirche) das, daß ganze
nur mit einem Software Slave funktioniert, sobald einer fehladressiert ist hängt er sich auf.
Muß da mal bei Marc Albers nachfragen.
Trotzdem Danke für deine Hilfe.
MfG
Ottmar
Lesezeichen