Zwei µC per SPI verbinden (Bascom)

  • Hallo zusammen,
    um das Verständnis für ein Bascom Programm mit SPI zu erlangen,
    sollen zwei Atmega 16 per SPI verbunden werden.
    Am Master wird ein Taster angeschlossen und am Slave eine LED, um die
    Funktionstüchtigkeit des Busses zu zeigen.


    Ich habe mich durch verschiedene Quellen und Suchen gequält, mit nur
    begrenztem Erfolg.
    Was mir fehlt, ist ein kleines Beispiel Programm um das Verständnis zu
    bekommen, wie ich per Bascom das Obere realisiere.


    Die Verdrahtung habe ich wie folgt vorgenommen:


    SCK: Master PD5 auf PB7 Slave
    MISO: Master PD4 auf PB6 Slave
    MOSI: Master PD3 auf PB5 Slave
    SS: Master PD2 auf PB4 Slave


    Taster ist am Master PB1
    LED ist am Slave PA0


    Muss sich aber keiner dranhalten.


    Vielleicht kann mir ja Jemand weiter helfen. Gruß

  • Schon mal im passenden Datenblatt nachgeschaut?


    Da stehen so ein paar Erklärungen zu der Schnittstelle inklusive Codeschnipsel. Zwar nicht in Bascom aber das sollte das kleinere Problem sein :whistling:

  • Aus der Bascom Hilfe habe ich Folgendes zusammen gebastelt,
    was mir fürs Verständnis aber so nicht hilft.


    $regfile = "M16def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100


    Config Spi = Soft , Din =Pinb.0 , Dout =Portb.1 , Ss =Portb.2 , Clock =Portb.3


    Dim B As Byte
    Dim A(10) As Byte


    Spiinit
    B = 5


    Spiout A(1) , B
    Spiin A(1) , B


    A(1) = Spimove(a(2))
    End


    Für jede Hilfe bin ich dankbar. Gruß

  • Ich habe mir nun folgendes überlegt per hard spi,
    muss ich die µC jeweils einzelnt brennen oder macht der Master das mit?
    Je nach dem, wie sollte ich den Master und Slave mit einander verbinden?
    $regfile = "M16def.dat" 'es handelt sich um einen ATmega16
    $crystal = 16000000 'der eingebauter RC-Oszillator läuft mit 16 Mhz
    $hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
    $swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
    $framesize = 100



    Dim X As Bit
    Dim Y As Bit
    Dim X_send(8) As Byte


    Taster1 Alias Pind.0 'Taster1 an PD0
    Config Taster1 = Input


    Taster2 Alias Pind.1 'Taster2 an PD0
    Config Taster2 = Input


    Led0 Alias Portb.0 'LED0 an PB0
    Config Led0 = Output


    Led1 Alias Portb.1 'LED1 an PB1
    Config Led1 = Output



    Do


    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1




    If Taster1 = 0 Then X = 1 Else X = 0


    X = X_send(1)


    Spiout X_send(1) , 2


    Loop


    End


    Do


    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 0


    Spiin X_send(1) , 2


    Y = X_send(1)


    If Y = 1 Then Portb.0 = 1 Else Portb.0 = 0


    Loop


    End

  • Hallo,



    ich kenn mich zwar auch nicht aus aber ich versuch mal zu helfen(demnächst muss ich mich wohl auch in die Materie reinlesen)


    wenn kein Grund dagegenspricht(Pins schon belegt oder so) würde ich auch erstmal Hard SPI nehmen.
    Ja du musst beide AVRs mit deinem Programm flashen
    Der Main Loop (Do[...]Loop) muss in 2 verschiedene Programme aufgeteilt werden.1 x Für den Master und 1 x für den Slave
    Bist du sicher dass der Mega16 einen 16MHz internen Takt hat? ich dachte nur 8MHz...


    SPI Verbinden, einfach SCK MOSI und MISU miteinander verbinden und ein CS Signal generieren das sollte es Hardwareseitig schon gewesen sein.
    lies das hier mal durch(Übrigens der 1. Link wenn man Google mit AVR und SPI füttert)


    EDIT: hier ist noch ein Link