logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom AVR: Jak przetestować i rozbudować program eksportu danych RS232?

pmalczyk18 05 Gru 2006 15:00 3290 14
REKLAMA
  • #1 3297414
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Witam wszystkich. Mam problem gdyż mam do napisania program pt. Opracowanie i implementacja programu służącego do eksportowania danych poprzez interfejs szeregowy RS232. Jak do tej pory udało mi się stworzyć tylko coś takiego co znajduje się poniżej, ale nie wiem dokładnie jak to można sprawdzić czy to w ogóle działa. A poza tym może ktoś z Was powie mi jak to rozbudować, by ten program wyglądał bardziej zaawansowanie i profesjonalnie, bo to co mam w tej chwili nawet dla mnie laika wydaje się banalne a gdzie jeszcze mowa o moim nauczycielu. Pozdrawiam!


    $regfile = "m8def.dat" 'inf kompilator o pliku dyrektyw
    $crystal = 8000000 ' inf kompilator o f. oscylatora
    $baud = 9600 'inf kompilator o predkosci transmisji

    Dim I As Byte 'def. zmiennej I
    I = 243 'przypisanie zmiennej I wartosci 243

    Do 'początek petli

    Print "Bascom AVR w praktyce" 'wyslanie przez Rs232 tekstu

    Wait 1 'opoznienie 1 sekundy
    Print "Wartosc I zapisana DEC: " ; I 'wyslanie wart. zm. I

    Wait 1 'opoznienie 1 sekundy
    Print "Wartosc I zapisana HEX: " ; Hex(i) 'wyslanie wart. HEX

    Wait 1 'opoznienie 1 sekundy
    Print "Wartosc I zapisana BIN: " ; Bin(i) 'wyslanie wart. BIN

    Print 'wstawienie linii odstepu
    Wait 10 'opoznienie 10 sekund

    Loop

    End ' koniec programu
  • REKLAMA
  • Pomocny post
    #2 3297943
    teedd
    Poziom 19  
    Posty: 219
    Pomógł: 24
    Ocena: 2
    Witam.
    Ja to widzę tak: pytanie podstawowe - Eksport jakiego rodzju danych?
    Jeśli odpowiesz sobie, że np. eksportujesz dane o temperaturze w pokoju co 10 minut, to robisz termometr na Mega8 wykorzystując jakiś czujnik temperatury, odmierzasz 10 minut, czytasz temperaturę, posyłasz po RS232. Z drugiej strony masz odpalony programik, który zapisuje dane z RS-a na dysk - np. Wcom32. I już.
    Jeżeli chcesz zrobić coś bardziej skomplikowanego, to możesz np. obserwować, czy przesyłane dane są odbierane i zapisywane przez program na kompie (jakiś dialog sprzętowy lub programowy) - a jeśli nie, to przechowywać niezapisane dane w EEpromie. Po nawiązaniu łączności zrzucasz te dane na komputer i zwalniasz pamięć w EEpromie.
    itd itp - pomysłów może być wiele.
    Pozdrowienia - teedd
  • REKLAMA
  • Pomocny post
    #3 3298304
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Cytat:
    Jak do tej pory udało mi się stworzyć tylko coś takiego


    Wygląda dziwnie znajomo. Wiem - p. Marcin Wiązania popełnił plagiat.
    No nieważne.
    Zapakuj program do uC, uC podłącz do PC poprzez MAX 232 do COMx, odpal na PC program HyperTerminal, zestaw połączenie - takie same parametry dla PC i uC i zobacz jak PC odbiera dane.

    Zapytaj nauczyciela jakie dane chce przesłać do PC. Bez większych problemów możesz mierzyć kontrolerem temperaturę, mierzyć napięcie, odczytywać stan portów itd. i dane te prezentować na monitorze PC. Jeśli ma to być profesjonalne to musisz napisać program na PC, który będzie prezentował wynik.
  • #4 3302928
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Tak - to program z książki pana Marcina Wiązania a ja go stworzyłem - przeklepałem (w tym znaczeniu) Postanowiłem że faktycznie pomiar temperatury o którym mówicie będzie dobrym pomysłem. W związku z tym udało mi się uzyskać taki programik - napisany poniżej. I teraz powinno to razem dobrze chodzić po.... sklejeniu to w jedną całość :) Mogę prosić o jeszcze jakieś uwagi jak to zrobić?

    PS. Książkę pana Wiązania kupiłem właśnie po to by nauczyć się programowania. Pozdrawiam serdecznie!


    $regfile = "m8def.dat"
    $crystal = 8000000 '

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2

    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Declare Sub Odcz_temp
    Config Portc.1 = Output

    Dim Wart_nap As String *
    Dim T As Single
    Dim Wart_ac As Word
    Dim V As Single

    Start Adc
    Do
    Portc.1 = 1

    Wart_ac = Getadc(0)
    V = Wart_ac * 0.0011
    T = V * 100

    Wart_nap = Fusing(t , "#.&&")

    Cls

    Lcd "dzisiaj jest "
    Lowerline
    Lcd "jest:" ; Wart_nap ; " st.C"
    Lowerline
    Lcd Wart_nap

    Waitms 500
    Loop
  • #5 3303131
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Niestety są tu błędy składniowe i brak wysyłania czegokolwiek poprzez UART - brak instrukcji PRINT!!!
    Zamieszczony program sluży do pomiaru napięcia przez uC
    Poniżej programik wyrzucający daną Pomiar przez UART
    Daną pomiar trzeba z jakiegoś źródła uzyskać. Zrób to w podprogramie

    $regfile = "m8def.dat" 'inf kompilator o pliku dyrektyw
    $crystal = 8000000 ' inf kompilator o f. oscylatora
    $baud = 19200 'inf kompilator o predkosci transmisji
    
    Dim Pomiar As Byte
     
    Do
    Gosub Zmierz 
    Print "Wartosc mierzona: " ; Pomiar 
    Print 'wstawienie linii odstepu
    Wait 10 'opoznienie 10 sekund
    
    Loop
    
    End ' koniec programu
    
    Zmierz:
    'Tu wpisz procedurę która w efekcie ustala wartość zmiennej Pomiar
    Return


    Jeśli stworzysz taki podprogram

    Zmierz:
    Incr Pomiar
    Return


    to pomiar będzie za każdym razem zwiększany o 1

    Na ekranie PC powinno sie znależć coś takiego:

    Wartosc mierzona: 1
     
    Wartosc mierzona: 2
    .............................
    Wartosc mierzona: 255
    
    Wartosc mierzona: 0


    itd.

    Jako program wyświetlakący dane na PC możesz użyć terminal stanowiący składnik Bascoma. Ustaw jedynie port i szybkość transmisji. W programie zmieniłem na 19200 bo chyba tak ustawiony jest terminal "fabrycznie".
  • REKLAMA
  • #6 3304775
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 19200

    Dim Pomiar As Byte

    Do
    Gosub Zmierz
    Print "Wartosc mierzona: " ; Pomiar
    Print 'wstawienie linii odstepu
    Wait 10 'opoznienie 10 sekund

    Loop

    End


    Zmierz:

    I Teraz Tutaj Mam Wstawic Procedure , Ktora Bedzie Robila Pomiar!

    Nastepnie Po Tym Ma Byc Incr Pomiar

    Pozniej Return



    I będzie to wtedy już chodziło? Ja naprawdę niewiele z tego rozumiem. Przepraszam za te głupie pytania ale chcę się czegoś nauczyć. Czy te dwie procedury - jedną od pana Wiązania i drugą z termometrem mogę wykorzystać czy one się nie przydadzą? Chodzi mi po prostu o szkielet tego programu. Resztę może jakoś powoli zrobię. Pozdrawiam!
  • Pomocny post
    #7 3305467
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Jedźmy dalej incr pomiar powoduje zwiększenie zmiennej Pomiar o 1. To był przykładowy podprogram, który za każdym razem kiedy był wywołany instrukcją gosub zwiększał wartość zmiennej - nic prostszego na próbę nie da się wymyśleć. Myślałem bardziej, że za pomocą tego programu sprawdzisz czy to wszystko działa i jak będzie działało to napiszemy coś bardziej ambitnego. To, że nie piszę od razu wszystkego to dla tego, żeby zmusić Cię do działania.
    Szkielet to już masz. Jest program, który powinien wysyłać wartość zmiennej pomiar do PC. Żeby nie zaciemniać proponuję pozyskiwanie zmiennej pomiar w podprogramie o nazwie Zmierz. Podprogram w pętli głównej będzie wywoływany poprzez instrukcję Gosub Zmierz więc procesor skoczy do podprogramu Zmierz, wykona instrukcje, których zadaniem będzie uzyskać watrość zmiennej pomiar. Po wykonaniu podprogramu uC wróci w miejsce z którego wyskoczył i w realizując Print wyśle wartość zmiennej pomiar do PC i tak w kółko.

    Jeszcze jedno pytanie. Czy to ma być tylko suchy program czy zaprogramowany i złożony układ z uC?
  • #8 3306818
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    M.S. - Już teraz bardzo Ci dziękuję za cierpliwość i wielką pomoc. Sprawa ma się tak: dostałem temat i mam napisać taki program i do tego wykonać wg podanego planu dokumentację techniczną. A że zupełnie jeszcze nie umiem Bascoma ani innego języka to kupiłem właśnie książkę Michała Wiązania i zamierzam się uczyć bo to każdy powinien wg mnie umieć. Teraz mam wiele Twoich uwag i muszę nad tym siąść, pomyśleć i w końcu coś stworzyć. Dlatego kilka dni nie będę się odzywał by w końcu zamiast pytań może coś zrobić i zaprezentować. Nie mówię o ekstra programie ale cokolwiek na temat. W Niedziele mam zajęcia odnośnie tego projektu to dopytam szczegóły i dam znać. Czas ucieka więc muszę porządnie nad tym popracować. Jeszcze raz wielkie dzięki za pomoc. Chętnie bym się odwdzięczył... Pozdrawiam serdecznie!
  • REKLAMA
  • #9 3315479
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Więc tak: ma to być program który później musi działać. Będzie załadowany do mikrokontrolera i efekt ma być widoczny na monitorze za pomocą aplikacji też napisanej przeze mnie w dowolnym programie. Może być to pomiar temperatury który będzie wyrzucał co np 10s wynik na kompa. Jak na razie udało mi się stworzyć tylko coś co znajduje się poniżej ale nie wiem nawet czy by to chodziło, w każdym razie kompiluje się. Jeśli można to proszę o kolejne uwagi. Pozdrawiam.

    Kod:


    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600

    Dim Pomiar As Byte
    Dim Wart_nap As String *
    Dim T As Single
    Dim Wart_ac As Word
    Dim V As Single

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2

    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Declare Sub Odcz_temp
    Config Portc.1 = Output

    Do
    Gosub Zmierz
    Print "Wartosc mierzona: " ; Pomiar
    Print
    Wait 10

    Loop

    End

    Zmierz:

    Start Adc
    Do
    Portc.1 = 1

    Wart_ac = Getadc(0)
    V = Wart_ac * 0.0011
    T = V * 100

    Wart_nap = Fusing(t , "#.&&")

    Cls

    Lcd "dzisiaj jest "
    Lowerline
    Lcd "jest:" ; Wart_nap ; " st.C"
    Lowerline
    Lcd Wart_nap

    Waitms 500
    Loop

    Incr Pomiar
    Return
  • #10 3315543
    teedd
    Poziom 19  
    Posty: 219
    Pomógł: 24
    Ocena: 2
    Witam.
    Wydaje mi się, że jak wpadniesz w pętlę Do ... Loop w podprogramie Zzmierz, to z niej nie wyjdziesz. Po co tam ta pętla? Pomijając to, do komputera wysyłasz tylko nr pomiaru, a wyniku pomiaru nie.
    Pozdrowienia - teedd
  • #11 3315698
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Witam ponownie. Faktycznie nie chodziło to chyba najlepiej. Skasowałem pętlę i zmieniłem Lcd na Print i robiąc symulację wyświetla mi się coś takiego:

    Temperatura wynosi: 0,00 stopni - (0,00 bo nie ma czujnika?)
    Wartość mierzona 1
    .
    .
    Wartość mierzona n



    Kod:

    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600

    Dim Pomiar As Byte
    Dim Wart_nap As String *
    Dim T As Single
    Dim Wart_ac As Word
    Dim V As Single

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2

    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Declare Sub Odcz_temp
    Config Portc.1 = Output

    Do
    Gosub Zmierz
    Print "Wartosc mierzona: " ; Pomiar
    Print
    Wait 10

    Loop

    End

    Zmierz:

    Start Adc
    Portc.1 = 1

    Wart_ac = Getadc(0)
    V = Wart_ac * 0.0011
    T = V * 100

    Wart_nap = Fusing(t , "#.&&")

    Lowerline
    Print "Temperatura wynosi:" ; Wart_nap ; " stopni"
    Lowerline

    Waitms 20

    Incr Pomiar
    Return
  • #12 3316168
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Zrobiłem w tym bałaganie trochę porządku. Program musi mieć logiczny przebieg. Nie można tu wrzucać instrukcji w dowolnej kolejności. Nie sprawdziłem czy działa. To Twoje zadanie. Zanim uruchomisz to go przeanalizuj. Najlepiej jak dopiszesz objaśnienia.

    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    Dim Pomiar As Byte
    Dim Wart_nap As String * 7
    Dim T As Single
    Dim Wart_ac As Word
    Dim V As Single
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    
    Do
    Gosub Zmierz
    Print "Temperatura wynosi:" ; Wart_nap ; " stopni"
    Print
    Wait 10
    
    Loop
    
    End
    
    Zmierz:
    Wart_ac = Getadc(0)
    V = Wart_ac * 0.0011 'PO CO MNOZYSZ PRZEZ 0,01 JAK ZA CHWILE
    'POMNOZYSZ PRZEZ 100! NIE LEPIEJ T=Wart_ac * 0,11
    T = V * 100
    Wart_nap = Fusing(t , "#.&&")
    Waitms 20
    Return
    


    A kto napisze program na PC?
  • #13 3340773
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Witam. Program jaki mi napisałeś był faktycznie krótszy i robił to samo co mój. Dopisałem tylko tą procedurę by wyrzucał mi który jest to pomiar. Z tym że jest to jeszcze trochę przy banalne i muszę coś tam jeszcze dorzucić. Nauczyciel zasugerował coś w rodzaju termostatu. Żeby wyskakiwał jakiś napis jeśli temperatura będzie za wysoka i inny jeśli będzie za niska. Co do programu na PC to też niestety ja muszę to zrobić :( Program ma wyłapywać dane z mikrokontrolera i wyświetlać na minitorze.

    Kod:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600

    Dim Pomiar As Byte
    Dim Wart_nap As String * 7
    Dim T As Single
    Dim Wart_ac As Word
    Dim V As Single

    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc


    Do
    Gosub Zmierz
    Print "Wartosc mierzona: " ; Pomiar ;
    Print
    Print "Temperatura wynosi:" ; Wart_nap ; " stopni"
    Print
    Waitms 20

    Loop

    End

    Zmierz:
    Wart_ac = Getadc(0)
    V = Wart_ac * 0.11
    Wart_nap = Fusing(t , "#.&&")
    Waitms 20
    Incr Pomiar

    Return
  • #14 3349578
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Zmienna Pomiar wyzeruje się przy 256 próbce. Watro więc zadeklarować ją jako Word - małoprawdopodobne żeby ktoś doczekał do 65536 próbki.
    Co do termostatu to napis może być wysłany przez uC do PC lub może go generować sam program PC jeśli przekroczone zostaną określone granice. W drugim przypadku jest łatwiej bo wystarczy badać zmienną w programie. W pierwszym przypadku doszła by druga lub nawet trzecia dana przesyłana do PC, więc trzeba by je identyfikować w programie PC. Należałoby "zbudować" protokół komunikacyjny. Najprościej wysyłać z uC zmienną word, której pierwszy bajt będzie określał jakie dane zawiera bajt drugi. W efekcie PC musi wiedzieć, że jeśli starszy bajt = 0 to młodszy zawiera temperaturę, jeśli "1" to dana wskazuje na przekroczenie temp. maksymalnej, a jeśli "2" to dotyczy to wart. minimalnej itp.
    Oczywiśie są to przemyślenia spłodzone na kolanie w celu wskazana ideii do zastosowania. Piłka po twojej stronie tj. powinieneś określić co dalej.

    P. S. Nie odpowiadałem bo post zdążył daleko odpłynąć na forum. Nie ślędzę forum na bieżąco, bo penetrowałem internet w poszukiwaniu informacji o bezpośrednich syntezach cyfrowych.
  • #15 3565004
    pmalczyk18
    Poziom 12  
    Posty: 89
    Ocena: 4
    Witam! Tak oto zakończyłem pracę z projektem. Zastosowałem kod w Bascomie który M.S. pomógł mi stworzyć zaś niestety niechlubnie muszę przyznać że aplikację pod Windowsa stworzyłem kopiując kod w C++ z pewnej książki. Sadząc po kodzie w życiu z moją wiedzą nie zrobiłbym tego sam. Ale neistety czeka mnie praca inżynierska którą będe robil najprawdopodobniej w Bascomie więc nie pozostaje mi nic innego jak cierpliwie się uczyć.

    M.S. - serdeczne dzięki za wielką pomoc i radę!! Pozdrawiam!

Podsumowanie tematu

✨ Dyskusja dotyczy tworzenia i testowania programu w Bascom AVR do eksportu danych przez interfejs szeregowy RS232 z mikrokontrolera ATmega8. Autor początkowo posiadał prosty szkic programu, który kompilował się, ale nie był pewien jego działania ani sposobu testowania transmisji. Uczestnicy forum doradzili podłączenie mikrokontrolera do komputera przez konwerter MAX232 i użycie programu HyperTerminal do odbioru danych, co umożliwia weryfikację poprawności transmisji. Zaproponowano rozwinięcie projektu o pomiar temperatury za pomocą przetwornika ADC i czujnika podłączonego do kanału ADC0, z wyświetlaniem wyniku na LCD oraz wysyłaniem danych do PC. Wskazano na konieczność implementacji podprogramu pomiarowego (Zmierz), który odczytuje wartość ADC, przelicza ją na temperaturę i formatuje do wysłania. Zwrócono uwagę na poprawną strukturę programu, unikanie błędów składniowych oraz na konieczność stworzenia protokołu komunikacyjnego do przesyłania różnych typów danych (np. wartości temperatury, sygnałów alarmowych termostatu). Autor otrzymał sugestię, by rozszerzyć program o funkcję termostatu, generującą komunikaty o przekroczeniu progów temperatury. Wskazano również, że aplikacja PC powinna odbierać i interpretować dane, wyświetlając je użytkownikowi. Na zakończenie autor potwierdził ukończenie projektu z pomocą kodu Bascom oraz aplikacji PC w C++, przyznając, że wymaga dalszej nauki programowania Bascom AVR.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA