-         

Ergebnis 1 bis 8 von 8

Thema: SPI Kommunikation zwischen 2 AVR's

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216

    SPI Kommunikation zwischen 2 AVR's

    Anzeige

    Hallo!

    Ich habe Schwierigkeiten bei der Kommunikation zweier AVR's über SPI. Folgenden Code verwende ich für den Master:

    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    Config Portb.5 = Output
    Config Portb.4 = Input
    Config Portb.3 = Output
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
    Spiinit
    
    Dim B As Byte
    B = 80
    
    Do
    
        Spiout B , 1
        Wait 2
    
    Loop
    End
    Und folgenden Code für den Empfang:
    Code:
    $regfile = "m8def.dat"
    $crystal = 18432000      
    
    Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
    Spiinit
    'Enable Spi
    
    On Spi Spi_isr
    
    'Interrupt's global aktivieren
    Enable Interrupts
    
    Config Portd = Output
    Dim B As Byte , Status As Byte
    
    Status = 0
    
    Do
        If Status = 1 Then
            Portd.5 = 1
            Waitms 500
            Portd.5 = 0
            Status = 0
        End If
    
    Loop
    End
    
    
    Spi_isr:
        Spiin B , 1
        Status = 1
    Return
    Leider funktioniert rein gar nichts. Es scheint, als wird vom Master gar nichts gesendet. Der Slave hingegen scheint zu funktionieren, d.h. beim flashen des Codes für den Master wird der Interrupt des Slaves ordnungsgemäß ausgeführt.

    Woran könnte das liegen?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    wie weit sind denn die beiden Chips auseinander? Ich hatte mit I2C und
    der seriellen Komu schon mal er hebliche Probleme damit. Und:
    Hast du die Chiprate in den Fuses umgestell? Damit hatte ich auch schon
    mal Probleme.
    Grüße Furtion

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Hi,
    die Fuses sind entsprechend eingestellt, aber könnte es vielleicht Probleme machen, dass ein AVR mit 16MHz und der andere mit 18,432MHz läuft? Die Controller sind vielleicht 10cm voneinander getrennt - also keine Entfernung!
    Jemand noch eine Idee?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    30
    Beiträge
    674
    Kannst du mal einen Schaltplan posten? Evtl. stimmt ja da etwas nicht.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    ich würde eher auf das mit dem Quarz tippen, wenn es für dich kein aufwand
    ist würde ich einfach mal 2 16Mhz Quarze nehmen.
    Grüße Furtion

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Hi,
    Schaltplan habe ich gerade nicht da, aber da wäre auch nicht viel zu sehen. Es ist eine normale Standard-Beschaltung auf einem Testboard.
    Ich könnte auf die interne 8MHz Quarzfrequenz umstellen und dann noch einmal testen, ein Versuch wäre es vielleicht wert.
    Vorerst danke für die Antworten!

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    30
    Beiträge
    674
    Manchmal kommt es halt auf Kleinigkeiten im Schaltplan an. Wie hast du denn die SPIs der AVRs miteinander verbunden? MOSI des einen an MOSI des anderen?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    ja, die Leitungen sind eins zu eins miteinander verbunden. Wenn ich es richtig verstanden habe, wird der MOSI Pin beim Master als Ausgang (Master Out) und beim Slave als Eingang (Slave In) geschaltet. Demnach sollte es funktionieren. Merkwürdig ist ja, dass der Slave den Interrupt auslöst, wenn ich den Master über ISP programmiere, sonst aber nicht. Deshalb liegt die Vermutung nahe, dass der Master gar nichts sendet.
    Wann wird denn überhaupt der Interrupt ausgelöst? Wenn ein Byte komplett empfangen ist, oder wenn sich der Zustand der Clock-Leitung ändert?

Berechtigungen

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