Pytanie:
Bit Banging UART
Willem Ellis
2013-04-23 09:53:09 UTC
view on stackexchange narkive permalink

Mój pełny kod znajduje się tutaj.

Zasadniczo przesyłam do Arduino i nie otrzymuję prawidłowej wartości (zauważysz, że próbuję wysłać d'22 '). Oto metoda, w której tak naprawdę uderzyłem w transmisję:

  // Metoda przesyłania wartości za pomocą bitów szeregowych bangingvoid uart_tx_bit_bang (unsigned char val) {unsigned char i; Tx_Pin = 0; // Bit startowy uart_time_delay (); for (i = 8; i! = 0; --i) {if (val & 0x01) Tx_Pin = 1; // Rozpocznij od LSB else Tx_Pin = 0; val >> = 1; uart_time_delay (); } Tx_Pin = 1; // Bit stopu uart_time_delay ();}  

Ponieważ opóźnienie powinno wynosić 1 / baud, uart_time_delay () powinno wynosić 104us. Używam __delay_us (104) z bibliotek PIC. Każda pomoc w tej sprawie jest bardzo mile widziana.

Jestem pewien, że używam prawidłowej szybkości transmisji na obu końcach.

UART faktycznie najpierw wysyłają LSB.
Ten kod wysyła najpierw LSB
Jaką wartość otrzymujesz? Wiedza, że ​​to pomoże w rozwiązywaniu problemów.
Otrzymywałem kilka różnych wartości, a nie tylko jedną stałą.
@markrages, tak, masz rację, odwróć kolejność pętli i skomentuj przeze mnie
Przepraszam za komentarz. Zaadaptowałem to z innej procedury uderzania bitów i zapomniałem zmienić komentarza.
Czy serial nie ma odwróconych poziomów? Z wiki: „Dla linii transmisji danych (TxD, RxD i ich odpowiedników w kanałach wtórnych) logikę definiuje się jako napięcie ujemne” Chociaż nie wyjaśniałoby to faktu, że odbierane dane się zmieniają. Myślę, że bit stopu też jest niski, patrząc na seryjne ślady wiki.
Ponadto opóźnienie nie wynosi dokładnie 1 / baud, chyba że zapis do portu nie zajmuje czasu. Chociaż jeśli używasz 300 bodów, szybkość wykonywania instrukcji będzie nieistotna. Z jaką częstotliwością zegara pracuje Twój PIC?
Używam wewnętrznego oscylatora 4 MHz. I 9600 bodów
I łączysz się z szeregowymi pinami TX / RX sprzętu Arduino?
Wszystko, co robię, to transmitowanie z mojego PIC do Arduino. Więc mam mój `Tx_Pin` na PIC podłączonym do Rx na Arduino.
@angelatlarge tylko poziomy RS-232 są odwrócone. W mikrokontrolerze poziomy to normalne CMOS.
@markrages Tak, poziomy TTL nie są odwrócone (miałem zamiar to edytować po przeczytaniu więcej, ale upłynął limit czasu. Dlatego zapytałem o Arduino: czy jest coś pomiędzy Arduino a PIC (A max chip? Dwa maksymalne żetony - mało prawdopodobne, przyznane), wtedy poziomy mogą być nieprawidłowe.
Jeden odpowiedź:
PeterJ
2013-04-23 10:12:21 UTC
view on stackexchange narkive permalink

Podczas gdy twoje obliczenie 104uS jest poprawne dla 9600BPS, twoja pętla i różne operacje, które wykonuje, będą dodawać dodatkowe opóźnienie. Jest kilka sposobów na dostrojenie czasu:

  • Odejmij stałą od opóźnienia uS, aż zacznie działać. Prawdopodobnie najlepiej byłoby określić minimalną / maksymalną liczbę, z jaką działa, i wybrać wartość środkową.

  • Zrób coś podobnego, używając zakresu, aby sprawdzić ostateczny czas, jeśli masz dostępny.

  • Spójrz na dane wyjściowe asemblera z kompilatora i określ, jak wiele razy wykonuje pętlę.

Widzę również ciebie ' ponownie używam zegara RC. Zwykle lubię utrzymywać taktowanie szeregowe w granicach 2%, aby zapewnić niezawodne działanie, więc sprawdź również, czy część ma taką stabilność, gdy używam zegara RC, aby zapewnić niezawodne działanie.

Dzięki! Podam niektóre z tych sugestii rano i skontaktuję się z Tobą.
Zgodziłbym się z PeterJ. Zwykle muszę używać zewnętrznego zegara (kryształu lub rezonatora), aby uzyskać dokładną transmisję danych. Dodatkowo, trochę kręcenie w pętli wydłuża twoje opóźnienie.
Więc myślę, że to rozgryzłem. Nie sądzę, że moja procedura `uart_time_delay ()` w ogóle się opóźnia. Używam wbudowanej metody `__delay_us ()`. Jakieś przemyślenia na ten temat? Jak mogę uzyskać bardziej niezawodne opóźnienie w C? Potrzebuję 1 / baud
@WillemEllis, Właśnie zauważyłem, że masz _XTAL_FREQ zdefiniowane jako 4.0 - myślę, że powinno być w hercach, więc 4000000, to może być coś dziwnego.
To było to!!! Jestem teraz taka szczęśliwa! Zmieniłem _XTAL_FREQ na 4000000 i obniżyłem szybkość transmisji do 4800 i działa! Dzięki @PeterJ
@PeterJ, Nie jestem pewien, czy cię to obchodzi, ale jako zapłata, oto, co pomogłeś mi osiągnąć! http://www.youtube.com/watch?v=BvSl8_K2UX4


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...