Bascom - sprzętowy i programowy uart w tym samym czasie ???


Witajcie !

Mam sprawiające dla mnie małą trudność pytanie - chciałbym przerobić swój stary program wysyłający dane za pomocą sprzętowego uart do pracy z wyświetlaczem DWIN który wszelkie dane wysyła i odbiera za pomocą również UART.

Co do konfiguracji softwarowego uartu nie mam problemu i wszystko działa mi jak należy, ale ...

niestety hardwarowy uart pracuje w przerwaniach i o ile testy wyświetlacza na "gołym" programie są ok o tyle wplatając go w "stary system" zaczynają się kłopoty. Zauważyłem że jak wyłączę na czas odbierania znaku z softowego uarta wszystkie przerwania to działa to jak należy.

Teraz mam zrobione tak że w głównej pętli jest :

 
 
Open "comb.1:115200,8,n,1" For Input As #2
Open "comb.2:115200,8,n,1" For Output As #3
 
do
 
 Disable Interrupts
Inputbin #2 , Ua(1) , 2
 
 If Ua(1) = &H5A And Ua(2) = &HA5 Then
 
 Inputbin #2 , Ua(3) , 7
 End If
 
 Enable Interrupts
 
 Dane = Hex(ua(1)) + Hex(ua(2)) + Hex(ua(3)) + Hex(ua(4)) + Hex(ua(5)) + Hex(ua(6)) + Hex(ua(7)) + Hex(ua(8))
 
 Locate 1 , 1            ' te linijki są do testów na wyświetlacz lcd 2x16 czy wprowadzone dane z wyświetlacza sa prawidłowe
 Lcd Dane
 Locate 2 , 1
 Lcd Hex(ua(9))
 Wait 1
 Cls
 
 Loop

ale obawiam się że nie jest to zdrowe by tak w każdej pętli wyłączać te przerwania ... ( na razie nie testuję tego na żywym organizmie stąd ta rozterka )

Tu pojawia się główne pytanie - ponieważ ekran wysyła dane tylko w momencie gdy coś zostanie naciśnięte, czy jest możliwość sprawdzenia tego, że coś "przychodzi" na softowy uart i dopiero wtedy wyłączyć przerwania - odebrać - i włączyć je z powrotem? ...Lub może jest opcja na przerwania softowego uart'u ??




Portret użytkownika EDC

Odp. Bascom - sprzętowy i programowy uart w tym samym czasie

Rozwiązań tyle ilu programistów. Nie napisałeś chyba jaki to mikrokontroler.
Jeśli coś co ma możliwość skorzystania z PCINT to możesz mieć przerwanie przy ruchu na porcie :)
Jeśli nie wiesz jak ich użyć zajrzyj tutaj. Jeśli to Babcia Mega8 możesz zmienić na Mega328 bo jest w tej samej obudowie i ma te same wyprowadzenia tylko jest młodsza w środku.
Możesz też nie wyłaczać wszystkich przerwań tylko po kolei wyłączać po jednym i sprawdzić które Ci bruździ. Może da się coś napisać inaczej :)
Tu możesz poczytać o selektywnym wyłaczaniu http://wiki.mcselec.com/bavr/DISABLE
Tyle chciałem wnieść do sprawy nie wiedząc nic więcej

Miłego dnia.

-

BARTek
Moja strona

Portret użytkownika daniels

...

Zapomniałem o typie procesora - jest to Atmega32. Dziś zgodnie ze wskazówkami próbowałem walczyć z przerwaniami ( konkretnie INT2 bo do tej nogi mam teraz podpięty uart z wyświetlacza ) - poza właściwymi komunikatami ciągle dostaję mnóstwo krzaków :( ... zastanawiam się nad wymianą tej kostki na Atmega324P która ma 2 uarty i wszystkie wyprowadzenia zgodne z Atmega32.

Przyjrzałem się i poza przerwaniami od hardwarowego UART mam jeszcze przerwania z TIMER2 - jest tego tak dużo, że chyba droga dodatkowego softowego UART może okazać się niezwykle trudną do dobrej realizacji :(

Portret użytkownika daniels

a teraz problem z przerwaniem

Witajcie !

Zmieniłem procesor na ATMEGA324P i teraz pojawił się problem z przerwaniem, a konkretnie wywala mi błąd "ISR already defined" w momencie gdy włączę buforowanie czyli CONFIG SERIALIN1 = buffered, size = 20

' obsługa wyświetlacza do testów
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.6
Config Lcd = 16 * 2
 
Config Watchdog = 2048
 
' konfiguracja uart dla RS485
Config Com1 = 250000 , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 0
 
Print "Config"
 
 
'konfiguracja UART1 dla wyswietlacza
Config Com2 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin1 = Buffered , Size = 20
Config Serialout1 = Buffered , Size = 20
On Urxc1 Wyj
Enable Urxc1
 
 
Open "COM2:" For Binary As #1

gdy wyrzucę tę linijkę wszystko jest ok ( bufor SERIALOUT1 też działa ) - jedynie kłopot z buforem wejściowym. Wiecie może jak to naprawić ???

poniżej pozostałe 2 przerwania które potrzebuję do prawidłowej pracy całego softu :

On Timer0 Dimm
Timer0 = 250                                         
Enable Timer0
' RS485-Interrupt
On Utxc send
Enable Utxc

... EDIT ...

Poradziłem już sobie - wywaliłem przerwanie i Config serialin1 = buffered , size=20 działa :-) ... zamiast robić to w przerwaniu zastosowałem ISCHARWAITING()