Kod jest dość spory więc wkleję najważniejsze fragmenty odpowiedzialne za RC5 ,SD i 1Wire.
RC5
'*****************************************************************************'
'****************************PROCEDURA ODCZYTU RC5****************************
'*****************************************************************************'
Readir:
Disable Int7' w pętli głównej włączam ponownie przerwanie. ( a może powinienem włączyć je jeszcze w miejscu XXX
Enable Interrupts
Getrc5(adres , Rozkaz)
Rozkaz = Rozkaz And &B01111111
Portc.7 = 0 'Używam tego do zobrazowania sobie czy odbiera mi kody z pilota. W pętli głównej zmieniam stan na przeciwny.
'xxx'
Return
'***********************************************************************************'
'*********USTAWIENIE PRZERWANIA OD TSOP -ODBIORNIKA PODCZERWIENI NA INT.7***********'
'***********************************************************************************'
Config Rc5 = Pine.7 'Port do którego podłączona jest dioda odbiorcza podczerwieni.
On Int7 Readir
Config Int7 = Low Level
Enable Int7
1WIRE(DS18B20)
'***********************************************************************************'
'**************************Konfiguracja magistrali 1Wire****************************'
'***********************************************************************************'
Config 1wire = Portd.4 'pin pod którym obsługiwane jest 1Wire
Przeszukiwanie wstępne przed pętlą główną programu:
'***********************************************************************************'
'*************PRZESZUKIWANIE MAGISTRALI 1WIRE I DODAWANIE DO 4CZUJNIKÓW*************'
'***********************************************************************************'
Ds(1) = 0 : Ds(2) = 0 : Ds(3) = 0 : Ds(4) = 0
W = 1wirecount()
Locate 4 , 1
Lcd "Ilosc wykrytych czujnikow :" ; W
Wait 1
If W > 0 Then
Dsid1(1) = 1wsearchfirst() 'Znajd? kolejny czujnik podpięty do portu
Ds(1) = 1
End If
If W > 1 Then
Dsid2(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(2) = 1
End If
If W > 2 Then
Dsid3(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(3) = 1
End If
If W > 3 Then
Dsid4(1) = 1wsearchnext()
Ds(4) = 1
End If
'*******************Odczyt numerów ID czujników temperatury*********************
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
Locate 5 , 1
Lcd "CRC OK Czujnik 1 ID: "
Locate 5 , 23
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 6 , 1
Lcd "CRC OK Czujnik 2 ID: "
Locate 6 , 23
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
If Dsid3(8) = Crc8(dsid3(1) , 7) Then
Locate 7 , 1
Lcd "CRC OK Czujnik 3 ID: "
Locate 7 , 23
For B = 1 To 8
Lcd Hex(dsid3(b))
Next
End If
If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Locate 8 , 1
Lcd "CRC OK Czujnik 4 ID: "
Locate 8 , 23
For B = 1 To 8
Lcd Hex(dsid4(b))
Next
End If
Procedura odczytu DS:
Temp_set:
If Ds(1) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
End If
If Ds(2) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
I2 = 1wread(2)
End If
If Ds(3) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid3(1) 'wysylam adres trzeciego czujnika
1wwrite &HBE
I3 = 1wread(2)
End If
If Ds(4) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid4(1) 'wysylam adres czwartego czujnika
1wwrite &HBE
I4 = 1wread(2)
End If
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Return
'******************************************************************************'
'**************************PROCEDURA 1WIRE-TEMPERATURA_READ********************'
'******************************************************************************'
Temp_read:
I1 = I1 * 10
I1 = I1 / 16
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Temp(1) = Ss
I2 = I2 * 10
I2 = I2 / 16
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Temp(2) = Ss
I3 = I3 * 10
I3 = I3 / 16
Ss = Str(i3)
Ss = Format(ss , " 0.0")
Temp(3) = Ss
I4 = I4 * 10
I4 = I4 / 16
Ss = Str(i4)
Ss = Format(ss , " 0.0")
Temp(4) = Ss
Return
I właśnie zauważyłem że nie czekam na konwersję od DS. Moim zamierzeniem było wysłać za jednym tyknięciem adresy do ds-ów (mam ich 4) a przy jakimś kolejnym odczytać wartości. Chciałem pominąć czekanie tego bez sensownego Waitms 750.
Ładowanie obrazka na LCD
'******************************************************************************'
'******************************************************************************'
'*****************************ŁADOWANIE GRAFIKI Z PLIKU************************'
'******************************************************************************'
'******************************************************************************'
Graphic:
'Pwm1a = 200
'Koordynaty wyświetlenia obrazka i nazwa pliku do otwarcia
'Obrazek = "test.txt"
Pozycja_x = 0
Pozycja_y = 0
Gr(1) = 0
Gr(2) = 0
Gr(3) = 0
K = ""
G = 0
Dp = ""
Cls Graph
Open Obrazek For Binary As #5 'można także użyć stałej jako numer kanału
'G = Lof(#5) 'sprawdzenie długości pliku danych
Do
K = ""
Line Input #5 , K ' read a line
'XXXXXXXXXXXXXXXXXXXXXWYŚWIETLANIE NA LCDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Gr(1) = Len(k) 'długość kolumny
Gr(2) = Gr(2) + 1 'kolejna linia
For Gr(3) = 1 To Gr(1)
Dp = Mid(k , Gr(3) , 1)
'wprowadzene korekty wyświetlenia obrazka'
Gr(4) = Gr(3) + Pozycja_x
Gr(5) = Gr(2) + Pozycja_y
If Val(dp) = 1 Then
Pset Gr(4) , Gr(5) , 0
End If
If Val(dp) = 0 Then
Pset Gr(4) , Gr(5) , 1
End If
Next Gr(3)
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Loop Until Eof(#5) <> 0
Close #5
Pwm1a = Bkl
Return
Nie Kierujcie się tu tą linijką z PWM bo jest ona używana do rozjaśnienia wyświetlacza po załadowaniu grafiki. Adres OBRAZEK to najzwyklejszy plik tekstowy xxx.txt skąd odczytuje grafikę w taki sposób jak w załączniku.
Z uwagi że nie działa mi sprzętowe SPI korzystam z bascomowego przykładu config_mmc.bas:
' Declare here you SPI-Mode
' using HW-SPI: cMMC_Soft = 0
' not using HW_SPI: cMMC_Soft = 1
Const Cmmc_soft = 1
' --------- Start of Section for Soft-SPI --------------------------------------
' Chip Select Pin => Pin 1 of MMC/SD
Config Pinb.0 = Output
Mmc_cs Alias Portb.0
Set Mmc_cs
' MOSI - Pin => Pin 2 of MMC/SD
Config Pinb.2 = Output
Set Pinb.2
Mmc_portmosi Alias Portb
Bmmc_mosi Alias 2
' MISO - Pin => Pin 7 of MMC/SD
Config Pinb.3 = Input
Mmc_portmiso Alias Pinb
Bmmc_miso Alias 3
' SCK - Pin => Pin 5 of MMC/SD
Config Pinb.1 = Output
Set Pinb.1
Mmc_portsck Alias Portb
Bmmc_sck Alias 1
' --------- End of Section for Soft-SPI ----------------------------------------
' ========== End of user definable range =======================================
' Error
Const Cperrdrivereset = 225 ' Error response Byte at Reset command
Const Cperrdriveinit = 226 ' Error response Byte at Init Command
Const Cperrdrivereadcommand = 227 ' Error response Byte at Read Command
Const Cperrdrivewritecommand = 228 ' Error response Byte at Write Command
Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read
Const Cperrdrivewriteresponse = 230 ' No Data response Byte from MMC at Write
Const Cperrdrive = 231
Const Cperrdrivenotsupported = 232 ' return code for DriveGetIdentity, not supported yet
Waitms 1 ' Wait some time before initialising MMC/SD
Dim Gbdriveerror As Byte ' General Driver Error register
Dim Gbdriveerrorreg As Byte ' Driver load Error-Register of HD in case of error
Dim Gbdrivestatusreg As Byte ' Driver load Status-Register of HD on case of error
Dim Gbdrivedebug As Byte
$lib "MMC.LIB" ' link driver library
$external _mmc
'Gbdriveerror = Driveinit() ' Init MMC/SD Card
Oraz Config_AVR-DOS.BAS.
Nie potrafię inaczej skonfigurować obsługi karty aby jeśli to możliwe pominąć ten config_mmc.bas.
Muszę mieć obsługę fat więc Config_AVR-DOS.BAS muszę mieć. Ale jak to skonfigurować aby chodziło na sprzętowym SPI nie mam pojęcia. Szperałem na Elektrodzie,w helpach itp. I nic nie wychodzi.
W programie mam jeszcze obsługę pamięci 24c512 na I2C , oraz PCF8583. I wszystko to śmiga OK.
Problemy największe są przy RC5 i DS.
Reasumując:
Potrzebuję maksymalnej prędkości jaką wycisnę z Atmegi 2560 z kwarcem zew. 16Mhz aby jak najszybciej ładować obrazki z SD. Ale musi przy tym działać RC5, DS, I2C. No generalnie wszystko oczywiście ma śmigać. Na razie nie ma problemów z działaniem przy :
$regfile = "m2560def.DAT" 'ATMEGA 2560
$crystal = 4000000
$hwstack = 64
$swstack = 64
$framesize = 64
Ale karta SD chodzi za wolno. Fakt że na soft-spi . Na Hardware zapewne można by poszaleć ale nie potrafię tego opanować niestety <rozkłada ręce>.
Dodam że jeśli ustawię :
to karta chodzi 2-3 razy lepiej ale RC5 i DS milczą. PCF odpowiada zawsze idealnie.Jak na razie pracuję na wewnętrznym oscylatorze gdyż miałem niemiłą niespodziankę z zablokowaniem sobie atmegi :/ Ale ją reanimowałem poświęcają przy tym ładnych parę godzin. Dlatego zanim nie ukończę programu to chyba nie będę się przełączał na zew. kwarc. Tym bardziej że zapewne jeszcze z 200x przeprogramuję Atmegę zanim skończę program. Testuję wszystko na bieżąco. Mam nadzieję że procek nie odmówi współpracy w setnym z kolei programowaniu.Niby w nocie katalogowej podają że wytrzymuje 10,000 przeprogramowań ale lepiej dmuchać na zimne. Ta atmega jest dość droga (kosztowała mnie prawie 70pln + koszt wlutowania 15pln ,gdyż sam nie lutowałem bo płytka na której jest wlutowana celowo nie ma solder-maski bo chcę jeszcze pomierzyć wszystko do końca a lakier by mi to utrudnił. Raster ścieżek też jest bardzo gęsty i wynosi 5mils) więc szkoda by było.
Widok płytki. Mam na niej też 2 piloty (już działają w RC5) - oczywiście odcięte już od płytki głównej.Widać tu 3-4 nie pasujące elementy które wyszły niechcący przy wizualizacji.
Oczywiście dodam że mam dodane w programie :
$include "Config_MMC.bas" 'include mmc
$include "Config_AVR-DOS.BAS" 'include avr-dos
Aby nie było niedomówień.
Dołączam też schemat aby było wszystko jasne.
![[Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI](https://obrazki.elektroda.pl/30_1261580266_thumb.png)