logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

SPI - jak to zatrzymać? Gdzie w kodzie jest błąd?

wicy 29 Sty 2007 19:41 1272 2
REKLAMA
  • #1 3503584
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Popełniłem taki oto program. Dane przesyłane przez port LPT przez 3 linie (D0 - SCK, D1 - MOSI, D2 - /SS). Teoretycznie procesor powinien być ustawiony w tryb slave
    
    $regfile = "ATtiny2313.DAT"
    $crystal = 4000000
    
    Dioda_led Alias Portb.2
    Ddrb.2 = 1                                                  'wyjscie - podpieta LED
    
    'konfiguracja portow dla SPI
    Ddrb.7 = 0 : Portb.7 = 1                                    'wejscie - CLK
    Ddrb.6 = 0 : Portb.6 = 1                                    'wejscie - MOSI
    Ddrb.5 = 0 : Portb.5 = 1                                    'wejscie - MISO
    Ddrb.4 = 0 : Portb.4 = 1                                    'wejscie - SS
    
    Dim Transmisja As Byte
    Dim Zmienna As Byte
    Dim I As Byte
    
    Declare Sub Led
    
    On Uci_ovflw Odebrano
    
    Usisr = &B00000000
    Usicr = &B01011000
    Enable Interrupts
    
    Transmisja = 0
    
    Do
       If Transmisja = 1 Then
          Transmisja = 0
          If Zmienna = 3 Then
             Led : Led : Led
          End If
          If Zmienna = 0 Then
             Led
          End If
          If Zmienna = 255 Then
             Led : Led
          End If
          Usicr = &B01011000
       End If
    Loop
    End
    
    Sub Led
       Reset Dioda_led : Waitms 200 : Set Dioda_led : Waitms 200
    End Sub
    
    Odebrano:
       Transmisja = 1
       Zmienna = Usidr
       Usidr = 0
       Usisr = 0
       Usicr = 0
    Return


    Po odebraniu 16 zmian stanu na lini SCK procesor wywołuje przerwanie - ustawia zmienną Transmisja i wpada w warunek sprawdzający w petli głównej. Kłopot, że nie wychodzi z pętli głównej i zachowuje się tak jakby non stop odbierał przerwanie - nie chce przestać migać diodą.
    Co robię nie tak? Flaga przerwanie zerowana jest w USISR. Więc nie powinien wskakiwać w przerwanie. Nie wiem już co tu jest nie tak :(
  • REKLAMA
  • Pomocny post
    #2 3503972
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Zerowanie flagi tego przerwania jest wpisywaniem tam wartości 1 a nie zero.
  • #3 3504067
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Jasne że tak!! :) Stanęło :)

    Mógłbyś się jeszcze wypowiedzieć, czy dobrze mam skonfirurowany SPI. Taktowanie sygnałem SCK (PB7-wejście) i dane wystawiane na MOSI (PB5-wejście)?
    Sygnał sterujący wygląda tak:
    dla '1' = SCK hi - MOSI hi - SCK lo - MOSI lo
    dla '0' = SCK hi - SCK lo

    Dziwna rzecz ale po wysłaniu "0" program raz odbiera "0" a raz "255" - naprzemiennie.
REKLAMA