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

[Bascom] Zerujące się zmienne bitowe w Bascom AVR 1.11.6.8 na AT90S2313

Miar 15 Paź 2009 18:28 1763 7
REKLAMA
  • #1 7132307
    Miar
    Poziom 12  
    Posty: 97
    Pomógł: 2
    Ocena: 35
    program napisany w bascom avr wersja 1.11.6.8 stara dla at90s2313
    problemem są zerujące się zmienne bitowe
    program uruchamiam na płytce testowej avt 3500 tu link do opisu http://www.cyfronika.com.pl/kityavt3/avt3500pdf.pdf
    program nie ma błędów z kompilacją na wyświetlaczach jest 00
    gdy symuluje program zmienne temp i odczyt zerują się cały czas
    a oto program:

    'Sterownik pieca CO
    Dim Jednostki As Byte , Dziesiatki As Byte       '  cyfry do wyświetlania temperatury
    Dim Temp As Byte         ' temperatura
    Dim Pompka As Bit        ' sterowanie pompką
    Dim Odczyt As Byte
    Dim Cyfrybcd As Byte
    Dim Ktorywysw As Bit
    Enable Interrupts        ' oblokuj przerwania
    Enable Timer0            'odblokuj timer0
    Enable Timer1            'oblokuj timer1
    Config Timer0 = Timer , Prescale = 64       'dziel częstotliwość przez 64
    Config Portb = 255 : Portb = 255       'konfiguracja portu B (cały port jako wyjścia)
    Config Portd = 127 : Portd = &B1111100       'konfiguraja portu D dwa najmłodsze jako wejścia S1 i S2 reszta wyjścia
    On Timer0 Co4ms          'obsługa przerwania dla wyświetlaczy
    On Timer1 Co1s
    Temp = 65
    Do : Loop : End          'pusta pętla
    
    Co1s:
    Gosub Odczytaj
    If Temp > 50 Then        'start pompki
    Portd.2 = 0              'włącz pompkę     0 to 1 a 1to 0
    End If
    If Temp < 50 Then        'stop pompki
    Portd.2 = 1              'wyłącz pompkę
    End If
    Return
    
    Co4ms:                   ' tylko obsługa wyświetlaczy
    Toggle Ktorywysw
    Temp = Odczyt
    'If Odczyt > 99 Then      'bo skracamy do 99 dla bcd
    'Odczyt = 99              'skracanie do 99 na wypadek gotowania wody w piecu
    'End If
    Cyfrybcd = Makebcd(odczyt)       'konwersja bcd
    Jednostki = Cyfrybcd And 15
    Dziesiatki = Cyfrybcd
    Shift Dziesiatki , Right , 4       'a tu koniec konwersji bcd
    Select Case Ktorywysw
    Case 0:
    Portd = &B1110111
    Portb = Lookup(jednostki , Tabela)
    Case 1:
    Portd = &B1101111
    Portb = Lookup(dziesiatki , Tabela)
    End Select
    Return
    
    Odczytaj:
    Portb = 255              'wygasza wyświetlacze
    I2cinit                  'umożliwia pracę szyny
    I2cstart                 'sygnał startu magistrali I2C
    I2cwbyte 145             'wyślij adres "odbiorczy" PCF8591
    I2crbyte Temp , Nack     'z przetwornika do zmiennej Odczyt
    I2cstop                  'sygnał stopu magistrali I2C
    Config Portd = &B1111100 'znów PD.5 i PD.6 są wyjściami
    Return
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144



    Skorygowałem tytuł.
    [zumek]
  • REKLAMA
  • Pomocny post
    #2 7132381
    marihires
    Poziom 30  
    Posty: 986
    Pomógł: 193
    Ocena: 129
    A spróbuj tak:


    Dim Jednostki As Byte , Dziesiatki As Byte       '  cyfry do wyświetlania temperatury
    Dim Temp As Byte         ' temperatura
    Dim Pompka As Bit        ' sterowanie pompką
    Dim Odczyt As Byte
    Dim Cyfrybcd As Byte
    Dim Ktorywysw As Bit
    Enable Interrupts        ' oblokuj przerwania
    Enable Timer0            'odblokuj timer0
    Enable Timer1            'oblokuj timer1
    Config Timer0 = Timer , Prescale = 64       'dziel częstotliwość przez 64
    Config Portb = 255 : Portb = 255       'konfiguracja portu B (cały port jako wyjścia)
    Config Portd = 127 : Portd = &B1111100       'konfiguraja portu D dwa najmłodsze jako wejścia S1 i S2 reszta wyjścia
    On Timer0 Co4ms          'obsługa przerwania dla wyświetlaczy
    On Timer1 Co1s
    Temp = 65
    Do : Loop : End          'pusta pętla
    
    Co1s:
    Gosub Odczytaj
    If Temp > 50 Then        'start pompki
    Portd.2 = 0              'włącz pompkę     0 to 1 a 1to 0
    End If
    If Temp < 50 Then        'stop pompki
    Portd.2 = 1              'wyłącz pompkę
    End If
    Return
    
    Co4ms:                   ' tylko obsługa wyświetlaczy
    Toggle Ktorywysw
    Temp = Odczyt         'temp otrzymuje wartość Odczyt, której wartość wynosi ...?? 
                                   'a powinno być tak żeby Odczyt otrzymał wartość Temp.
    'If Odczyt > 99 Then      'bo skracamy do 99 dla bcd
    'Odczyt = 99              'skracanie do 99 na wypadek gotowania wody w piecu
    'End If
    Cyfrybcd = Makebcd(odczyt)       'konwersja bcd
    Jednostki = Cyfrybcd And 15
    Dziesiatki = Cyfrybcd
    Shift Dziesiatki , Right , 4       'a tu koniec konwersji bcd
    Select Case Ktorywysw
    Case 0:
    Portd = &B1110111
    Portb = Lookup(jednostki , Tabela)
    Case 1:
    Portd = &B1101111
    Portb = Lookup(dziesiatki , Tabela)
    End Select
    Return
    
    Odczytaj:
    Portb = 255              'wygasza wyświetlacze
    I2cinit                  'umożliwia pracę szyny
    I2cstart                 'sygnał startu magistrali I2C
    I2cwbyte 145             'wyślij adres "odbiorczy" PCF8591
    I2crbyte Temp , Nack     'z przetwornika do zmiennej Odczyt  // <--- do zmiennej Temp
    I2cstop                  'sygnał stopu magistrali I2C
    Config Portd = &B1111100 'znów PD.5 i PD.6 są wyjściami
    Return
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
  • REKLAMA
  • #3 7132533
    Miar
    Poziom 12  
    Posty: 97
    Pomógł: 2
    Ocena: 35
    tak wyświetla 65 (ustalona wartość na początku programu) ale nie czyta z przetwornika analogowo-cyfrowego pcf8591 wartość sie nie zmienia
  • REKLAMA
  • Pomocny post
    #4 7132650
    marihires
    Poziom 30  
    Posty: 986
    Pomógł: 193
    Ocena: 129
    Powiem tak:
    Nie znam się na BASCOMie ale widzę, że END kończy program a dokładnie pustą pętlę w której powinien znajdować się odczyt z przetwornika i wyświetlanie, używając napisanych przez Ciebie funkcji.
    Przykładowo

    siała baba mak.../deklaracja zmiennych

    Do /pętla główna programu wykorzystująca twoje funkcje
    ODCZYT
    WYSWIETL
    Loop
    END

    ODCZYT:
    bla bla bla
    return

    WYSWIETL:
    bla bla bla
    return
  • #5 7132787
    Miar
    Poziom 12  
    Posty: 97
    Pomógł: 2
    Ocena: 35
    Poprawiło się wyświetlacze nie migotają, temperatura się poprawnie wyświetla, jutro poskładam to do kupy i zrobię coś porządnego dodam jeszcze jakieś termostaty i będzie dobrze (chyba). Dzięki:!:
  • REKLAMA
  • #6 7133797
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1497
    Tak był błąd w przypisaniu zmiennych na odwrót.
    Mnie ciekawi tylko gdzie są wartości początkowe timerów ?
    Aco za tym idzie skąd to przekonanie że timer1 wywołuje przerwanie co sekundę ?
    Co do Timera0 też nie jestem pewien czy przerwanie jest co 4ms ?
    A jaka jest częstotliwość taktowania ?
    i gdzie jest dyrektywa $crystal ?
    W dodatku w podprogramie obsługi przerwania masz gosub zupełnie niepotrzebnie. Grozi to rozrastaniem stosu i "malinkami".
  • #7 7135837
    Miar
    Poziom 12  
    Posty: 97
    Pomógł: 2
    Ocena: 35
    W ustawieniach bascoma mam 4mhz i kwarc 4mhz
    dzielone przez 64 w preskalerze i 256 w timer0 dają ok 4ms
    timer1 ma 65536 co daje ok 1s
  • #8 7137540
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1497
    No dobra pal licho dokładność odmierzania czasu. Tu nie jest aż tak ważna.
    Ale timer1 nie jest skonfigurowany . Pomiar nie ma prawa się odbywać, bo przerwanie od timera1 nie jest wywoływane, a co za tym idzie cała procedura "co1s" ,
    a także ten podprogram "Odczytaj" również nie.
    Nawiasem mówiąc po co on jest ? Nie lepiej zamiast gosub po prostu przenieść zawartość tego podprogramu do obsługi przerwania ?

    i jeszcze jedna sprawa:
    Pompa załacza się jeśli temp jest wieksza niż 50 i włącza się jeśli spadnie poniżej 50
    Podejrzewam, że dalej masz przekaźnik co nią steruje.
    Pomiar (jeśli poprawisz obslugę przerwania) następuje co 1,04 sekundy. W przpadku gdy temperatura spadnie lub wzrośnie o jeden stopień bedziesz miał załaczaniei wyłączanie co chwilę. Może tak zakładałeś, ale ja bym dał albo jakiś przedział temperatur, lub wykorzystując timer1 stworzył kilka zmiennych pomocniczych (jak w zegarze) i sterował pompą w dluższych okresach czasu niż jedna sekunda np. co minutę by dać troche czasu pompce na podziałanie lub odpoczynek. Jednoczesnie można nadal monitorować temperature co sekundę i w razie wystąpienia duzej temperatury włączyć obieg niezależnie.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu zerujących się zmiennych bitowych w programie napisanym w Bascom AVR w wersji 1.11.6.8 dla mikrokontrolera AT90S2313, uruchamianym na płytce testowej AVT 3500. Autor zgłasza, że zmienne bitowe takie jak "Pompka" oraz odczyty temperatury z przetwornika analogowo-cyfrowego PCF8591 nie zmieniają się i pozostają zerowe, a na wyświetlaczach pojawia się "00". Wskazano, że problem może wynikać z błędnej struktury programu, w szczególności z pustej pętli głównej zakończonej instrukcją END, co uniemożliwia wykonywanie odczytów i aktualizacji wyświetlacza. Sugerowano przeniesienie kodu odczytu i wyświetlania do pętli głównej lub obsługi przerwań. Zwrócono uwagę na niepełną konfigurację timera1, który nie jest poprawnie ustawiony do generowania przerwań co sekundę, co blokuje wywoływanie procedury odczytu temperatury. Omówiono także kwestie konfiguracji preskalera i częstotliwości taktowania (4 MHz z preskalerem 64), co daje przerwania timer0 co około 4 ms oraz timer1 co około 1 s. Wskazano ryzyko problemów ze sterowaniem pompą CO przy bezpośrednim włączaniu i wyłączaniu przy temperaturze 50°C bez histerezy, co może powodować częste przełączanie. Zalecano wprowadzenie zakresu temperatur lub opóźnień czasowych w sterowaniu pompą. Podsumowując, poprawna obsługa przerwań, właściwa struktura programu oraz odpowiednia konfiguracja timerów są kluczowe do rozwiązania problemu zerujących się zmiennych i poprawnego działania sterownika pieca CO.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA