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



Teraz jest 7 kwi 2026, o 02:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 8 maja 2016, o 19:39 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Biblioteka MK UART z książki oczywiście działa, ale zauważyłem dziwną rzecz i nie wiem, z czego to się bierze, ani jak to szybko i prosto poprawić. Otóż gdy wysyłam jakiś string do Putty raz na jakiś czas, to wszystko działa. Natomiast gdy puszczę serię instrukcji uart_puts jedna po drugiej, to zawsze ostatnie 5 znaków z ostatniej instrukcji w serii jest ucinane i nie pojawia się na ekranie. Chyba, że po każdym uart_puts z tej serii dam delaya co najmniej 5 ms. Wtedy wszystko działa. Prędkość ustawiona na 9600, zewnętrzny kwarc 8 MHz, UBRR ustawiony już po nowemu, po erracie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 19:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

pabianice2 napisał(a):
Natomiast gdy puszczę serię instrukcji uart_puts jedna po drugiej,

Jedna po drugiej ;) jak ja lubię takie określenia - oczywiście nic nie powinno się dziać ale jak dajesz w pętli głównej bez żadnego delaya wysyłanie stringów (I TERAZ ZASTANÓW SIĘ DOBRZE - milard razy na sekundę) .... to co ?

A jak chcesz żeby ci pomóc to pokaż że swój kod z pliku main.c jak ty to testujesz żeby nie bawić się w zgadywanki, kalambury i zgaduj zgadule - ok?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 19:57 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Sądziłem, że jeżeli bufor nadawczy będzie zapełniony, to ten wiersz biblioteki:
while ( tmp_head == UART_TxTail ){}
sprawi, że wykonywanie programu zostanie wstrzymane do momentu, aż część znaków z bufora uda się wyrzucić na zewnątrz przez UART. Biblioteki oczywiście nie przepisuję, natomiast mój kod wygląda tak:

Kod:
(odblokowanie przerwań i uart_init)
(...)
      uart_puts("Starting\r\n");
      for (int i=0;i<8;i++)
      {
         uart_putint(i,10);
         //_delay_ms(5);
         uart_puts("\r\n");
      }


Z delayem wyświetla do wartości 7 włącznie. Bez delaya do 2 włącznie. Co ciekawe, jeśli w pętli zmienię 8 na 9, to pokaże do 3 włącznie. Zawsze ma problem z ostatnimi 5 znakami z bufora, nawet jak w pętli zrobię 80.



Ostatnio edytowano 8 maja 2016, o 20:16 przez pabianice2, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 20:13 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

[ Po pierwsze panie kolego to już jesteś trochę na tym forum i nie wiesz jak się wstawia listingi programów? nie widziałeś instrukcji ? topic7402.html - bardzo proszę popraw ten swój kod w poście wyżej ]

pabianice2 napisał(a):
Z delayem wyświetla do wartości 7 włącznie. Bez delaya do 2 włącznie. Co ciekawe, jeśli w pętli zmienię 8 na 9, to pokaże do 3 włącznie. Zawsze ma problem z ostatnimi 5 znakami z bufora, nawet jak w pętli zrobię 80.

No tak i jak zwykle pomysł, że winne pewnie są biblioteki ;) To tak będzie działać panie kochany i tak ma działać ;) ... że w terminalu (jeszcze zależy od terminala, komputera itp) będziesz dostawał różne śmieci.... na jego ekranie ....

Jak chcesz przetestować ciągłość przesyłania to zrób lepszy test - np zapisuj do pliku przesłane dane z procka i wtedy zajrzyj do pliku, a nie że ty na ekranie chcesz zobaczyć coś co jak pisałem wyżej wysyłasz miliardy razy na sekundę - a nawet chyba sprawy sobie z tego nie zdajesz hmmm ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 20:19 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Ale tu nie chodzi o to, że dostaję śmieci, tylko o to, że jeśli zrobię pętlę do 8, to na ekranie widzę:
0
1
2

Jeśli zrobię pętlę do 9, to widzę:
0
1
2
3

itd.

Jeśli zrobię do 80, to też nie będzie żadnych śmieci. Wszystko będzie dobrze, poza samą końcówką, czyli:
0
1
2
(...)
74
75
7 (i tu widać już tylko kursor)

Z jakiegoś względu problem dotyczy zawsze kilku ostatnich instrukcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 20:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

pabianice2 napisał(a):
Z jakiegoś względu problem dotyczy zawsze kilku ostatnich instrukcji.

A czytałeś co wyżej napisałem ? Sorki ale chyba w ogóle nie czytałeś ....

Powtórzę jeszcze raz zrób inny test bo ten jest bez sensu dla terminala do którego pchasz dane za szybko więc nie dziwne że wymiotuje. Na szybszym kompie wyświetli jeszcze inne zestawy twoich cyferek ... albo raz tyle raz mniej ....

więc:

1. albo odczytuj terminalem dane do pliku i sprawdź co dostałeś w pliku i zobaczysz wszystko

2. albo nie rób swojej pętli for() w pętli głównej tylko przed nią i zobacz ile ci się cyferek wyświetlać będzie w terminalu - pewnie się zdziwisz że za każdym razem 8 albo 9 czy ile tam ustawisz

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 20:32 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Faktycznie, zależy to od umiejscowienia tej pętli w programie i tak, dziwi mnie to :)
Dlaczego ma to znaczenie?

------------------------ [ Dodano po: 6 minutach ]

Nadal nie daje mi to spokoju.

Na początku programu wysyłam string Starting Program.
Potem robię różne rzeczy, które trwają. Inicjuję ekran i takie tam.
Wysyłam przez uart_putint wartość liczbową.
Potem znów różne operacje. Na końcu umieszczam sobie jeszcze kontrolnie delaya.
I niezależnie od jego długości, ostatnie polecenie uart_puts "Ending init" zawsze owocuje wyświetleniem
samego "Ending". Natomiast napis wyświetli się poprawnie, jeśli dołożę jeszcze jedną instrukcję uart_puts.
Wtedy za to nie wyświetli się treść tej ostatniej.

To właśnie to sprawia, że sądzę, że z jakiegoś względu z bufora nie wychodzi sama końcówka.

------------------------ [ Dodano po: 12 minutach ]

Nie wiem, jak odczytać terminalem dane do pliku bez wyświetlania ich na ekranie, ale w putty jak ustawię log to file, to plik zawiera dokładnie to samo, co widzę na ekranie w trakcie sesji



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 21:04 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Jakie masz taktowanie procka ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 21:09 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

8 MHz. Próbowałem i na wewn. rezonatorze, i na kwarcu zewn. (też 8)

Kod:
#define UART_BAUD 9600      
#define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)


Atmega 1284P, nazwy rejestrów poprawne - musiałem wprowadzić niewielkie zmiany w stosunku do bibliotek, posługując się Datasheetem.

Co ciekawe, cała obsługa uarta w funkcji main() działa. Natomiast problemy zaczynają się, gdy wrzucam ją do funkcji init(), która jest jednorazowo wywoływana przez main(). Poza przerwaniem do obsługi nadawania znaków przez uart (z bliblioteki) w programie nie wykorzystuję żadnych innych przerwań.

------------------------ [ Dodano po: 27 minutach ]

Postaram się zaraz zlokalizować miejsce w tej funkcji, od którego uart zaczyna wariować. Bardzo to wszystko dziwne :)

------------------------ [ Dodano po: 44 minutach ]

Nie widzę żadnej logicznej przyczyny. Jak zrobię tak:

Kod:
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");

, to PuttY wyświeli mi:
Kod:
Ending init_display
Ending

Jak zrobię tak:
Kod:
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
uart_puts("Ending init_display\r\n");
,
to PuTTY pokaże tak:
Kod:
Ending init_display
Ending init_display
Ending init_display
Ending

Natomiast przeniesienie tego w inne, losowe miejsce w kodzie sprawia, że działa.
Badałem instrukcje występujące i przed, i po. Niczego niezwykłego nie znalazłem.
Zaczynam już podejrzewać jakiś dziwny błąd kompilatora.

------------------------ [ Dodano po: 46 minutach ]

Jak po każdej z tych instrukcji dałem delay_ms(10), to teraz w ostatnim wierszu mam:

Ending init_dis

------------------------ [ Dodano po: 52 minutyach ]

Zrobiłem jeszcze jeden test i jest jeszcze dziwniej:

Program testowy, raptem parę linijek. Reszta wykomentowana. Nic poza tym.

W funkcji main robię uart_puts "Starting".
Potem wchodzę do tej feralnej funkcji i wywołuję tam parę razy to uart_puts "Ending init display".
Gdy nastąpi powrót z tejże funkcji do main, już w ramach main wywołuję to ostatnie
uart_puts "Ending init display".

I problem jest ten sam. Obcina końcówkę.

Ale teraz najlepsze. Jak na końcu dam _delay_ms(20), do działa.
Ale jak nie dam delaya, za to zakończę w tym miejscu funkcję main, żeby po uart_puts już absolutnie niczego nie było, tylko koniec programu, to znów nie działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2016, o 22:52 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Czasami zdarzają się też nieudokumentowane błędy sprzętowe. Znalazłem info, że ktoś odkrył czysto sprzętowy problem z odbiorem danych przez UART na 1284p. U niego pomogła zmiana ustawień dot. zewn. kwarcu. Zaraz popróbuję. Nieprawdopodobne, ale tak też bywa. Facet twierdzi, że na 644 kod działał bez zająknięcia. Inna ciekawostka tego typu, też dotycząca RX: http://www.avrfreaks.net/forum/atmega1284p-uart-rx-glitch

------------------------ [ Dodano po: 28 minutach ]

Zmiana oscylatora na 2 MHz ani zmiana baud rate nie pomogła, acz sprawiła, że łańcuch jest ucinany w innym miejscu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 09:09 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Zamiast doszukiwać się ciekawostek weź w rękę kwarc przyjazny RS232 czyli np 11,0592 MHz i sprawdź ok?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 14:59 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Możesz wstawić cały kod, z którego korzystasz? Oczywiście bez bibliotek? Używasz w swoim układzie watchdog'a? Czy funkcja main() zawiera u Ciebie pętlę nieskończoną?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 16:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Sparrow-hawk napisał(a):
Używasz w swoim układzie watchdog'a?

hehehe no tak - wyżej mowa o ATmega1284 więc pewnie watchdog sobie hula nie wyłączony i tak na prawdę procek się wciąż resetuje i dlatego tylko takie poucinane rzeczy może lecą ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 17:51 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Ale wymyślacie :)
Nie, nie resetuje się w kółko ani nie wywołuje uarta miliard razy na sekundę.
Procek musiałby mieć częstotliwość paru GHz, prawda?

Coś jest ewidentnie nie teges.
Popróbuję dziś z innym kwarcem, analizatorem stanów logicznych, sprzętowym debugerem itp.
Jak nie pomoże, wstawię cały kod bez bibliotek i każdy będzie mógł sam przetestować na swoim 1284P.

Trafiłem na ciekawy przypadek.

------------------------ [ Dodano po: 1 minucie ]

Main bez pętli, watchdoga nie konfigurowałem w ogóle = ustawienia domyślne.

------------------------ [ Dodano po: 16 minutach ]

Kwarc 7,3728 MHz nie pomógł - to nie to



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 19:18 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Proszę, gotowy program do przetestowania na ATMEGA 1284P THT:
main.c:
Kod:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <util/delay.h>
#include "init.h"
#include <avr/interrupt.h>
#include "MKUART/mkuart.h"

int main (void) {

USART_Init( __UBRR );
sei();
uart_puts("\r\nStarted\r\n");
init_display();
}


init.h:
Kod:
#ifndef INIT_h
#define INIT_h

void init_display(void);

#endif //INIT_h


init.c:
Kod:
#include <util/delay.h>
#include "init.h"
#include "MKUART/mkuart.h"

void init_display(void){
      uart_puts("Starting init_display\r\n");
      uart_puts("ID: ");
      uart_putint(255,16);
      uart_puts("\r\n");
      uart_puts("Starting init_display\r\n");
      uart_puts("Ending init_display\r\n");
      //_delay_ms(20); //z tym delayem działa, a bez ucina. Dlaczego???

}


A to, żebyście nie musieli sami szukać nazw rejestrów pod DS-ie.
Maleńkie fragmenty pokazujące, co zmieniłem w bibliotece:
Kod:
UBRR0H = (...)
UBRR0L = (...)
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
(...)
UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
(...)
void uart_putc( char data ) {
(...)
UCSR0B |= (1<<UDRIE0);
(...)
ISR( USART0_UDRE_vect) {
(...)
UDR0 = (...)
(...)
UCSR0B &= ~(1<<UDRIE0);
(...)


------------------------ [ Dodano po: 11 minutach ]

Czy może być tak, że funkcja main dobiega końca, a procedura obsługi przerwania nie zdąży do tego czasu przepisać wszystkiego z bufora i wysłać na uart?

------------------------ [ Dodano po: 17 minutach ]

Dodam, że czy ustawię 9600, czy 115200, to jest to samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 19:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Tutaj: http://atnel.pl/mkbootloader.html

masz pokazane jak wyłączyć sobie watchdoga, umieść tę funkcję ze stronki: staticvoid __init3( void ) przed main i sprawdź

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 19:59 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

To samo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 20:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Aż jutro w firmie sprawdzę to na m1284P bo coś dziwne rzeczy mówisz ;) ale zobaczymy jak to będzie w praktyce (bo jak to mówią nigdy nie mów nigdy) ;). Bo na m32 działa to bez problemu ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 20:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zamień swój main.c na:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 20:11 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Z
Kod:
while(1)
działa pięknie, ale dlaczego tak jest?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 20:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

pabianice2 napisał(a):
ale dlaczego tak jest?

No tak - podstawy, polecam jednak przeczytać początek książki - sam początek na temat języka C i konstrukcji funkcji main() bo widać, że to pominąłeś i masz masakrę

gdy nie masz pętli nieskończonej to program grzecznie kończy swoje działanie i wyłącza wszystkie przerwania

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 20:23 
Offline
Nowy

Dołączył(a): 24 lis 2015
Posty: 20
Pomógł: 0

Dziękuję. To wszystko wyjaśnia.



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: 22 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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