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

ATtiny13, bascom, funkcje czasowe źle działają

piotrek5001 18 Lut 2009 23:25 2279 14
  • #1 6171429
    piotrek5001
    Poziom 24  
    Witam!
    Programując ten kontroler mam poważny problem. Funkcje czasowe (waitms) nie działają tak jak trzeba. Program w stylu:
    
    do
     dioda = 1
     waitms 500
     dioda = 0
     waitms 500
    loop
    

    powoduje miganie diody w bardzo nie regularnych odstępach czasu - widać to "gołym okiem". Na dodatek trudno nazwać te odstępy "pół sekundy".

    Sytuacja jest podobna przy różnych ustawieniach $crystal - zmienia się częstotliwość migania, jednak nie mierzy tak jak trzeba.

    Na początku mam jeszcze:
    
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    

    Bez tego nie idzie zadeklarować żadnej zmiennej - "out of SRAM".


    Jak rozwiązać problem? Jaka powinna być wartość $crystal jeżeli nie podłączam zewnętrznego źródła taktowania i nie grzebałem w fusebitach?

    Proszę o pomoc.


    P.S.
    Programując inne procki (atmega8, attiny 2313) nigdy się z tym nie spotkałem.
  • Pomocny post
    #2 6171480
    dawid512
    Poziom 32  
    Za pewne nie wziąłeś pod uwagę fuse bitów które oryginalnie ustawiają zegar tak aby pracował z częstotliwością 1MHz. Wystarczy wpisać magiczne:
    $Crystal = 1000000
    i po kłopocie :)
  • Pomocny post
    #3 6171835
    wader_669
    Poziom 28  
    zapoznaj sie z fusebitami. Czy ty chcesz dokladnie odmierzyc 500 milisekund czy okolo? Jak chcesz dokladnie otrzymac to kwarc zew. i timery.
    A masz zew. ram podlaczony? nie wiem jak chcesz jakas zmienna zdeklarowac poza pamiecia sram chyba ze chodzi ci o pamiec stala eeprom
  • Pomocny post
    #4 6171854
    Elektrooonik
    Poziom 29  
    dawid512 napisał:
    Za pewne nie wziąłeś pod uwagę fuse bitów które oryginalnie ustawiają zegar tak aby pracował z częstotliwością 1MHz. Wystarczy wpisać magiczne:
    $Crystal = 1000000
    i po kłopocie :)

    W bascomie nie robiłem nic kilka lat ale oprócz dyrektywy crystal w programie mozna tez ustawic wartosc kwarcu w ustawieniach kompilatora

    Co do wypowiedzi poprzednika, zapoznaj sie z fusebitami, odpal datasheeta atmela masz tam tabelke z wartosciami fusow dla kazdej czestotliwosci taktowania
  • Pomocny post
    #5 6172046
    K_o_n_r_a_d
    Poziom 23  
    pioszura napisał:
    powoduje miganie diody w bardzo nie regularnych odstępach czasu - widać to "gołym okiem". Na dodatek trudno nazwać te odstępy "pół sekundy".
    ...
    Na początku mam jeszcze:
    
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    

    Bez tego nie idzie zadeklarować żadnej zmiennej - "out of SRAM".
    Dyrektywa CRYSTAL tylko informuje kompilator o częstotliwości generatora. Nigdy nie używałem tak małego AVRa ale wiem, że niektóre z nich mają bardzo mało pamięci SRAM i w Bascomie do poprawnej obsługi potrzebna jest dyrektywa $TINY.

    pioszura napisał:
    powoduje miganie diody w bardzo nie regularnych odstępach czasu
    Dyrektywa CRYSTAL w tym problemie nie pomoże. Wpłynie tylko na okres migania, ale nie na stabilność.
  • #6 6172105
    piotrek5001
    Poziom 24  
    Witam,
    Dyrektywa:
    
    $Crystal = 1000000
    

    nic nie daje.

    Nie zależy mi na odliczaniu idealnych odstępów czasu, mają być to odstępy między "uderzeniami przekaźnika". Jednak w tej sytuacji, nieraz "waitms" zadziała tak że przekaźnik nie zdąży się załączyć, a nieraz czekam dobrych kilka sekund (waitms 500).

    Zgadza się, procesor ma mało SRAM-u, ale jednak ją posiada - i mogę ją użyć dopiero po deklaracji zmniejszającej stos sprzętowy - inaczej deklaracja zmiennej kończy się "OUT OF SRAM:.

    Dyrektywa:

    Uniemożliwia mi zadeklarowanie jakiejkolwiek zmiennej: "not possible with $tiny".

    Na Atmedze8, Attiny2313 - też bez zewnętrznego kwarca - żadnych problemów nie było. Może jakiś błąd w Bascomie? Spróbuję się przełamać i napisać w C, jednak wcześniej - ostatnia szansa - spróbuję zrobić w bascomie na Timerze.

    Dziękuję za odpowiedzi i proszę o dalsze uwagi (jeśli ktoś wie o co tutaj może chodzić) :).
    Pozdrawiam.
  • Pomocny post
    #7 6173314
    sp3ots
    Poziom 38  
    Witam !
    Spróbuj ten program wgrać do Tinki13 z fusami fabrycznymi, powinno być ok.
    
    $regfile = "ATtiny13.DAT"
    $crystal = 1200000       '9600000 / 8 = 1200000
    Config Pinb.0 = Output
    Portb.0 = 0
    Led Alias Portb.0
    
    Do
    Led = 0
    Waitms 500
    Led = 1
    Waitms 500
    Loop
    End
    

    Pozdrawiam. Stefan amator GG6293398
    ATtiny13, bascom, funkcje czasowe źle działają
  • #8 6173342
    wader_669
    Poziom 28  
    jestem ciekaw efektu. Jak teraz ci zadziala to znaczy, ze miales zle ustawione fusebity. Poczytaj datasheet'a i tematy na elektrodzie.
  • #9 6173379
    janbernat
    Poziom 38  
    Z opisu Help Copyright by Zbigniew Gibek:
    Instrukcja WAITMS ...wpisuje do rejestrów R24 oraz R25...
    oraz używa R30 oraz R31.
    A framesize jest domyślnie 24...
    A nie 8.
    Coś mi dzwoni, ale nie wiem w którym kościele...
    PS.
    Pan Z.G. gdzieś tu chyba krąży na tym forum...
  • #10 6173418
    piotrek5001
    Poziom 24  
    Nie działa, jedyne co zmieniłem to zamiast nóżki "0" ustawiłem "2" - tam mam przekaźnik sterowany tranzystorem NPN.
    Dodam, że program napisany w C (i po wyłączeniu preskalera (przez 8 ) w fusach:
    
    #include <avr/io.h>
    #define F_CPU 9600000 
    #include <util/delay.h>
    void main(void)
    {
    	DDRB = 0b00000100;
    	for(;;)
    	{
    		PORTB = 0b00000100;	
    		_delay_ms(100);	
    		PORTB = 0b00000000;
    		_delay_ms(100);
    	}	
    }
    

    ...też nie działa jak powinien. Generuje różne odstępy czasu, raz szybciej, raz wolniej, czasem ma kilkusekundową przerwę aż w końcu się zawiesza. Za każdym razem inaczej.

    Program u mnie steruje przekaźnikiem przez tranzystor. Zasilany (razem z przekaźnikiem) jest przez stabilizator 78L05, nie jest obciążony niczym więcej więc raczej wykluczam niestabilność zasilania.

    Mam dwie sztuki, obie zachowują się tak samo, więc uszkodzenie uC też raczej wykluczam.


    Jakieś inne rady? Bo ja już nie wiem, to jest strasznie dziwna sprawa.


    P.S.
    W fusach mam tylko "Calibration0" inaczej niż kolega zamieścił na Screenie.
  • Pomocny post
    #11 6174124
    wader_669
    Poziom 28  
    Jak z kondensatorami ? Diode na przekazniku masz? Moze zrob osobny uklad stabilizujacy dla przekaznikow
    albo narazie jak ci jeszcze nie dziala w pelni uklad, dalej testuj na diodach. Wtedy bedzie mozna wykluczyc ze cos jest z tranzystorem i przekaznikiem.
  • #12 6174248
    piotrek5001
    Poziom 24  
    wader_669 napisał:
    Jak z kondensatorami ? Diode na przekazniku masz? Moze zrob osobny uklad stabilizujacy dla przekaznikow
    albo narazie jak ci jeszcze nie dziala w pelni uklad, dalej testuj na diodach. Wtedy bedzie mozna wykluczyc ze cos jest z tranzystorem i przekaznikiem.


    Ok, odłączę później ten przekaźnik i na diodzie popróbuję. Bo nic innego mi do głowy nie przychodzi - jak już w C nie działa to pewnie żeczywiście coś z tym obciążeniem portu.

    Napiszę o efektach, ale chyba dopiero jutro się tym zajmę.
  • #13 6174543
    dawid512
    Poziom 32  
    IMHO jeżeli przykładowo opóźnienie 500ms nie wynosi tyle lub nawet nie jest do tego podobne to widocznie jest rozbieżność pomiędzy ustawieniem fuse bitów a deklaracją częstotliwości w programie. Jeżeli zaś te rozbieżności ciągle się zmieniają to być może oscylator się rozkalibrowuje. Istnieje rejestr OSCCAL który umożliwia "dostrajanie" oscylatora.
  • #14 6174613
    crazy_phisic
    VIP Zasłużony dla elektroda
    Sprawdziłeś ustawienia WATCHDOG'a (bit WDTON)?
  • #15 6177314
    piotrek5001
    Poziom 24  
    Witam.
    No i aż wstyd się przyznać. Podłączyłem zamiast przekaźnika diodę i działa.

    Widocznie obciążenie portu jest za duże, zwiększę opornik, wstawię diodę żeby puszczała prąd tylko w jedną stronę i powinno być dobrze.


    Dziękuję wszystkim za udział w dyskusji i przepraszam że zamiast sprawdzić to od razu zawracałem głowę. Ale tak to jest, płytka wytrawiona, niby wszystko powinno działać a nie działa.


    Pozdrawiam.
REKLAMA