AVR uart

Witam,

Napisalem i przetestowalem w symulatorze prosty programik (bascom).

$sim '***************************************' '********* Compiler options ************' '***************************************' $regfile = "2313DEF.DAT" 'mcu type $crystal = 11059000 'crystal frequency $baud = 19200 : Echo Off 'baud rate, turn echo off Config Watchdog = 512 '

Ddrb = &B11111111 'Power drivers Portb = &B00000000 'low state ' Ddrd = &B10010000 '1-wyj, 0 - wej Portd = &B00000000 '

Do Waitms 1 $asm Checkpoint: sbic pind,2 'check int input state rjmp exitpoint 'exit cbi portd,6 'turn led on sbi portd,4 '485 transmiter mode push r16 'used registers on stack push r17 push r18 ldi r18,4 'load counter value ' Ldi R16 , 0 'load with broadcast code Out Udr , R16 'copy value to udr register '; Load Uart Data Register Point0: 'jump label sbis usr,udre 'skip if transmite complete rjmp point0 'loop back ' Ldi R16 , 57 'load with set hold code Out Udr , R16 'copy value to dr register '; Load Uart Data Register Point1: 'jump label sbis usr,udre 'skip if transmite complete rjmp point1 ' ldi r17,0 'clear counter register Point2: cbi usr,txc 'clear transmit complete flag Ldi R16 , 48 'load with value Out Udr , R16 'copy value to dr register '; Load Uart Data Register Point3: 'jump label sbis usr,udre 'skip if transmite complete rjmp point3 inc r17 'incr byte counter cpse r17,r18 'if 4 bytes out then skip rjmp point2 Point4: sbis usr,txc 'if transmite complete flag set then skip next command rjmp point4 ' pop r18 'take registers from stack pop r17 pop r16 cbi portd,4 '485 receiver mode sbi portd,6 'turn led off Exitpoint: $end Asm Loop

niestety w punkcie sbis usr,txc program sie zapetla czyli nie ustawia flagi ukonczenia nadawania, ktora chcialem wykorzystac do sterowania przeplywem transceivera 485. Nie wiem co robie zle.... Prosilbym o jakas wskazowke.

pzdr Tomek

Reply to
Tomek
Loading thread data ...

Nie znam twojego AVRka ale jak chcesz wiedziec kiedy sie skonczylo nadawanie to masz odpowiednia flage w rejestrze UARTu pewnie sie nazywa TBE Transmit Buffer Empty albo jakas inna ktora moi kiedy mozna wyslac nastepny znak i najlepiej jak to robisz sobie z przerwaniami to wtedy sam UART sei zglasz jak jest gotowy albo jak cos odbierze. Czy naprawde niekt na tej grupie nie uzywa przerwan i licznikow-tajmerow. pozdro Grzechu

Reply to
Greg Sz

Wlasnie z tej flagi korzystam transmit complete.... Problem polega na tym ze po wyslaniu jakims cudem nie jest setowana.

Korzystam i to bardzo czesto.... caly ten program bedzie w isr od int0 i nie mam zamiaru korzystac w tym isr z przerwania utxc.

pzdr Tomek

Reply to
wieczus

Tomek wrote: ...

AFAIK to tę flagę się zeruje wpisując 1. A dodatkowo to skąd wiesz, że już ta flaga jest ustawiona? To, że UDRE jest ustawiona (sprawdzane parę lini wyżej i niżej) nie znaczy przecież, że transmisja jest zakończona.

Pozdrawiam,

Reply to
Artur Lipowski

On Behalf Of Tomek

UDRE też nic nie powie, faktyczny czas zakończenia wysyłania nie jest znany. Tzn. można go sobie wyliczyć na podstawie zgłoszenia UDRE i wyliczonego opóźnienia zależnego od prędkości transmisji.

Ja, chcąc precyzyjnie wiedzieć kiedy linia jest wolna, odliczam usek. Dla 38,4k to jest chyba około 330usek od zgłoszenia UDRE.

pzdr Artur

Reply to
ziel

To jak procek sie zachowuje nizgodnie ze specyfikacja ? A moze ma byc zerowana jak sie to stanie a ty ja masz ustawic na '1". No i czasem to jest zwiazane z przerwankami alebo jeszcz jakis "Enable" albo jakas maska na te bity bywa. Powodzenia w kazdym razie zycze.

Grzechu

Reply to
Greg Sz

To jak masz informacje ze transmisja zakonczona jak jeszcz sie wysyla bit stopu ? Wlasciwie to moze i normalne bo mozesz juz wysylac natepny. Tyle ze jak chcesz jakies przelaczania robic, jak ylaczenie nadajnika w modemie czy co w tym stylu , to troche za wczesnie. To to jest rzeczywiscie problemik. Trzeba dodac jakies opoznionko koniecznie. Czasem mozna zrobic taka sztuczke ze sie obiera to co sie nadaje i wtedy kompletne odebranie ostatniego wyslango znaku jest narawde koncem transmisji i mozna nadajnik wylaczac moze jeszcze jakies opoznionk tez by dobre bylo ale juz nie trzba wyliczac z szybkosci transmisji tylko opoznienia na linii ew uwzgledniac. Pozdro Grzechu

Reply to
Greg Sz

Witam,

To dziala, bit ustawiony to 1 a wyzerowany 0, to chyba blad symulatora w srodowisku bascom.Wgrany do kontrolera program dziala ok. Dzieki za pomoc, pzdr Tomek

!push r16 'put used registers on stack !push r17 !push r18 !push r19 !push r24 !in r16,sreg 'store status register Waitms 1 'make a 1ms delay !sbic pind,2 'check int0 input state !rjmp exitpoint 'if wrong state then exit !cbi portb,6 'turn led on !sbi portb,4 '485 transmiter mode !Ldi R17 , 0 'load with broadcast code !Out Udr , R17 'copy value to udr register '; Load Uart Data Register !Point0: 'jump label !sbis usr,udre 'skip if transmite complete !rjmp point0 'loop back ' !Ldi R17 , 57 'load with set hold code !Out Udr , R17 'copy value to udr register '; Load Uart Data Register !Point1: 'jump label !sbis usr,udre 'skip if transmite complete !rjmp point1 'loop back ' !ldi r18,3 'load compare value !ldi r19,0 'clear counter register !Point2: 'jump label !Ldi R17 , 48 'load with value !Out Udr , R17 'copy value to dr register '; Load Uart Data Register !Point3: 'jump label !sbis usr,udre 'skip if transmite complete !rjmp point3 !inc r19 'incr byte counter !cpse r19,r18 'if 4 bytes out then skip !rjmp point2 ' !cbi usr,txc 'clear transmit complete flag !Ldi R17 , 48 'load with broadcast code !Out Udr , R17 'copy value to udr register !point4: !sbis usr,udre 'skip if transmite complete !rjmp point4 !loop1: !sbis usr,txc 'skip if whole byte transmited !rjmp loop1 Waitms 1 'wait a little !cbi portb,4 '485 receiver mode !sbi portb,6 'turn led off !Exitpoint: !pop r24 !pop r19 !pop r18 !pop r17 'turn the led off !pop r16 !out sreg,r17 'restore status register

Reply to
wieczus

On Behalf Of Greg Sz

Nie ma takiej informacji. Procek sygnalizuje jedynie mozliwosc wpisania nastepnego bajtu do wyslania, natomiast transmisja poprzedniego jeszcze trwa. Ale to juz sprawka kolejnego rejestru z wejsciem równoleglym i wyjsciem szeregowym, który nie jest widoczny (pomijajac shcemat elektryczny procka). Bardzo ladnie to zrobili, bo mozna przed zakonczeniem wysylania bajtu danych wejsc w jakis podprogram i w "miedzyczasie" przygotowac nastepny bajt do wyslania. Szkoda tylko, ze zapomnieli o dodaniu jakies flagi informujacej o "fizycznym" zakonczeniu nadawania.

Lepiej wykorzystac czas procka na prace ;-) Majac ponad 300usek wolnego czasu, procek w tym czasie oblicza czesciowe CRC (które bedzie wyslane na koniec) i wczytuje z tabeli nastepny bajt do wyslania .

pzdr Artur

Reply to
ziel

W artykule snipped-for-privacy@poczta.onet.pl>

ziel napisal(a):

Nie masz racji. Cytat z DTR-ki megi32 (ostatnio ją obrabiam):

The Transmit Complete (TXC) Flag bit is set one when the entire frame in the transmit Shift Register has been shifted out and there are no new data currently present in the transmit buffer. The TXC Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location. The TXC Flag is useful in half-duplex communication interfaces (like the RS485 standard), where a transmitting application must enter receive mode and free the communication bus immediately after completing the transmission.

Tak samo jest dla UART-ów 90-tek:

  • Bit 6 – TXC: UART Transmit Complete This bit is set (one) when the entire character (including the stop bit) in the Transmit Shift Register has been shifted out and no new data has been written to UDR. This flag is especially useful in half-duplex communications interfaces, where a transmitting application must enter Receive mode and free the communications bus immediately after completing the transmission. When the TXCIE bit in UCR is set, setting of TXC causes the UART Transmit Complete interrupt to be executed. TXC is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, the TXC bit is cleared (zero) by writing a logical “1” to the bit.

Pozdrawiam

Marcin Stanisz

Reply to
Marcin Stanisz

1ms wymuszany jest przez warunki zewnetrze... Czujnik potrzebuje czasu na przepisanie wyniku pomiaru do hold register, ruch na sieci sledzi pc uznalem ze to wymagane opoznienie wrzuce do avr a nie do pc. Co do sreg i r17 to sluszna uwaga .... Przysiegam jednak ze to dzialalo :)

pzdr Tomek

Reply to
wieczus

On Behalf Of Marcin Stanisz

I tu jest pies pogrzebany. Co Poeci mieli na myśli?

Nie mam możliwości zaobserwowania tak szybkich zmian, ale może w niedzielę zrobię układzik który będzie robił detekcję odebrania kompletnej ramki i jednocześnie śledził czas kiedy nastąpi zgłoszenie przerwania (w przerwaniu będzie ustawiał jedynkę na jakimś wyprowadzeniu).

Na 8015 i mega128 nie mogę wyłączyć nadajnika zaraz po odebraniu przerwania, bo ucina mi ostatni bajt, więc siła rzeczy musiałem odczekać chwilę po wysłaniu ostatniego bajta - czyli zapisaniu go do UDR. Mnie wychodzi, że flaga jest ustawiana w chwili przepisania UDR do Sh.Reg. i wyczyszczeniu UDR, a nie po wysłaniu bitu stop. Wywnioskowałem z tego, że przerwania są generowane na podstawie rejestru nadajnika, a nie rejestru z wyjściem szeregowym.

Podobnie jest z odbiorem. W rejestrze UDR znajduje się kompletny bajt (ile by nie miał bitów dla mnie zawsze pozostanie bajtem ;-) ) i w trakcie jego czytania (przez przerwanie) jest odbierany kolejny bajt. Ale o odebraniu ramki jest informacja z UDR, a nie z Sh.Reg.

pzdr Artur

Reply to
ziel

On Behalf Of snipped-for-privacy@poczta.onet.pl

Staraj się nie mieszać BASCOMa z asm, lepiej ręcznie użyć jakiegoś wolnego w tej chwili timera lub zrobić w asm pętlę.

Teraz działa. W to nie wątpię. Ale kiedyś przerwanie może przyjść w chwili kiedy zawartość SREG będzie miała znaczenie dla programu. A tak na marginesie, czy w przerwanie wchodzisz z opcją NOSAVE?

pzdr Artur

Reply to
ziel
Reply to
Jerzy Szczesiul

Dokladnie.... napisalem juz niejeden program w asm i czuje problem, niestety pisalem tylko dla 51.

Jasne, oszczedzam czasu i pamieci :)

pzdr Tomek

Reply to
wieczus

On Behalf Of Jerzy Szczesiul

Znowu głupot napisałem? ;-) Przyznam się, że pdfa czytałem "po łebkach" i jakoś tak mi wyszło, że procek nie daje sygnału o fizycznym zakończeniu nadawania - dlatego używam pętli czasowej po wysłaniu ostatniego bajta. I kurde, tak jakoś dalej jestem o tym przekonany. Nie ma rady, będę musiał zrobić ten układ i w końcu naocznie przekonać się jak to działa. Oczywiście sprawdzę czas ustawiania obu flag.

pzdr Artur

Reply to
ziel

On Behalf Of Arek Karas

Oczywiście nie miałem czasu na "fizyczne" sprawdzenie, ale znalazłem czas na poczytanie. ;-) Faktycznie, w/g opisu TXC powinien się ustawić po wysłaniu bitu stop. Akurat dla mnie, w tej chwili jest to mało przydatne, (bo procek lata po tabelach zanim wyśle następny bajt i czekanie na zgłoszeni przerwania to strata czasu) ale tej flagi właśnie mi brakowało (tak na wszelki wypadek) ;-).

pzdr Artur

Reply to
ziel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.