- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: datenaustausch von atmega32 zu atmega32 über spi usw...

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386

    datenaustausch von atmega32 zu atmega32 über spi usw...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo, ich habe in basocm dieses demo gefunden füer den datentransver von atmega zu atmega mittels spi.... :

    Dim A(10) As Byte

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

    Spiinit

    Spiout A(1), 4 'write 4 bytes a(1), a(2) , a(3) and a(4)

    End



    wenn ich jetzt einen 2. atmega verbinde (und zb spiin..), wie müssen sich die datenleitungen kreuzen und wie funktioniert der interrupt dazu wenn sich diese routine mit in einer do..loop..schleife befindet?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    EIner muß Master und einer Slave sein. Danach richten sich auch die Pin-bezeichnungen
    z.B Master In / Slave Out => MISO
    danach muß du verbinden
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    CONFIG SPI = HARD, INTERRUPT=ON|OFF, DATA ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0


    wie setze ich beim atmega32(slave) 8mhz diese config und beim atmega8 8mhz master die config ?

    mfg

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    hallo, die programme unten laufen soweit !
    bloss auf dem lcd wird immer nur jede 2. zahl angezeigt, je nachdem wo es anfängt zu zählen : 94,96,98.... oder 93,95,97.
    woran liegt das?

    master :
    Code:
    $regfile = "M8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    $baud = 19200
    
    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
    
    Waitms 255
    
    Do
     For B = 93 To 112
        Spiout B , 1
        Waitms 255
     Next
    Loop
    End
    slave :
    Code:
    $regfile = "M32def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 32
    $framesize = 64
    $baud = 19200
    
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    
    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
    
    Dim B As Byte , Status As Byte
    
    Status = 0
    
    Do
      If Status = 1 Then
        Cls
        Lcd B
        Waitms 50
        Status = 0
      End If
    Loop
    
    End
    
    
    Spi_isr:
        Spiin B , 1
        Status = 1
    Return

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    könnte es sein das der Slave so zu langsam ist
    bau mal das Status = 0 gleich nach der If-Abfrage, und evtl. das Waitms 50 raus.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    mit einem array funktioniert es wunderbar. wird wohl die lcd-routine das einlesen ausbremsen.

    mfg

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Das Cls wird schon bremsen,
    dann muss auch noch die Byte-Variable in einen String gewandelt werden,
    und dann nochmal 50ms warten,
    und dann erst wird der Status zurückgesetzt, da kann es schon sein, das ein weiteres Byte angekommen ist, das damit verschluckt wird.
    Deswegen wärs praktisch als erstes den Status zurückzusetzen, denn dann kann die ISR das nächste Byte anzeigen, bzw. wird von der Abfrage erkannt.

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad