Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 lis 2024, o 15:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 28 maja 2021, o 09:31 
Offline
Nowy

Dołączył(a): 28 maja 2021
Posty: 21
Pomógł: 0

Witam.
Proszę o poradę w języku C.
Próbuję sterować rejestrem przy pomocy SPI czyli ZEGAR, DANE i ZATRZASK z pinów:

#define MOSI (1<<PA6)
#define SCK (1<<PA4)
#define LT (1<<PA3)

i za Chiny nie mogę tego odpalić .

Wydaje mi się, że inicjalizacja powinna wyglądać tak :

DDRA |=MOSI|SCK|LT|LED;
USISR |=(1<<USIWM0)|(1<<USIWM1)|(1<<USICLK);

Natomiast wysyłka danych powinna wyglądać tak:

void wyslij_moj_bit(uint8_t y)
{
USIDR = y;
while (!(USISR & (1<<USIOIF)) );

LT_ON;
LT_OFF;

}

Z prockiem się łączę, debouncer Led mryga, taktowanie 8Mhz.
Proszę o info.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 maja 2021, o 18:30 
Offline
Użytkownik

Dołączył(a): 26 mar 2014
Posty: 34
Pomógł: 11

(1<<USIWM0) | (1<<USIWM1) = Two wire mode (I2C), a potrzebujesz ustawić Three wire mode (SPI).
(1<<USICLK) oznacza że sygnałem SCK musisz sterować programowo przez ustawianie tego bitu z 0 na 1 i z 1 na 0 podczas wysyłania bajtu w pętli while. Bit ten musi być ustawiany tylko w pętli while, usuń go z inicjalizacji. Brakuje też kasowana flagi USIOIF przed pętlą while.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2021, o 06:55 
Offline
Nowy

Dołączył(a): 28 maja 2021
Posty: 21
Pomógł: 0

Skoro ma być tryb trójprzewodowy to ustawię to tak:
USISR |=(1<<USIWM0); ???

Z sygnałem SCK rozumiem, że bitem USICLK będę sterował każdorazowo podczas nadawania?

Kasowanie flagi przed pętlą ma spowodować zablokowanie wysyłania (śmieci) zanim zacznie działać główna pętla?
Czy tak może być?
USISR &=~(1<<USIOF);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2021, o 09:14 
Offline
Użytkownik

Dołączył(a): 26 mar 2014
Posty: 34
Pomógł: 11

LukMeks napisał(a):
Skoro ma być tryb trójprzewodowy to ustawię to tak:
USISR |=(1<<USIWM0); ???

Tak, tylko rejestr USICR, a nie USISR.

LukMeks napisał(a):
Z sygnałem SCK rozumiem, że bitem USICLK będę sterował każdorazowo podczas nadawania?

Z każdym przejściem pętli while czyli 8 razy na wysłanie jednego bajtu.

Cytuj:
Kasowanie flagi przed pętlą ma spowodować zablokowanie wysyłania (śmieci) zanim zacznie działać główna pętla?
Czy tak może być?
USISR &=~(1<<USIOF);

Ma spowodować, że warunek w pętli while nie będzie cały czas równy false. Bez kasowania flagi program wyśle tylko jeden bajt, bo przy drugiej próbie flaga dalej będzie pokazywać że wysyłanie jest ukończone. I zauważ że "The flag is cleared if a logical one is written to the USIOIF".


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2021, o 08:51 
Offline
Nowy

Dołączył(a): 28 maja 2021
Posty: 21
Pomógł: 0

Czyli, że wysyłam bajt i kasuję flagę, wysyłam bajt i kasuję flagę... zgodnie z:
"...Clearing this bit will release the counter overflow hold of SCL ..." ??

PS Od prawie roku siedzę nad C i generalnie o większość zagadnień się otarłem ale temat flag jest mi obcy.
Wiem, ze "jak nie wiadomo o co chodzi to najlepiej zawsze zaglądać do noty" ale 'patrzę i nie widzę"

Dzięki kolego za pomoc. Procek siedzi już w sterowniku, poradziłem sobie bez adc. Jak przyjdzie nowy to wrócę do tematu.HEJ



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO