- 12V Akku mit 280 Ah bauen         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 34

Thema: Fragen zu TWI

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Anzeige

    Praxistest und DIY Projekte
    ich programmiere in WinAVR und hab da keine richtige Hardware-TWI-Unterstützung gefunden(ich kenn mich mit C aber nicht wirklich aus, evtl hab ichs auch nur übersehen)

    deshalb hab ich den Code aus dem Datenblatt verwendet, der ja eigentlich funktionieren müsste...

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    ich hatte bisher was falsch programmiert, ich hatte vergessen, die signal.h einzubinden...

    den Master hab ich so programmiert, dass über einen externen Interrupt die Prozedur des TWI gestartet wird

    nachdem ich die signal.h jetzt eingebunden hatte, sieht es so aus, dass der µC bei der Zeile "while(!(TWCR & (1<<TWINT)));" "hängenbleibt"

    die Zeile ist auch aus dem Datenblatt(S.174), hat evtl jemand mit dem Code Erfahrung oder woran könnte das liegen?

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258
    Hallo Pascal,
    tut mir wirklich leid, aber C tu ich mir nicht an.
    Ich programmier lieber in Basic oder Pascal ().
    Diese sind um einiges übersichtlicher. Und der Code ist auch nicht langsamer.
    In Pascal habe ich z.B. ein Master/Slave System via Hardware-TWI erfolgreich zum laufen gebracht.
    Gruß, Michael

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    trotzdem vielen dank

    kennt sich vielleicht einer der C-Programmierer unter euch mit dem TWI aus?
    ich schildere nochmal kurz die momentane Lage:
    der Aktivierungs-TWI-Code des Masters:
    Code:
    TWAR = 0xFD;	//TWI-Addresse des Masters festlegen
    TWSR &= 0b11111100;	//Prescaler auf 1 setzen, Bit 1 und 0 auf 0
    TWBR = 0xC;	//Bitrate auf 12 setzen
    sei();		//Interrupts global aktivieren
    der Code, den der Master ausführt, um Daten zu senden:
    Code:
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);   //START senden
    while (!(TWCR & (1<<TWINT)));	//warten bis TWINT gesetzt
    //wenn START gesendet, dann "1" an den PC senden
    if ((TWSR & 0xF8) != 0x08) USART_transmit_string("1");
    //Addresse des Slaves angeben
    TWDR = 0xFE;
    TWCR = (1<<TWINT) | (1<<TWEN);	//Addresse senden
    while (!(TWCR & (1<<TWINT)));	//warten bis TWINT gesetzt
    //wenn erfolgreich, 2 an PC senden
    if ((TWSR & 0xF8) != 0x18) USART_transmit_string("2");
    //0 ins Datenregister schreiben
    TWDR = 0x0;
    //Daten senden
    TWCR = (1<<TWINT) | (1<<TWEN);
    //warten bis TWINT gesetzt
    while (!(TWCR & (1<<TWINT)));
    //wenn erfolgreich, dann 3 an PC senden
    if ((TWSR & 0xF8) != 0x28) USART_transmit_string("3");
    //STOP senden
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
    Slave-Init-Code:
    Code:
    TWAR = 0xFE;
    TWCR = 0b11000101;
    TWBR = 0xC;
    TWSR &= 0b11111100;
    sei();
    dann soll bei einem Interrupt, eine LED eingeschaltet werden

    nun zu den Symptomen:
    1 wird nie gesendet
    (der Rest nur, wenn der Slave-µC nicht mit dem Master verbunden ist)
    der Rest wird auch nie gesendet

    die LED beim Slave geht nie an

    wenn der SlaveµC angeschlossen ist, bleibt der Master in der dritten Schleife "hängen", wenn der Slave nicht angeschlossen ist, bleibt der Master in keiner der drei Schleifen hängen, allerdings werden bei beiden Varianten nur NACKs empfangen, der Slave antwortet also nie

    weiß jemand vielleicht, wo der Fehler zu suchen ist?

    Edit: siehe Symptome

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    ich hab noch ein wenig herumexperimentiert...der Code vom Master funktioniert jetzt(wenn ich einen PCF8574(Porterweiterungsbaustein)ansteuere)

    wenn ich dagegen den mit demselben Code(bis auf Addresse und Daten) einen anderen ATMEGA8 als Slave ansteuere, bleibt der Master immer in der dritten Schleife "hängen", der Fehler müsste also beim Slave zu suchen sein...

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    jetzt funktioniert auch der Slave...

  7. #17
    Gast
    Zitat Zitat von Pascal
    jetzt funktioniert auch der Slave...
    Woran lag es denn?
    Kannst du vielleicht noch mal nen Quellcode für Master und Slave reinstellen?
    Ich versuche nämlich auch 2 Mega16 über TWI zu verbinden.
    Gute Beispiele oder Tutorials für TWI in C habe ich noch nicht wirklich gefunden.
    Wer hätte da ein vielleicht ein paar Links?
    MfG Steve

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    das sei(); muss vor dem Code stehen, der den TWI beim Slave auf aktiv schaltet
    ich glaub zumindest, dass es das war, ist schon eine Zeit lang her, ich komm heut auch nicht mehr an meinen PC, kann also nicht nachschauen und auch keinen Code posten...aber so in etwa war es das oben gesagte

    so richtige Tutorials habe ich auch nicht für C
    anfangs ist es sowieso das Beste, wenn man sich mit der Funktionsweise des I²C auseinandersetzt, dann schaut man ins Datenblatt des ATMEGA8/16 usw., da wird das auch nochmal erklärt, weiterhin, wie das auf den AVRs genau funtioniert und drittens gibt es da auch Code-Beispiele(in Assembler und C)

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.05.2004
    Ort
    Bergstraße
    Beiträge
    245
    Trotzdem wäre es nett, wenn du den Code mal reinstellen würdest. Ich versuche auch gerade ein RN-Control mit RN-Mega8 zu verbinden, aber es klappt noch nicht so recht und die Fehlersuche gestalltet sich recht zeitraubend. Ich krieg das wahrscheinlcih irgendwann raus, aber es ist natürlich viel einfacher, wenn mir jemand helfen kann .
    ciao ... bernd

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    ich hatte auch vor, den Code noch reinzustellen, in meinem vorherigen Post hat sich das vielleicht nicht so angehört, war aber so gemeint...

    beim Mastercode hat sich nichts wichtiges verändert(ich hab nur ein wenig debugging-Code hinzugefügt), der untenstehende Code müsste also funktionieren

    hier der Slavecode(mit Kommentaren, ich hab das mal vor einiger Zeit für jemanden geschrieben und glaube, dass es ganz gut ist, wenn die dabeistehen)

    Code:
    //diese 6 Zeilen Code sind für das Initialisieren des TWI-Moduls zuständig, also kommt das Stück 
    //Code am besten irgendwo in die Mainmethode vor die Endlosschleife 
     
    //hier wird die Addresse des µC festgelegt(in den oberen 7 Bit, das LSB(niederwertigstes Bit) steht dafür, ob der µC auf einen general call //reagiert 
    TWAR = 0xFE; 
    //TWI Control Register, hier wird der TWI aktiviert, der Interrupt aktiviert und solche Sachen 
    TWCR = 0b01000101; 
    //TWI Bitrate Register, für die Frequenz des TWI wichtig 
    TWBR = 0xC; 
    //TWI Status Register, die 2 niederwertigsten sind für den Prescaler zur Taktberechnung, aus den 
    //anderen kann man auslesen, was genau passiert, wenn ein Interrupt ausgelöst wird, es gibt nämlich 
    //für den TWI nur einen 
    TWSR &= 0b11111100; 
    //hier werden Interrupts global aktiviert 
    sei(); 
    //hier wird das TWI-Modul aktiv geschalten, ab hier man den µC per TWI ansteuern, den Befehl aber 
    //auf jeden Fall hinter das "sei();", da es sonst nicht geht 
    TWCR |= 0b10000000; 
     
     
    //Interruptroutine des TWI 
    SIGNAL (SIG_2WIRE_SERIAL){ 
       //hier wird das TWSR darauf geprüft, ob 0x80 darin steht, dieser Wert bedeutet, dass Daten 
       //empfangen wurden, 0x60 würde zB bedeuten, dass er addressiert wurde und dies bestätigt hat 
       if((TWSR & 0b11111000) == 0x80){ 
          //hier Code einfügen, der bearbeitet werden soll, die empfangenen Daten kann man aus 
          //TWDR auslesen 
       } 
       //wenn der Interrupt ausgelöst wird, wird der TWI des µC blockiert,                        damit man die Daten 
       //verarbeiten kann
       //um ihn wieder zu aktivieren, muss man eben folgenden Befehl ausführen 
       TWCR |= 0b10000000; 
    }

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress