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

Konfiguracja RTT w SAM7 S256 do odczytu temperatury co sekundę

Tomekborow 12 Maj 2010 21:31 2304 10
REKLAMA
  • #1 8068415
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    Jak w temacie, jak napisać program do obsługi RTT? Potrzebuje aby z termometru 1-wire odczytywać co sekunde watość temp. chciałem użyć do tego RTT aby generował przerwanie, ale nie moge nic znaleźć o poprawnej konfiguracji w nocie katalogowej też nie wiele jest :( . Chyba że macie jakieś inne pomysły.
    ... delay nie wchodzi w gre, Timer Counter też odpada.
  • REKLAMA
  • #2 8068603
    august_a
    Poziom 21  
    Posty: 572
    Pomógł: 32
    Ocena: 4
    a może użyj PITa.
  • REKLAMA
  • #3 8068910
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    A też sie do tego nadaje? Jeśli tak to też nie wiem za bardzo jak go obsłużyć
  • #4 8071989
    Voytas
    Poziom 14  
    Posty: 173
    ja pracuje na SAM7X256 wiec nie wiem czy peryferia są podobne. u siebie uzylem do tego jeden z kanalow TC0-TC2 kontrolera licznikowo-czasowego TC. kanal musi pracowac w trybie Waveform Operating Mode.
  • REKLAMA
  • #5 8072994
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    TC też jest S256, ale TC ma wyjścia w postaci portów współdzielonych z PIO, więc bym musiał nie mieć nic podłaczone pod ten port?? Jak to z tym jest, no i chyba czas o wartości jednej sekundy sie nie da ustawić na TC
  • #6 8074246
    nenpa8lo
    Poziom 17  
    Posty: 260
    Pomógł: 15
    RTT: (Mruganie diodą) W przerwaniu musisz sprawdzić źródło przerwania
                       if (0 != (AT91C_BASE_RTTC->RTTC_RTSR & AT91C_RTTC_RTTINC))
                          {
                            rtt_irq_handler();
                          }
                    /* End the interrupt in the AIC. */
                    AT91C_BASE_AIC->AIC_EOICR = 0;

    Obsługa irq:
    void
    rtt_irq_handler (void)
    {
      rtt_sys_time = AT91C_BASE_RTTC->RTTC_RTVR;                                              // Update system timer (clear rtt irq).
    
      if (0 == (rtt_sys_time % 2))
        {
          AT91C_BASE_PIOA->PIO_CODR = 0x00000004;
        }
      else
        {
          AT91C_BASE_PIOA->PIO_SODR = 0x00000004;
        }
    }

    Pamiętaj, że w podstawowej konfiguracji RTT jest dosyć niedokładny (nie pamiętam dokładnie kilka/kilkanaście procent). Jeżeli chcesz uzyskać wyższą dokładność to musisz RTT 'skalibrować'. Jednak do twojej aplikacji podstawowa dokładność chyba wystarczy?
  • #7 8074954
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    a czy trzeba jakoś zaincjować ten RTT? w nocie katalogowej pisze żeby wpisać do rejestru RTTC_RTMR wartość 0x0008000 to wtedy okres odliczania będzie równy ok 1 sekundzie. a AIC też trzeba jakoś zkofigurować żeby przyjował przerwanie od RTT ?Czy trzeba coś jeszcze konfigurować>?
  • #8 8085410
    nenpa8lo
    Poziom 17  
    Posty: 260
    Pomógł: 15
    To przerwanie jest dzielone z PIT (to jest chyba IRQ0) i dlatego w obsłudze IRQ musisz sprawdzić źródło przerwania. Z inicjacją nie jestem pewien, sprawdzę wieczorem w swoich kodach.
  • #9 8103161
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    Udało mi się takie coś napisać, ale nie działa. Co źle robie?
    Nie umieszczasz kodu w odpowiednich znacznikach - poprawiłem.
    [zumek]

    void pitIsr(void);
    void PIT_init(void)
    {
    	uint32_t dummy;
    	AT91C_BASE_PITC->PITC_PIMR= ~(AT91C_PITC_PITEN | AT91C_PITC_PITIEN);
    	while (AT91C_BASE_PITC->PITC_PIVR & AT91C_PITC_CPIV ) {};
    	dummy=AT91C_BASE_PITC->PITC_PIVR;
    	const uint8_t PIT_IRQ_PRIORITY = 5;
    	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC , AT91C_ID_SYS , PIT_IRQ_PRIORITY , AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE , pitIsr );
    	AT91F_AIC_EnableIt ( AT91C_BASE_AIC , AT91C_ID_SYS );
    	
    	AT91C_BASE_PITC->PITC_PIMR=( 0xFFFFE | AT91C_PITC_PITEN | AT91C_PITC_PITIEN);
    	
    	
    }
    void pitIsr(void)
    {
    uint32_t status;
    uint32_t dummy1;
    	if(AT91C_BASE_PITC->PITC_PIMR | AT91C_PITC_PITIEN)
    	{
    		status=AT91C_BASE_PITC->PITC_PISR;
    		AT91C_BASE_PITC->PITC_PIMR= ~( AT91C_PITC_PITIEN);
    		if(status & AT91C_PITC_PITS)
    		{
    			dummy1=AT91C_BASE_PITC->PITC_PIVR;
    			lcdCls();
    			lcdLocate(1,0);
    			lcdText("123456789012345");
    			delay_ms(1000);
    			lcdCls();
    			
    		}
    		AT91C_BASE_PITC->PITC_PIMR= ( AT91C_PITC_PITIEN);
    	}
    }
  • #10 8103713
    nenpa8lo
    Poziom 17  
    Posty: 260
    Pomógł: 15
    1. Brak sygnalizowania zakończenia przerwania AT91C_BASE_AIC->AIC_EOICR = 0; na końcu pitisr()
    2. Nie możesz w przerwaniu wołać funkcji delay_ms()! Jest to zupełnie wbrew naturze przerwań. Przerwanie ma zająć mikro jeżeli nie nano sekundy i się zakończyć. Natomiast ty robisz delay_ms() w przerwaniu nie mówiąc już o innych funkcjach. Ja bym w przerwaniu zasygnalizował, że coś trzeba zrobić (ustawiając flagę) i w innym miejscu programu zrobił obsługę zdarzenia.

    Tak poza tematem, co Twój program ma robić?
  • REKLAMA
  • #11 8104302
    Tomekborow
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ocena: 58
    co do funkcji delay_ms to zrobilem to tylko aby zaobserwować że wystąpiło przerwanie.
    Program ma robić.....chociaż nie ten co jest npaisany, ale ma obsługiwać co 100 ms termometr One-wire

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat konfiguracji RTT w mikrokontrolerze SAM7 S256 do odczytu temperatury z czujnika 1-wire co sekundę. Użytkownik poszukiwał sposobu na implementację przerwań RTT, jednak napotkał trudności w dokumentacji. Uczestnicy sugerowali alternatywne podejścia, takie jak użycie kontrolera PIT oraz kanałów TC. Wskazano na konieczność poprawnej inicjalizacji RTT oraz AIC, a także na problemy z dokładnością RTT, która wymaga kalibracji. Użytkownik próbował zaimplementować obsługę przerwań, ale napotkał błędy w kodzie, takie jak brak sygnalizacji zakończenia przerwania oraz niewłaściwe użycie funkcji delay w kontekście przerwań.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA