Witam ponownie
Poprawiłem to zapisywanie do expanderów, troszkę lektury HELP-a i doszedłem do:
deklaracja:
Declare Sub Pcf_zap(byval Kosc As Byte , Byval Ex As Byte)
a tu podprogram:
'podprogram obslugi ukladow PCF8574
Sub Pcf_zap(byval Kosc As Byte , Byval Ex As Byte)
I2cstart
I2cwbyte Kosc
I2cwbyte Ex
I2cstop
Return
End Sub
i jego użycie:
Set Went2
Call Pcf_zap(pcf1_zap , Went2)
Reset Went2
Call Pcf_zap(pcf1_zap , Went2)
Wydaje się to chyba nieco lepszym rozwiązaniem niż pierwotne które wymagało użycia dla każdego expandera podprogramu z osobna.
Okazuje się że po przeczytaniu pdf-a PCF8574 są dwie rodziny układów jedna to PCF8574P a druga PCF8574AP i obie maja różne adresy bazowe.
ten pierwszy ma
a drugi
no i jak policzyłem to znajduje się na 64 i 65 oraz 112 i 113 i tak też wskazuje programik do i2c.
Mam jeszcze tego typu problem, zawsze gdy wywołam ten podprogram:
Sub Wybor_linii_param
Local Komorka_temp1 As Byte
Parametr = 1
Komorka_temp1 = Komorka 'tymczasowy adres komorki
Do
If No = 0 Then
Waitms 25
Incr Parametr
End If
Waitms 100
If Parametr = 4 Then
Parametr = 1
End If
Waitms 100
Cls
Select Case Parametr
Case 1 : Lcd "H_zal"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 1
Gosub Nastaw
Komorka = Komorka_temp1
End If
Case 2 : Lcd "T_zal"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 2
Gosub Nastaw
Komorka = Komorka_temp1
End If
Case 3 : Lcd "Wyjscie"
If Ok = 0 Then
Waitms 25
Komorka = Komorka_temp1
Parametr = 1
Return
End If
End Select
Loop
End Sub
i dam mu w opcjach wyjscie, to program się wykrzaczy tzn, na ekranie nic sie nie pojawia, obojętnie z jakiego innego podprogramu go wywołam, dodam, że po wywołaniu np. podprogramu Nastaw i dokonaniu zmian i zapisaniu w EEPROM powraca do w/w częsci a z tej nie chce iśc wyżej ( tam skąd został wywołany).
wywołuje go tym podprogramem:
Local Linia As Byte
Local Komorka_temp As Byte 'tymczasowy adres komorki
Linia = 1
Komorka_temp = Komorka
Do
If No = 0 Then
Waitms 25
Incr Linia
End If
Waitms 100
If Linia = 6 Then
Linia = 1
End If
Waitms 100
Cls
Select Case Linia
Case 1 : Lcd "Linia 1"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 1
Gosub Wybor_linii_param
Komorka = Komorka_temp
End If
Case 2 : Lcd "Linia 2"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 4
Gosub Wybor_linii_param
Komorka = Komorka_temp
End If
Case 3 : Lcd "Linia 3"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 7
Gosub Wybor_linii_param
Komorka = Komorka_temp
End If
Case 4 : Lcd "Linia 4"
If Ok = 0 Then
Waitms 25
Komorka = Komorka + 10
Gosub Wybor_linii_param
Komorka = Komorka_temp
End If
Case 5 : Lcd "Wyjscie"
If Ok = 0 Then
Waitms 25
Komorka = Komorka_temp
Return
End If
End Select
Loop
End Sub
Może jest coś źle i ja tego nie bardzo widze.
Z góry wielki dzięki.
Dodano po 54 [minuty]: Jak dam mu zamiast return goto wybor_linii to wowczas dziala poprawnie, ale nie moge dojsc dlaczego wywala sie w tym miejscu, reszta dziala poprawnie.
Dodano po 4 [godziny] 51 [minuty]: Witam
Zlożyłem RS 485 wg schematu z EP i wklepałem coś takiego:
Master:
Sub Odczyt_zn
Czekaj = 0
Zm_lan = ""
Do
Incr Czekaj
Zn = Inkey()
If Zn >= "0" And Zn <= "9" Then
Zm_lan = Zm_lan + Zn
End If
Waitms 1
Loop Until Zn = Chr(13) Or Czekaj > 0
End Sub
a tak wywołuję
Cls
Cursor Off
Set Re_de
Waitms 1
Print "{008}2r"
Waitms 1
Reset Re_de
Call Odczyt_zn
Temp_odcz = Val(zm_lan)
Lcd ":" ; Temp_odcz
Wait 2
przerwania mam właczone w obu uP oraz:
$baud = 9600
Config Serialin = Buffered , Size = 15
a tutaj w slave
$regfile "Attiny2313.dat"
$baud = 9600
Config Pind.2 = Output
Config Serialin = Buffered , Size = 15
Const Adre = 2
Dim Wart_zm As Word
Dim Temp As Integer
Dim Zn As String * 1
Dim Adr_s As String * 5
Dim Adres As Byte
Dim Il_zn As Byte
Re_de Alias Portd.2
Enable Interrupts
Reset Re_de
Do
Temp = 20
Zn = Inkey()
If Zn = Chr(8) Then
Adr_s = ""
Il_zn = 0
Do
Zn = Inkey()
If Zn >= "0" And Zn <= "9" Then
Incr Il_zn
Adr_s = Adr_s + Zn
Else
If Zn > Chr(0) Then
Exit Do
End If
End If
Loop
If Zn = "r" Then
If Il_zn > 0 And Il_zn < 3 Then
Adres = Val(adr_s)
If Adres = Adre Then
Do
Zn = Inkey()
Loop Until Zn = Chr(13)
Set Re_de
Waitus 200
Print Temp;
Wait 1
Reset Re_de
End If
End If
End If
End If
Loop
End
No i nie bardzo działa, i chyba ( na pewno) dlatego że mam różne kwarce, w Atmega 16 mam 14MHz z hakiem, a tutaj korzystam z wewn. Nie mam nic na miejscu ( kwarcu0 czy da radę ustawić oba procki na te same MHz z oscylatora wewn.? Jeśli tak to proszę o podpowiedx, bo jakoś nie bardzo bawiłem się fuse bitami ( a nie che zablokować procka)
-=pozdrawiam=-
Dodano po 11 [minuty]: Jakie ewentualnie najlepiej użyć kwarce?