- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 3 von 3

Thema: SPI + Interrupts = Problem

  1. #1

    SPI + Interrupts = Problem

    Anzeige

    Praxistest und DIY Projekte
    HALLO;

    ich verzweifle gerade an dem Versuch 2 ATMega's per SPI kommunizieren zu lassen.
    µc 1 ist ein Mega 16 und sendet alle 2 sekunden eine zweistellige zahl per Hardware-SPI an µc2.
    µC 2 ist ein Mega 8 der die Daten per Hardware-SPI empfängt.

    Nun das Problem: Wenn ich den SPI Eingang regelmässig abfrage kommt jeder Wert an ( auskommentierte Routine in der Main Loop , Interrupts sind dabei Nicht enabled. Sobald ich die Interrupts einschalte und statt dem Polling die Interruptgesteuerte Routine verwende, kommt nur jeder 2 Wert am µC 2 an.
    Hat jemand von Euch 'ne Idee wo hier mein Fehler liegt ?



    Jürgen

    Code:
    $regfile = "m8def.dat"
    $crystal = 4000000
    
    Dim B As Byte
    
    Config Spi = Hard , Interrupt = On
    Spiinit
    Enable Spi
    Enable Interrupts
    
    On Spi Spiempf
    
    Cls
    '---------------------------
    Main:
      Do
        'Spiin B , 1
        'Lcd B
        'Waitms 222
        'Cls
      Loop
    End
    '----------------------------
    Spiempf:
    
    Spiin B , 1
    Lcd B
    
    Return

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich glaub, spiin ist nicht geeignet für sowas.
    Versuch mal (ohne Garantie)

    Spiempf:
    B = Spsr
    Lcd B
    return
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    @ Robert

    Danke für Deine Antwort. Sie hat mir nur indirekt geholfen. Da ich mit SPSR gar nichts anzufangen wusste, habe ich mal wieder ins Datenblatt geschaut und dabei kam mir die Erleuchtung.
    Das Register mit den Daten ist übrigens das SPDR. Im Datenblatt wird beschrieben, dass das SPI Interrupt Flag gesetzt wird, wenn der serielle Datentransfer beendet ist. Somit lese ich dann erst einen Wert ein wenn mir der erste entgangene Wert den Startschuss gab.
    Also mit

    spiempf:
    b = spdr
    lcd b
    return

    funktioniert das Ganze prima.

    Tschüss
    Jürgen

Berechtigungen

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

12V Akku bauen