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

[Rozwiązano] Atmega 8/88P: delay_ms nie działa przy użyciu Timer0 z preskalerem

rafcio12323 09 Lut 2019 02:50 477 8
  • #1 17764566
    rafcio12323
    Poziom 5  
    Witam, mam dosyć nietypowy problem , otóż gdy chcę zaprogramować sobie Atmegę 8/ 88P (w obu przypadkach dzieje się tak samo) to po próbnym odpaleniu wyświetlacza 7-segmentowego napotkałem problem a mianowicie:
    Jeśli chcę ustawić jakikolwiek preskaler w Timerze 0 to funkcja delay przestaje działać, obojętnie czy wstawie tam 1ms czy 1000.
    Po prostu program się jakby zacina na pierwszym rozkazie w pętli while(1)...
    Jeśli ustawię rejestr TCCR0B |= 0x00 lub TCCR0B |= 0x0f to delay znowu działa
    Nie wiem co może być nie tak, programator? Procki odpadają bo wziąłem 2 inne i to samo mam

    Procek taktowany 8Mhz , wewnętrzny oscylalator, Programator USB ASP

    Edit:
    Zauważyłem że dzieje się tak tylko przy Timerze0 , jeśli ustawię Timer 1 lub 2 i włączę preskaler na jakikolwiek to program się odpala.
    Ale denerwuje mnie trochę to że nie mogę użyć jednego z Timerów :/
  • #2 17764617
    excray
    Poziom 41  
    Załącz kod programu
  • #3 17764631
    dasej
    Poziom 32  
    Witam.

    A skąd w Atmega8 wziąłeś rejestry TCCR0B , TCCR0B.
    Timer0 i _delay_ms() razem działają.
    Masz co nie tak w swoim kodzie. Pisał już @excray dodam tylko pełny.
    Możesz powyrzucać wszystko co jest nie potrzebne i zostawić sam błąd.
  • #4 17764692
    rafcio12323
    Poziom 5  
    Chodziło mi także o ATmegę 88P, a tam już znajduje się rejestr TCCR0B. Ale do rzeczy.
    Dzisiaj rano wstałem i zaczęły się dziać jeszcze inne rzeczy. A mianowicie:
    Gdy ustawię sobie preskaler jakikolwiek w rejestrze TCCR0B to program o dziwo rusza. Ale jeśli dodam funkcję "sei()" to program już nie startuje.
    Jeśli natomiast zostawię tą funkcję sei(), i zmienię rejestr z TIMSK0 , na TIMSK1 to program znowu rusza.
    Wczoraj program nie chciał działać gdy ustawiałem preskaler TIMERA0. Dzisiaj o dziwo rusza ale nie pasuje mu funkcja sei();
    Spoiler:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "number.h"
    
    uint8_t tab1[] = {C0,C1,C2,C3,C4,C5,C6,C7,C8,C9};
    uint8_t x=0;
    
    int main(void) {
    
    	sei();
    
    	DDRB |= 0xff;
    	PORTB |= 0x0f;
    
    	DDRD |= 0xff;
    	PORTD |= 0x00;
    
    	TCCR0B = (1<<CS00)|(1<<CS02);  // preskaler 1024
    	TCNT0 = 230;
    	TIMSK0 = (1<<TOIE0);
    
    
    
    
    	while(1) {
    			for(x=0;x<10;x++) {
    			PORTD = tab1[x];
    			_delay_ms(200);
    		}
    	}
    }



    Plik number.h to moja biblioteka , króciutka , zawiera tylko opis który segment należy do jakiego PINU, i potem cyfra z których segmentów się składa.
    Jeśli zakomentuję funkcję sei(); to program rusza.
    Jeśli sei() działa normalnie i zakomentuję TCCR0B = (1<<CS00)|(1<<CS02); to program też rusza,
    To samo z TIMSK0 |= (1<<TOIE0);
  • #6 17764706
    rafcio12323
    Poziom 5  
    Nie robiłem nawet obsługi przerwania bo jeśli po ustawieniu TIMERA0 program mi stał to dalej nawet nie robiłem już.
    Bo bez sensu napisac 100 linijek kodu a potem godzinami sprawdzać czemu nie działa.
  • Pomocny post
    #7 17764721
    dasej
    Poziom 32  
    Wysyłasz procesor pod przerwanie którego niema.
    To jak myślisz co biedny procesor ma robi jak tam niema nic.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To musi być dodane. Resztę zrobi kompilator i przestanie się zawieszać.
  • #8 17764731
    rafcio12323
    Poziom 5  
    Miałeś rację, dodałem tam pare linijek w przerwaniu , JAK i samą obsługę przerwania i wydaje się działać.
    Dzieki wielkie za pomoc, całe życie sie czegoś uczymy.
    Pozdrawiam i można zamknąć
  • #9 17764733
    rafcio12323
    Poziom 5  
    Miałeś rację, dodałem tam pare linijek w przerwaniu , JAK i samą obsługę przerwania i wydaje się działać.
    Dzieki wielkie za pomoc, całe życie sie czegoś uczymy.
    Pozdrawiam i można zamknąć
REKLAMA