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

[Atmega8][C] Sprzętowe TWI

Logan 11 Lut 2012 18:35 2514 14
REKLAMA
  • #1 10530137
    Logan
    Poziom 30  
    Witam

    Jako, że od niedawna uczę się języka C postanowiłem zająć się obsługą RTC DS1307. Jeśli komunikacja odbywa się wg noty katalogowej, czyli bez użycia przerwań to wszystko działa. Ja natomiast chciałbym skorzystać z ISR(TWI_vect).

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


    W terminalu dostaje:
    i dalej cisza...
  • REKLAMA
  • Pomocny post
    #2 10530176
    sulfur
    Poziom 24  
    Zgaduję, że problemem jest komunikacja po USART - wysyłanie znaków pewnie blokuje program w przerwaniu na spory odcinek czasu.
  • REKLAMA
  • #3 10530276
    Logan
    Poziom 30  
    Lepiej będzie w przerwaniu ustawiać jedynie flagę, a w głównej pętli programu odczytywać stan TWSR i wysyłać komunikaty?
  • REKLAMA
  • Pomocny post
    #5 10532352
    krru
    Poziom 33  
    Logan napisał:
    Lepiej będzie w przerwaniu ustawiać jedynie flagę, a w głównej pętli programu odczytywać stan TWSR i wysyłać komunikaty?


    I tak się nie wyrobisz, chyba że bardzo zwolnisz zegar I2C/TWI. Normalnie I2C działa na 100kHz, więc z prędkością zbliżona do maksymalnej dla RS232 (takiego typowego). Po prostu nie zdąrzysz nadawać po RS. Oczywiście ustawienie flagi spowoduje, że to przestanie przeszkadzać, ale procek nie zdąży zgasić tej flagi zanim nie wystąpi potrzeba jej ponownego ustawienia.
    Potrzebna byłaby jakaś kolejka, na tyle duża, zmieściła komunikaty wygenerowane przez cały cykl współpracy po I2C.
  • #7 10533259
    Logan
    Poziom 30  
    sulfur napisał:
    I nie ma takiego wynalazku jak
    TWCR &= (0<<TWINT);
    Jak w takim razie powinienem poprawnie zerować bit TWINT ? Dodam jeszcze, że tak samo zeruje bit TWSTA. Może tu leży problem.

    krru napisał:
    I tak się nie wyrobisz, chyba że bardzo zwolnisz zegar I2C/TWI. Normalnie I2C działa na 100kHz, więc z prędkością zbliżona do maksymalnej dla RS232 (takiego typowego). Po prostu nie zdąrzysz nadawać po RS.
    RS mam ustawiony na 38400, ale na razie całkowicie zrezygnuje z komunikatów, może tu leży przyczyna.

    mirekk36 napisał:
    Bufor cykliczny trzeba zorganizować na RS232 oraz wysyłanie na przerwaniach i po kłopocie.
    Tak zrobię, ale najpierw che uruchomić TWI.
  • #8 10533853
    polprzewodnikowy
    Poziom 26  
    Logan napisał:
    Jak w takim razie powinienem poprawnie zerować bit TWINT ?


    TWCR &= ~(1<<TWINT);
  • REKLAMA
  • Pomocny post
    #9 10533987
    dondu
    Moderator na urlopie...
    polprzewodnikowy napisał:
    Logan napisał:
    Jak w takim razie powinienem poprawnie zerować bit TWINT ?


    TWCR &= ~(1<<TWINT);


    A to czytałeś?:

    ATmega8 datasheet napisał:
    The TWINT Flag must be cleared by software by writing a logic one to it.


    Prawidłowe zerowanie TWINT:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 10533999
    polprzewodnikowy
    Poziom 26  
    Nie siedzę w AVRach więc o tym nie wiedziałem, podałem tylko prawidłowy sposób wpisania zera do odpowiedniego bitu.
  • #12 10534252
    mirekk36
    Poziom 42  
    polprzewodnikowy napisał:
    Nie siedzę w AVRach więc o tym nie wiedziałem, podałem tylko prawidłowy sposób wpisania zera do odpowiedniego bitu.


    Taka metoda kasowania flag sprzętowych, że zapisuje się tam jedynkę a nie zero wcale nie występuje tylko w AVR'ach ale także w innych rodzinach mikrokontrolerów.
  • #13 10538508
    Logan
    Poziom 30  
    Atmega8 datasheet napisał:
    This bit is set by hardware when the TWI has finished its current job and expects application
    software response. If the I-bit in SREG and TWIE in TWCR are set, the MCU will jump to the
    TWI Interrupt Vector. The TWINT
    Flag must be cleared by software by writing a logic one to it. Note that this flag is not automatically
    cleared by hardware when executing the interrupt routine.
    Also note that clearing this flag
    starts the operation of the TWI, so all accesses to the TWI Address Register (TWAR), TWI Status
    Register (TWSR), and TWI Data Register (TWDR) must be complete before clearing this
    flag.


    Teraz trochę zgłupiałem, jak to powinno wyglądać w programie. Dostaje przerwanie od TWI i co dalej? Jeśli nie wpisuje 0 do TWINT to program zapętla się w przerwaniu.
  • Pomocny post
    #14 10538633
    dondu
    Moderator na urlopie...
    Logan napisał:
    Teraz trochę zgłupiałem, jak to powinno wyglądać w programie. Dostaje przerwanie od TWI i co dalej? Jeśli nie wpisuje 0 do TWINT to program zapętla się w przerwaniu.


    Atmega8 datasheet napisał:
    The TWINT Flag must be cleared by software by writing a logic one to it.


    i poczytaj ten temat: https://www.elektroda.pl/rtvforum/topic815946.html#4185384
  • #15 10538736
    Logan
    Poziom 30  
    dondu napisał:


    OK, teraz jestem krok do przodu, ale program nie reaguje na TWI_start.

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


    Przy zapisie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    w ogóle nie występuje przerwanie od TWI, natomiast jak zmienię na to
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to sygnał START jest wysyłany i w TWSR pojawia się 0x08.

    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA