Skocz do zawartości

Proste łączenie PC z ATmega VB.NET


Pomocna odpowiedź

Napisano (edytowany)

Ktoś ogarnięty mi ogarnie ten UART bo mnie szczyści jak kota po śliwkach .
Są dwa filmy i na pierwszym filmie  chodzi "poprawnie" ale z opóźnieniem w odbiorze wartości ADC (wiadomo że będzie bo wstawione jest opóźnienie w pętli na 30milisekund  a dlaczego to zaraz w drugim filmie widać).
Wartość z TrackBar1 wysyłana do atmegi chodzi poprawnie i szybko.
W filmie drugim jest usunięte opóźnienie w pętli  no i przy starcie odczyta ADC ale będzie tą wartość długo wyświetlać mimo zmiany na atmedze .
Wartość z TrackBar1 w tym czasie wysyłana do atmegi chodzi poprawnie tak jak w poprzednim filmie.
Trzeba mi to tak zrobić odbieranie ADC na kompie bym mógł w czasie rzeczywistym (bez opóźnień wysyłać z atmegi dane ADC).
Jest jeszcze jeden problem z programem po windows , czasem jak zamykam to się wiesz (na razie odpuszczam ten problem bo ważniejszy jest UART).

 

 

Program VB.NET uart.rar

Edytowano przez tomaszrugby
  • Lubię! 1
  • 1 miesiąc później...

Kod do mcu to banał , nadaje odbiera i wyświetla 

$REGFILE = "M32DEF.DAT"
$CRYSTAL = 16000000
$BAUD = 115200
$HWSTACK = 100
$SWSTACK = 100
$FRAMESIZE = 100
ENABLE INTERRUPTS
'*********************************************************************************************************************************
'*** LCD ST7735R *****************************************************************************************************************
'*********************************************************************************************************************************
$LIB "GLCD-ST7735R_APRIL.LIB"
CONFIG GRAPHLCD = COLOR ,CS1 = Portc.3   , SCLK = Portc.4 , SI = Portc.5 , A0 = Portc.6 , RST = Portc.7
'CS1=CS=C3 | SCLK=SCL=C.4 | SI=SDA=C.5 | A0=A0=C.6 | RST=RESET=C.7  (CS1 - PODPIAC POD MINUS ZAMIAST PORTC.3)
CONST PORTRAIT = 0                                        '1=Portrait, 0=Landscape
CONST ROTATE_180 = 0                                      '1=Rotated,  0=Not Rotated
'-------------------------------------------------------------------------------
CONST BLACK = &B00000000
CONST WHITE = &B11111111
INITLCD
SETFONT COLOR8X8
'SETFONT COLOR16X16
CLS
BOXFILL(0 , 0) -(160 , 128) , BLACK   'TLO POZIOM
'BOXFILL(0 , 0) -(128 , 160) , BLACK   'TLO PION
'*********************************************************************************************************************************
'*** UART-COM1 *******************************************************************************************************************
'*********************************************************************************************************************************
CONFIG COM1 = 115200  , SYNCHRONE = 0 , PARITY = NONE , STOPBITS = 1 , DATABITS = 8 , CLOCKPOL = 0
OPEN "COM1:" FOR BINARY AS #1
CONFIG SERIALIN0 = BUFFERED , SIZE = 10 , BYTEMATCH = 13
ENABLE URXC
DIM RS232_1 AS STRING*20 , RS232_1_OLD AS STRING*20
DIM COM1 AS  WORD
'*********************************************************************************************************************************
'*** ADC *************************************************************************************************************************
'*********************************************************************************************************************************
CONFIG ADC = SINGLE , PRESCALER = AUTO , REFERENCE = AVCC
CONFIG SINGLE = SCIENTIFIC , DIGITS = 3
'*********************************************************************************************************************************
'*** PORT/PIN ********************************************************************************************************************
'*********************************************************************************************************************************
CONFIG PORTB=OUTPUT
PORTB=0
'*********************************************************************************************************************************
'*** ZMIENNE *********************************************************************************************************************
'*********************************************************************************************************************************
DIM ADC0 AS WORD , ADC1 AS WORD
'*********************************************************************************************************************************
'*** PROGRAM *********************************************************************************************************************
'*********************************************************************************************************************************
DO

IF RS232_1 <> RS232_1_OLD THEN
RS232_1_OLD=RS232_1
LCDAT  30 , 0 , "RS232_1: "; RS232_1 ;"  ", WHITE , BLACK
END IF

ADC0=GETADC(0)
PRINT ADC0
WAITMS 20

LCDAT  10 , 0 , "COM1: "; COM1 ;"  ", WHITE , BLACK

LOOP
END
'---------------------------------------------------------------------------------------------------------------------------------

$INCLUDE "COLOR8x8.FONT"
'$INCLUDE "COLOR16x16.FONT"
'---------------------------------------------------------------------------------------------------------------------------------
SERIAL0CHARMATCH:
PUSHALL
INPUT #1, RS232_1 NOECHO
COM1 = VAL(RS232_1)
POPALL
RETURN

 

  • 3 tygodnie później...

A może po prostu, czy opóźnienie 30 msek nie jest potrzebne bo program programem a przesyłanie RS jest sprzętowo realizowane? Jeśli chcesz się przekonać do mojej wersji możesz spróbować stopniowo zmniejszać opóźnienie i zrobić test przy jakiej wartości opóźnienia układ się "wiesza"?
Pozdrawiam. 

  • 2 miesiące później...

Lekko przerobiłem Twój program, wywaliłem obsługę lcd i tak skompilowany kod wstawiłem do symulatora obwodów simulIde (gorąco polecam, jest bardzo prosty w obsłudze). W pierwotnym kodzie znalazłem przynajmniej jeden błąd przy poleceniu print-jeżeli definiujesz config com1... to przy wszelkich print musisz podać nr kanału, czyli u Ciebie "print #1, wartość" możesz również usunąć linijkę $Baud, również z powodu zdefiniowania config com1. Ponad to, nie robiąc głębszej analizy, wydaje mi się, że w pętli głównej wysyłasz print-em wynik funkcji GetAdc, ale równocześnie w przerwaniu Urxc chcesz obsłużyć przychodzącą wartość/tekst. Nie spoglądałem na kod VB, ale ta wartość musi być zakończona znakami cr+lf, skoro masz bytematch=13 a takiego znaku nie będzie to może stąd są pewne problemy (tylko 'gdybam' głośno 🙂 ).

W każdym razie poniższy kod w symulatorze działa 🙂

$REGFILE = "M328pDEF.DAT"
$CRYSTAL = 16000000
$HWSTACK = 100
$SWSTACK = 100
$FRAMESIZE = 100

CONFIG COM1 = 115200  , SYNCHRONE = 0 , PARITY = NONE , STOPBITS = 1 , DATABITS = 8 , CLOCKPOL = 0
OPEN "COM1:" FOR BINARY AS #1
CONFIG SERIALIN0 = BUFFERED , SIZE = 10 , BYTEMATCH = 13
ENABLE URXC
DIM RS232_1 AS STRING*20 , RS232_1_OLD AS STRING*20
DIM COM1 AS  WORD

CONFIG ADC = SINGLE , PRESCALER = AUTO , REFERENCE = AVCC
CONFIG SINGLE = SCIENTIFIC , DIGITS = 3
CONFIG PORTB=OUTPUT : PORTB=0
DIM ADC0 AS Word , ADC1 AS WORD

ENABLE INTERRUPTS

DO

 IF RS232_1 <> RS232_1_OLD THEN
   RS232_1_OLD=RS232_1
 END IF

 ADC0=GETADC(0)
 PRINT #1, ADC0 '<----- NR Kanału !
 WAITMS 20

LOOP
END

SERIAL0CHARMATCH:
PUSHALL
INPUT #1, RS232_1 NOECHO
COM1 = VAL(RS232_1)
POPALL
RETURN

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...