-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Frage zu USI Schnittstelle

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236

    Frage zu USI Schnittstelle

    Anzeige

    Hallo,
    Ich programmiere gerade einen I2C Slave auf einem Tiny24, und ich muß sagen, es klappt \/
    Jetzt kommt aber das Problem/Frage
    SCL hängt an PA4
    SDA PA6
    Pins PA0-PA3 sind als Ausgänge konfiguriert und hängen an Inputs von l293.
    Jetzt will ich natürlich was an PA0-PA3 ausgeben um die Drehrichtung der Motoren zu bestimmen.
    Eigentlich hatte ich es so vor:
    Code:
    in r16,PINA
    andi r16,0xF0
    or r16,r17
    out PORTA,r16
    Kein Hexenwerk also , in r17 ist der obere Nibble natürlich gelöscht.
    Ich frage mich aber, was passiert, wenn in der Zeit zwischen in und out der Zustand an SCL SDA sich geändert hat, der Master komuniziert gerade mit einem anderen Slave, bzw. schickt/holt Daten von mir
    Würde ich jetzt Störungen am Bus verursachen, oder läßt es den Tiny kalt, wenn man USI aktiviert hat ?

    Vielleicht weißt jemand eine Antwort drauf, sonst muß ich es per Brutal force ausprobieren.
    Hab ich vielleicht das Datenblatt nicht gründlich genug studiert, ich meine aber, keine Antwort auf diese Frage gefunden zu haben.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die vorgeschlagene Methode würde wohl funktionieren, allerdings werden die internen Pullups abhängig vom Eingangssignal geschaltet. Besser wäre es am Anfang IN r16,porta zu benutzen. Wenn die I2C routine im Interrupt läuft eventuell noch CLI/SEI um den code setzen.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Danke für die Antwort,
    wieso denn in r16,porta, damit lese ich doch nicht die Pegel an den Pins, sondern die Pullups ?
    Außerdem bringt cli/sei hier nicht viel, weil die Komunikation läuft ja weiter, auch wenn Interrupts ausgeschaltet sind bzw. kann der Master ja mit einem anderen Slave "reden"
    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    Ich habe heute mal einen Testaufbau gemacht bestehend aus:
    Tiny 24 als Slave, M8 als Master und PC.

    Ein kleines PC Programm sendet dann über UART fortlaufend 3 Bytes an dem M8, der wiederum alle 3 per I2C an den Tiny reicht, anschliessend alle 3 wieder vom Tiny holt und an den PC zurückschickt,
    Der PC vergleicht, was er gesendet hat, und was zurückgekommen ist

    1. Versuch war ohne Veränderungen am Tiny PORTA, irgendwo bei Empfang von Byte 500000 hatte ich den PC angehalten und I2C Komunikation als erfolgreich erklärt.

    2.Versuch : kleine Programmänderung am Tiny mit dem obengenannten Code^^^
    Ergebnis : Bus hängt, nichts gesendet und nichts empfangen (das habe ich mir schon gedacht
    )

    Fazit: Ich muß den unteren Nibble mit sbi und cbi ändern, toll das spart nicht gerade Speicher alle Möglichkeiten auszuprogrammieren
    Da muß ich mir noch was einfallen lassen.
    Spontane Idee den r17 insgesammt 4 Mal rechts schieben und je nachdem was in Carry steht sbi oder cbi am entsprechendem Pin anwenden.
    Oder kennt jemand eine bessere Lösung ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Hallo Sebastian,

    ich versuche derzeit ohne Erfolg den I2C Bus beim Tiny24 in Betrieb zu nehmen. Ich vermute, dass ich bereits bei derInitialisierung etwas falsch mache, denn die beiden Busleitungen bleiben auf low (soll ein Master werden). Kannst du mir einen Code-Auszug senden?

    Gruß
    Stefan

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo Stefan,
    Kannst du mir einen Code-Auszug senden?
    Das könnte ich gerne machen, aber Du schreibst
    soll ein Master werden
    und ich habe einen Slave implementiert...

    Einen Master als USI lohnt nicht wirklich, den kann man genausogut in Software machen.

    Hast Du schon die Appnote zum Thema durch ?
    http://atmel.com/dyn/resources/prod_...ts/doc2561.pdf

    Am sonsten bleibt die Frage, zieht der µC die Leitungen auf LOW oder hast Du
    die Pullup Widerstände vergessen ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Hallo Sebastian,

    die AN hilft mir nicht weiter. Dort ist ja der Code nicht ausformuliert, sondern nur das Prinzip der Kommunikation erklärt. Ich denke, das Prinzip des I2C Bus ist mir klar. Im Grunde genommen ist das Protokoll erst einmal unwichtig, denn es soll ja erst einmal ein Signal zu sehen sein.

    Mein Problem: ich setze den TWI Mode und die Pullups sind vorhanden. Stehen die Portbits auf Ausgang, se sehe ich ein Low. Stehen sie auf Eingang, sehe ich ein Hign. Ich benutze den SE-Strobe. Toggeln vom USICLK oder USITC bringt nichts. Auch im Simulator werden die Daten im Register nicht geshiftet und der Counter bleibt auf Null. Auch im SPI Mode tut sich nichts.

    Das entsprechende Kapitel im Datenblatt ist etwas verunglückt. Es gibt ein Buffer Register ohne Beschreibung, es wird Port E erwähnt...

    Bei meiner Suche im Internet fand ich bisher nur dich mit einer Erfolgsmeldung.

    Klar kann man den I2C-Bus auch in SW machen, aber das Interface wäre schon ein nettes Feature.

    Gruß
    Stefan

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo Stefan,

    Natürlich gibt es einen Code zu der Appnote, sorry, ich habe Dir den falschen Link kopiert ...
    http://atmel.com/dyn/resources/prod_...nts/AVR310.zip
    Es ist zwar IAR C , es sollte aber normallerweise kein Problem sein Assembler
    daraus zu machen, wenn nicht sag nochmal bescheid , dann helfe ich Dir gerne.

    Ja das Dattenblatt ist wirklich zum Ko*** was USI angeht, ohne Appnote hätte ich es auch nicht geschafft.
    So initialisiere ich z.B. den slave:
    Code:
    usi_twi_slave_init:
    	in tmp,USI_PORT
    	ori tmp,(1<<USI_SCL)|(1<<USI_SDA)
    	out USI_PORT,tmp
    	sbi USI_DDR,USI_SCL
    	ldi tmp,(1<<USISIE)|(1<<USIWM1)|(1<<USICS1)
    	out USICR,tmp
    	ldi tmp,0xF0
    	out USISR,tmp
    	ret
    Man beachte, daß der SCL Pin als Ausgang gesetzt wird was für mich komisch ist, weil der Slave eigentlich den SCL als Eingang nutzen sollte.

    Am sonsten klappt das ganze an sich gut, Master fährt mit 400 kHz der Tiny macht nebenbei noch Radencoder,Motorenansteuerung und eine einfache PI Regelung alles ohne Probleme.

    Naja, versuch es bitte nochmal mit der Appnote, wenn es nicht klappt schauen wir mal, ich will bald einen Tiny 24 mit HP03 Drucksensor von Hope RF verheiraten, warum soll man nicht nebenbei einen USI Master implementieren.

    Gruß Sebastian

    P.S.
    Auch im Simulator werden die Daten im Register nicht geshiftet und der Counter bleibt auf Null
    Wenn Du AvrStudio Simulator meinst, vergiß es, das kann er nicht, steht aber auch irgendwo in der Help, es sei denn Du hast einen HW Debugger ala JTAG ICE mkII oder Dragon.
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #9
    Hallo Sebastian,

    erst einmal vielen Dank für die Mühe. Die AN kannte ich noch nicht. Ich habe mir den Code angesehen und bin etwas schockiert, da ich mit einem einfachen Interface gerechnet hatte. Der Code ist ja 10 mal länger wie mein Programm. Mein Einsatzgebiet für den I2C-Bus sollte eigentlich das Debuggen sein. Ich wollte zur Laufzeit Variablen an die Außenwelt senden. Geht so was nicht einfacher?

    Gruß
    Stefan

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo Stefan,

    Ich habe mir den Code angesehen und bin etwas schockiert, da ich mit einem einfachen Interface gerechnet hatte.
    Ich hab Dich ja gewarnt, jetzt weißt Du hoffentlich, was ich mit
    Einen Master als USI lohnt nicht wirklich, den kann man genausogut in Software machen.
    meinte

    Für Slave ist USI ganz O.K. aber Master....

    Ja Alternative Selber verbessern \/
    sonst vielleicht http://homepage.hispeed.ch/peterfleu...-software.html
    Es ist zwar eine C Lib aber im Assembler geschrieben, die nutzr ich gelegentlich...

    Gruß Sebastian

    P.S. Ich werde mich mit USI Master auseinander setzten, im Moment bin ich leider mit I2C Display beschäftigt, auch zu Debuggzwecken
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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