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

Atmega16+PCF8583+BASCOM

marrog 22 Maj 2009 16:25 9497 60
  • #1 6561272
    marrog
    Poziom 22  
    Witam serdecznie !!!

    Napisałem programik jak poniżej:
    Do
       I2cinit
       I2cstart
       I2cwbyte 162
       I2cwbyte 2
       I2cstart
       I2cwbyte 163
       I2crbyte Sekunda , Ack
       I2crbyte Minuta , Ack
       I2crbyte Godzina , Nack
       I2cstop
       Godzina = Makedec(godzina)
       Minuta = Makedec(minuta)
       Sekunda = Makedec(sekunda)
       Locate 1 , 1
       Lcd Godzina ; ":" ; Minuta ; ":" ; Sekunda
       
    Loop

    W efekcie działania dostaje 0:0:0
    zmienne mam zadeklarowane jako Byte
    nóżkę A0 mam podpiętą do VCC, kwarc jak w pdf i kond 33pF. ( nie mam podtrzymania), oprócz tego na i2c mam jeszcze AT24c04 tam nóżki od 1-4 mam podpiete pod masę ( A0-A2 i GND do masy) wiec układ ma inny adres niż PCF.

    Co jest nie tak że otrzymuje taki wynik?
    Aha rez. podc 4,7k
    konfiguracja i2c
    
       Config Scl = Portc.0
       Config Sda = Portc.1
       I2cinit

    -=pozdrawiam=-
    dzięki za pomoc.
  • Pomocny post
    #2 6561990
    janbernat
    Poziom 38  
    Spróbuj:
    ......
    ....
    cls
    Lcd.........
    Watms500

    Dodano po 1 [minuty]:

    I2Cinit raczej niepotrzebne.
  • #3 6562531
    marrog
    Poziom 22  
    Witam

    Nic nie pomogło. Jak wyjmę PCF z podstawki, wówczas na wyświetlaczu mam 165:165:165 ( brak AT24c04 również).

    -=pozdrawiam=-
  • #4 6562623
    janbernat
    Poziom 38  
    To jest programik Pana Z.R. do poszukiwania co jest na I2C.
    Należy to zmodyfikować do własnych potrzeb.
    Wyjmij pamięć i zajmij się na razie tylko zegarem.
    
    $crystal = 16000000.
    
    $regfile = "m8def.dat"
    
    Config Portc = Output
    Config Lcd = 16 * 2
    
    Config Lcdpin = Pin , Db7 = Portc.2 , Db6 = Portc.3 , Db5 = Portc.4 , Db4 = Portc.5 , E = Portc.7 , Rs = Portc.6
    Config Scl = Portc.0
    Config Sda = Portc.1
    
    
    
    
    
    
    Config Lcd = 16 * 2
    Dim Adres As Byte
    Cls
    Lcd "start"
    Wait 2
    Cls
    For Adres = 60 To 170 Step 2
    I2cstart
    I2cwbyte Adres
    I2cstop
          If Err = 0 Then
    
             Cls
             Lcd "uklad pod:" ; Adres
    
          Else
    
             Cls
             Lcd "brak ukladu" ; Adres
    
          End If
    Wait 1
    Next Adres
    Cls
    Lcd "koniec"
       
    
    
  • Pomocny post
    #5 6562641
    teedd
    Poziom 19  
    Witam.
    Miałem podobny przypadek - ale co jakiś czas były prawidłowe odczyty z PCF-a. Pomogło podłączenie kondensatora między nóżkami zasilania PCF-a.
    Pozdrowienia - teedd
  • #6 6562662
    marrog
    Poziom 22  
    Ech nie wiem czy nie upaliłem PCF-a, bo zamiast kondensator podpiąć pod GND to podpiąłem pod VCC ( na pająku machnąłem się), bo jak teraz przepiołem, to coś tam czasem zliczy, albo kwarc poszedł??
  • #7 6562710
    janbernat
    Poziom 38  
    Jak mnie skleroza nie wprowadza w błąd to kondensator do PCF8583 POWINIEN iść do + a nie do masy.

    Dodano po 7 [minuty]:

    Sprawdziłem.
    Do +.
    Sklerozę lekceważę.
    Nic nie upaliłeś.
    Dodano po 3 [minuty]:

    teedd:

    "Pomogło podłączenie kondensatora między nóżkami zasilania PCF-a."
    To podstawa-100nF.
  • #8 6562809
    marrog
    Poziom 22  
    No faktycznie podpiety jest pod + a nie pod gnd, a w pdf z EDW podpiety jest pod gnd ( stąd pomyślałem, że machnąłem), w pdf podany jest trymerek.

    te 100nF to podpiać między zasilanie czy zamiast tego 33pF??
  • #9 6562837
    janbernat
    Poziom 38  
    Jak już:
    Podłączysz 33pF z powrotem do +.
    Podłączysz kondensator 100nF .(teedd)
    Sprawdzisz adres(programikiem).
    To ściągnij datasheeta i sprawdź jak się ustawia rejestr konfiguracyjny pod adresem 0.
    Mam PCF ale luzem.
    Nie mam czasu ma wlutowanie i sprawdzenie-chociaż bardzo to lubię.

    Dodano po 1 [minuty]:

    POD ZASILANIE!!!
    100nF do kwarcu???
    Student PWr???
  • #10 6562902
    marrog
    Poziom 22  
    janbernat sorki ale mam dzisiaj ciężki dzień i coś słabo trybie dzisiaj.
    No fakt nie pomyślałem z tymi 100nF ;-) ale poważnie dzisiaj coś ciężko trybię, czytam i czytam i nie dociera do mnie, chyba mam dość już.
    Jutro będę walczyć z tym

    Jak mi nie działą rzecz która powinna teoretycznie zadziałać, to już później wątpie we wszystko co wiem i stąd takie dziwne pytania :cry:
    -=pozdrawiam=-

    No tak, znalazłem między innymi info o rejestrze kontrolnym, że flaga 5 i 4 ustawione odpowiednio 00 - dołączony kwarc , 01 - sygnał 50Hz,
    Teraz tak jeśli nie korzystam z alarmu to flagi 0,1,2 ( gdzie 0 = LSB) daje na 0 ( czy dobrze rozumiem?)
  • #11 6563028
    janbernat
    Poziom 38  
    Jak Ci coś nie działa-to najpewniej najgłupszy błąd.
    Coś źle zlutowane, jakieś zwarcie, jakiś błąd w podłączeniu czy literówka w programie.
    Ale na tym polega nauka.
    Górale mówią-"Jak sie nie wywrócis-to sie nie naucys".
    Jutro tez jest dzień.
  • Pomocny post
    #12 6563653
    edekk
    Poziom 26  
    Jeżeli podłączysz kondensator do minusa jak jest to w EDW to nic nie uwalisz , zegar tylko będzie chodził szybciej.Zmniejsz wartość oporników na 1 kohm. i sprawdź co ci odczytuje procesor.
  • #13 6571754
    marrog
    Poziom 22  
    Witam
    No i nadal to samo, wlutowalem 100nF, zamienilem 4,7k na 1k, ustawiam rejestr kontrolny
    
    I2cstart
       I2cwbyte Pcf_zap
       I2cwbyte 0
       I2cwbyte 8
       I2cstop
    Do
       I2cstart
       I2cwbyte Pcf_zap
       I2cwbyte 2
       I2cstart
       I2cwbyte Pcf_odcz
       I2crbyte Sekunda , Ack
       I2crbyte Minuta , Ack
       I2crbyte Godzina , Nack
       I2cstop
       Godzina = Makedec(godzina)
       Minuta = Makedec(minuta)
       Sekunda = Makedec(sekunda)
       Cls
       Locate 1 , 1
       Lcd Godzina ; ":" ; Minuta ; ":" ; Sekunda
       Waitms 500
    Loop
    End Sub
    

    po prostu zaczynam się poddawać, co robię źle??

    A zapomniałem dodać, że układ znajduje pamięć i pcf( po napisaniu tego krótkiego programiku do przeszukiwania szyny i2c) na adresach odpowiednio 160 at i 162 pcf, gdy wyjmę at to znajduje tylko pcf na adresie 162 i takie adresy mam wpisane w programie.
    Więc już tracę zapał do tej kości :cry:
    W Bascom Colleg pokazany jest listing programu powinno to działać, jak szukam na necie to wszystkim działa a u mnie nie.

    -=pozdrawiam=-

    Dodano po 2 [godziny] 46 [minuty]:

    A może problem tkwi w kwarcu? Powinien być 32.768kHz (32768Hz),a mi babka w elektroniku dała 3.2768MHz, więc trochę większy niż powinien. Oby to było to :-)
  • #14 6572775
    edekk
    Poziom 26  
    Przy tym kwarcu to ci nie ruszy.Wyjmij kwarc z zegarka elektronicznego i powinno być ok
  • #15 6573237
    marrog
    Poziom 22  
    Witam

    No to edekk mnie pocieszyłeś :-) muszę jutro do elektronika podjechać i zakupić kilka części.
    Co za kobieta, miała na kartce napisane jaki kwarc ma być ( właśnie sprawdziłem tą kartkę i jak byk jest wartość 32.768kHz ) to ponad w 3.2MHz.

    Mam jeszcze takie pytanko.
    Zrobiłem sobie menu do ustawiania poszczególnych parametrów ( nastaw) poruszam się po nim za pom. 4 przycisków. poniżej przedstawię kawałek kodu:
    
    instrukcje w Case 
    Case 1 : Lcd "Temperatura"
          Debounce Ok , 0 , Ust_temp , Sub
       Case 2 : Lcd "Wilgotnosc"
          Debounce Ok , 0 , Ust_wilg , Sub
    ......
    
    zatwierdzam przyciskiem OK - działa poprawnie skacze do podprogramu np Ust_temp, tutaj też mam jak wyżej w Case zrobiony wybór parametru ( np. dolna i górna wartość) oraz 3 opcja wyjście z "podmenu"
    
    ......
    Case 4 : Lcd "Wyjscie"
          If Ok = 0 Then
             Cls
             Return
          End If
    

    no i teraz po wybraniu jakieś nastawy zagłębiam się dalej w podmenu, wszystko działa ok, poza tym że jak czasem dam mu żeby wyszedł ( powrócił o "podprogram do góry czyli do menu wyżej) to się zwiesi - tak mi się wydaję gdyż na ekranie LCD nic nie ma.
    Czym to może być spowodowane??
    Czy może tym że sprawdzam stan przycisku jak wyżej czyli if switch=0 then.... ale w DEBOUNCE nie da się zrobić kilku kroków programu ( jakieś porównanie dodanie czy coś - nie ważne dokładnie co) zanim wykonam skok do podprogramu - nie wiem czy dobrze się wyraziłem może tak:
     
    if przycisk=0 then
       a=a+1
       b=b+2
       itd....
       gosub podprogram
    end if
    Natomiast 
    debounce przycisk,0,podprogram,sub
    

    ( chodzi mi żeby uniknąć efektu drgania styku - tak jak robi to debounce czyli zatwierdza tylko jedno zwarcie,a u mnie czasem podczas jednego wciśnięcia idzie w menu aż o 2 - 3 poziomów bo tyle razy pewnie zewrze się styk) jak to obejść ?? dać jakieś opóźnienie?
  • Pomocny post
    #16 6573702
    Andy74
    Poziom 25  
    Cytat:
    Powinien być 32.768kHz (32768Hz),a mi babka w elektroniku dała 3.2768MHz, więc trochę większy niż powinien.

    No nieźle :) Chciałeś przyśpieszyć czas 100-krotnie? Wystarczająco szybko już leci... :)
    A poważnie - jeśli podłączysz PCF-a prawidłowo i jego generator działa jak należy, to (przy domyślnym ustawieniu rejestru kontrolnego) na pinie 7 (/INT) powinien pojawić się po włączeniu zasilania przebieg prostokątny o częstotliwości 1Hz i wypełnieniu 50%. Sprawdzenie obecności tego przebiegu pozwala ustalić, czy ewentualny problem tkwi w programie, czy w hardware. Wyjście to jest typu open drain, więc trzeba zastosować rezystor podciągający do Vcc (ok. 4,7kΩ). Można użyć do testów np. diody LED, ważne by prąd /INT nie przekraczał 3mA.
    Rezystory podciągające magistralę I²C mają mieć 4,7kΩ i nie ma potrzeby zmniejszać ich wartości, jeśli długość linii nie jest jakaś ekstremalnie duża jak na ten standard.
    Rezonator 32.768kHz można (jak już tu ktoś wspomniał) znaleźć w jakimś starym zegarku, budziku elektronicznym itp. Wygląda najczęściej tak:
    Atmega16+PCF8583+BASCOM

    Tą linijkę programu:
       Lcd Godzina ; ":" ; Minuta ; ":" ; Sekunda 

    proponuję zmienić na:
       Lcd Godzina ; ":" ; Minuta ; ":" ; Sekunda ; "   "

    bo inaczej będzie to nieciekawie wyglądało na LCD :)

    Co do ostatniego pytania, to najprościej po pierwszym sprawdzeniu stanu pinu odczekać ok. 20ms, sprawdzić jeszcze raz, i dopiero wtedy jeśli warunek jest dalej spełniony wykonywać dalszy program. Zamotałem, więc może przykład:
    If Przycisk = 0 Then
       Waitms 20
       If Przycisk = 0 Then
          A = A + 1
          B = B + 2
          'itd....
          Gosub Podprogram
       End If
    End If

    Sam często tak robię.
    Pozdrawiam i powodzenia
    Andy
  • #17 6576328
    marrog
    Poziom 22  
    Witam no i teraz zegarek działa, dzięki wszystkim za cenne uwagi i pomoc. pewnie jeszcze nie raz o coś Was zapytam.

    Witam ponownie

    zamontowałem na i2c expander pcf8574 - 2szt. zrobiłem sobie zmienną typu single i do niej przypisałem "urządzenia" którymi będę sterować przy pomocy expandera ( wiadomo poprzez przekaźnik).
    Czyli mam coś takiego:
    
    dim ex1 as byte  ' dla expandera nr 1 
    dim ex2 as byte  ' dla expandera nr 2
    
    urz1 Alias Ex1.0
    urz2 Alias Ex1.1
    urz3 Alias Ex1.2
    urz4 Alias Ex1.3
    ........
    

    no i teraz wystarczy że w programie będę używać
    np.

    ale aby to zapisać na expandera muszę wysłać to po i2c czyli zrobiłem sobie podprogram do zapisu ale dla obu układów z osobna, gdyż mam dwie różne zmienne ( czyli dwa identyczne podprogramy tylko każdy zapisuje inną zmienną), tylko nieco uciążliwe jest wpisywanie zawsze gdy chcę zmienić stan danej końcówki na exp:
    
    Set urz1
    Gosub Pcf_zap_ex1
    Reset urz1
    Gosub Pcf_zap_ex1
    

    czy jest jakiś inny sposób niż wyżej przedstawiony?
    Na razie nic nie przychodzi mi do głowy.
    może da radę użyć jednego podprogramu i przekazywać zmienna np w formie funkcji a nie podprogramu ( sub).
    Tylko czy nie będzie się wysypywał procek?
    Bo czasem jak wchodzę w menu i się w nie zagłębiam i później chcę wyjść ( wrócić wyżej) to się wysypie i muszę go resetować :/ - nie wiem jeszcze jak z tym sobie poradzić.
  • #18 6578600
    janbernat
    Poziom 38  
    "zrobiłem sobie zmienną typu single"-czy Ty wiesz co deklarujesz i po co?
    Czy te dwa " pcf8574 - 2szt." mają różne adresy?
    To nie PC pod "Windą" gdzie możesz sobie szastać pamięcią i gdzie urządzenia peryferyjne mają "sztywne" adresy.
    Sprawdź adresy pcf8574 "programikiem"-bo mogą oba reagować na to samo polecenie.
  • #19 6578729
    marrog
    Poziom 22  
    Witam

    No właśnie sprawdzałem pojedynczo te kości, a nie jak są obie wmontowane i tej jednej w ogóle nie wykrywa.
    No widzę, że to nie winda i pomału kurczy się pamięć.
    Co masz na myśli "czy wiem co deklaruje i po co?"
    Myślałem, że tak można, no nie wiem jak inaczej zmieniać stan końcówki na expanderze, nie zmieniając pozostałych ( a ten mój sposób jakoś poprawnie działa :-)

    Jeszcze pytanie, co rozumiesz przez urządzenie peryferyjne? czy urządzenie które będzie podpięte pod całą konstrukcję - wykonawcze np. siłownik, czy np. kość pcf8574?
    Jeśli urządzenie wykonawcze, to będą na sztywno podpięte więc adres wydaje mi się że mógłby być sztywny?
  • Pomocny post
    #20 6578957
    janbernat
    Poziom 38  
    "single"-zajmuje cztery bajty - a Ty wykorzystujesz jeden.
    Więc nie single a byte-chyba że naprawdę trzeba.
    Dla pcf8574 można ustawić 8 adresów sprzętowo-jak mię pamięć nie myli-ściągnij datasheet.
    A0-A3 do + lub gnd.(to adresy)
    Jest jeszcze pcf8574A-jeszcze 8 adresów.
    Urządzenie peryferyjne-to nie jak ja to rozumiem-tylko jak jest.
    Peryferia w procesorze-przetworniki ADC, komparatory, liczniki, UART, CAN itp.-tak są nazywane.
    Tak nazywają je producenci.
    A to co na zewnątrz procesora- to są Twoje peryferia-masz je obsłużyć jak możesz i potrafisz.
    Producenci teraz starają się mikroprocesory wyposażyć w dużą ilość urządzeń peryferyjnych-no bo nie musisz kupować dodatkowych.
  • #21 6579003
    marrog
    Poziom 22  
    Heh zle wpisalem w opisie, janbernat zobacz w listingu jak zadeklarowalem zmienna - jako byte, a nie wiedzieć dlaczego w opisie użyłem (omyłkowo) single. Dlatego zdziwił mnie Twój post i pytanie cyz wiem co robię - no ale dobrze że zwróciłeś uwagę na to :-)
    Zgadza się masz 2^3 możliwości ustawienia adresów sprzętowo i ja mam ustawiony adres. Tylko przy pomocy zmiennej typu byte ( zmienna EX1 i EX2 odpowiednio dla expanderow) przypisałem sobie końcówkę expandera pod konkretne urządzenie którym będę sterować ( te moje peryferia).
    Korzystam z Atmega16, mam już zegar uruchomiony, pamięć AT24c04 i do niej zapisuje nastawy różnych parametrów, zrobiłem menu, ale zajmuje dużo pamięci, będę musiał pomyśleć nad czymś optymalnym.
    Teraz jeszcze problem jaki pojawia się to jak zapisywać do dwóch( lub więcej) expanderów przy wykorzystaniu jednego podprogramu stanu wyjść, ja zrobiłem to jako dwa osobne podprogramy dla każdej kości po jednej, ale myślę nad czymś lepszym - tamto to tak na szybko.

    Jutro pomęczę ten problem, a później jeszcze rs485, potrzebuje go do komunikacji między Atmega16 a czujnikiem SHT11 który dodatkowo podpięty będzie pod attiny2313 i po RS485 komunikacja na większe odległości ( mam nadzieje, że da radę na ok 50 - 100 m)
  • #22 6580234
    marrog
    Poziom 22  
    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
     0 1 0 0 A2 A1 A0 R/W

    a drugi
     0 1 1 1 A2 A1 A0 R/W 


    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?
  • #23 6582002
    Andy74
    Poziom 25  
    Witam.
    Od końca:
    Kwarce najlepiej użyć takie, by odchyłka prędkości transmisji była jak najmniejsza (poniżej 5% powinno być ok.). Bascom ułatwia ich dobór. Wybierz z głównego menu Options => Compiler => Communication. W okienku które się otworzy wpisz/wybierz pożądaną prędkość transmisji, oraz częstotliwość rezonatora, a poniżej możesz odczytać jaka będzie odchyłka. Jeśli transmisja przebiega tylko pomiędzy dwoma procesorami - nieważne jaka będzie odchyłka, byle na obydwu była zbliżona (max 5% różnicy).

    Jeśli nie bawiłeś się fuse bitami, to Atmega16 działa na wewnętrznym oscylatorze 1Mhz pomimo, że ma podpięty rezonator. Na temat konfiguracji fuse bitów napisano na Elektrodzie już tyle, że nie ma sensu tu powtarzać - poszukaj. Poza tym nie widzę w ostatnim listingu deklaracji częstotliwości ($crystal = 1000000)

    Problem z zawieszającym się procesorem może wynikać z nadpisywania obszaru zmiennych RAM przez rozrastający się stos. W programie masz dużo zagnieżdżonych podprogramów, i jeśli jeszcze korzystasz z przerwań, to jest to bardzo prawdopodobna przyczyna problemów. Proponuję zwiększyć ilość zarezerwowanego na stosy miejsca przez dodanie gdzieś na początku programu (np. po deklaracji częstotliwości rezonatora) dwóch linijek:
    $swstack = 64
    $hwstack = 64 

    Podane wartości możesz jeszcze zwiększyć w razie potrzeby np. dwukrotnie, ale nie przesadzaj, bo to zajmuje RAM przeznaczony na zmienne.
    Dodatkowo, jeśli używasz zmiennych typu single (którymi nas tu straszyłeś :)), lub konwersji pomiędzy formatami zmiennych, możesz zwiększyć rozmiar ramki, np.:
    $framesize = 32


    Pozdrawiam
    Andy
  • #24 6582043
    marrog
    Poziom 22  
    Witam
    Więc kiedyś zmieniałem przy ATmega16 kwarc,aby korzystać z zewnętrznego.
    Co do doboru, faktycznie jest i przy np. 8MHz i baud 9600 błąd to ok 0,16%, więc ustawić bym musiał na 8MHz atmeg16 aby korzystał z wewn. bo attiny korzysta z 8Mhz ( tak był ustawiony fabrycznie).
    Co do zawieszania - to tak myślałem że wina może leżeć po stronie stosu ( ale jednak za mało wiem,aby się wypowiadać).
    faktycznie nie podałem crystal w drugim listingu :-)
    zaraz poprawiam i zobacze co się będzie działo.
  • Pomocny post
    #25 6582106
    Andy74
    Poziom 25  
    marrog napisał:
    attiny korzysta z 8Mhz ( tak był ustawiony fabrycznie)

    dokumentacja ATtiny2313 napisał:
    Default Clock Source
    The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 programmed. The default clock source setting is the Internal RC Oscillator with longest start-up time and an initial system clock prescaling of 8. This default setting ensures that all users can make their desired clock source setting using an In-System or Parallel programmer.


    Mnie wychodzi 1MHz jak byk. :)
  • #26 6582179
    marrog
    Poziom 22  
    Heh, no jest opcja dzielenia przez 8 więc dałem disabled.
    i teraz powinno śmigać na 8MHz, atmege16 uruchomilem na wewn tez 8MHz, zmieniłem w programie $crystal = 8000000 w obu przypadkach i nadal mam odczyt 0 :-( nie przesyła tego co pownien.
  • #27 6582335
    Andy74
    Poziom 25  
    Cytat:
    Zlożyłem RS 485 wg schematu z EP

    Niewiele mi to mówi. Pamiętam jak przez mgłę jakiś artykuł nt. RS495 w EP, ale tyle że był. Daj schemat jak to zrobiłeś (najlepiej), lub link do rzeczonego artykułu, to pomyślimy. Może masz jakiś błąd z połączeniach, lub - w zależności od rozwiązania układowego - źle obsługujesz komunikację, ale trudno zgadnąć.
    Na Twoim miejscu najpierw skomunikował bym µPc za pomocą zwykłego UART'u, i dopiero po opanowaniu poprawnej transmisji przeniósł się na RS485. Odległość raczej nie będzie problemem, bo RS485 powinno działać nawet do 1km w zależności od szybkości transmisji i jakości kabla.

    Tyle na dziś, bo muszę wyjść do pracy. Odezwę się jeśli będzie potrzeba jutro.
    Powodzenia
    Andy
  • #28 6582365
    marrog
    Poziom 22  
    Witam

    oto RS485_EP

    Dodano po 1 [godziny] 14 [minuty]:

    A może ten attiny jest uwalony? Bo czasem jak chce go zaprogramować, to wyskakuje mi po weryfikacji ROM "Different at ......... jakąś wartość i za nic nie da się go zaprogramować, dopiero po jakiś kilkudziesięciu próbach łyknie program.
  • #29 6582955
    janbernat
    Poziom 38  
    Jak się czasem daje programować to nie jest uwalony.
    Uwalony procesor sam się nie naprawia.
    Jaki masz programator?
    Podejrzewam że do pinów MOSI, MISO lub SCK coś jest podłączone i tłumi sygnały z programatora-spróbuj przysłać schemat.
  • #30 6583245
    marrog
    Poziom 22  
    Witam
    Do pinow nie mam nic podpięte ( MOSI, MISO i SCK) tylko wpinam programator zgodny z STK200/300.

    Schematy ( mam trochę problem żeby umieścić swoje schematy gdyż nie korzystam ze swojego kompa teraz) ale są identyczne jeśli chodzi o sposób realizacji RS485 jak te z EP ( link wyżej ).
    Poza kondensatorami C1 i C2 oraz rezonatory ( korzystam z wewn. 8MHz)
    poniżej linki:
    Slave
    Master

    Jeśli te nie wystarczą to jutro rano umieszczę moje schematy - ale są identyczne jak te wyżej jeśli chodzi o RS485)
REKLAMA