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

[ATMEGA16] [BASCOM] AC, TIMER i plywajacy LCD

sorex86 09 Lut 2010 01:49 2346 5
  • #1 7666240
    sorex86
    Poziom 15  
    Witam :)

    Po kilku dniach zabawy udało mi się zbudować układ składający się z ATMEGA16 (kwarc zewnętrzny 8 MHZ, rs232) i:
    - czujnika podającego na pin A1 napięcie 0.2-4.7V
    - czujinka podającego częstotliwość 4-40kHz na pin PBO.

    Po przestudiowaniu podstaw BASCOMu i lekturze forum udało mi się napisać oddzielne programy do obsługi tych czujników. Jednak gdy próbuje równocześnie wyświetlić wyniki pomiarów z oby dwóch czujników na wyświetlaczu LCD to znaki się "rozpływają" lub przechodzą na chińska czcionkę :)


    Kod programu:

    $regfile = "M16def.DAT"
    $crystal = 8000000
    $baud = 38400
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5       ' TAKTOWANIE PROC FABRYCZNE 1Mhz
    Config Lcd = 16 * 2
    Cursor Off
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Timer1 = Timer , Prescale = 64
    Config Timer0 = Counter , Edge = Falling
    
    Dim Czestotliwosc As Long
    Dim Wart_ac As Word
    Dim P As Single
    Dim V As Single
    Dim Wart_nap As String * 3
    Dim Wart_cis As String * 3
    
    Const Licznik = 64285
    
    On Timer1 Czas
    On Timer0 Zlicz
    
    Enable Interrupts
    Enable Timer1
    Enable Timer0
    Counter1 = Licznik
    
    Start Adc
    Do
       Wart_ac = Getadc(1)
       Cls
      Lcd Wart_ac;
      Print Wart_ac;
      Waitms 250
    Loop
    
    End
    
    Czas:
    
      Stop Timer0
      Stop Timer1
      Czestotliwosc = Czestotliwosc * 64
      Czestotliwosc = Czestotliwosc + Counter0
    
    Lowerline
    Lcd "    " ; Czestotliwosc ; "kHz";
    Print Czestotliwosc ; " "
    
      Czestotliwosc = 0
      Counter0 = 0
      Counter1 = Licznik
      Start Timer0
      Start Timer1
    
    Return
    
    Zlicz:
    Incr Czestotliwosc
    
    Return
    
    


    Kombinowałem już z różnymi wartościami wait oraz ustawieniami locate x,y. Dane mogę przesyłać do komputer bez problemów jednak nie potrafię opanować wyświetlacza. Gdy użyję komendy "LCD" to zmiana parametrów tylko jednego czujnika jest przesyłana do komputera, natomiast wartość drugiego czujnika wynosi wtedy 0. Dlatego mam pytanie, jak połączyć działanie przetwornika oraz timera aby móc bez problemu wyświetlać dane na LCD? Czy to jest problem za słabego kwarcu czy po prostu program zle napisany - gdzie szukać rozwiązania?:) Zdaję sobie sprawę, że ASM czy C pewnie lepiej poradzą sobie z obsługą czujników jednak na dzień dzisiejszy tylko BASCOM mnie interesuje.
  • #2 7666471
    Konto nie istnieje
    Poziom 1  
  • #3 7666480
    marco47
    Poziom 41  
    Wszystko jest źle napisane . Zacznij od początku , najpierw opanuj wyświetlanie na LCD a dopiero później dodawaj inne paści cały czas kompilując aby nie pogubić się w kodzie . Druga sprawa to dokładne opisywanie poszczególnych linii kodu ( naprawdę pomaga na sklerozę) , tak abyś po jakimś czasie bez problemu mógł odczytać swoją twórczość .
  • #4 7666876
    leon1313
    Poziom 15  
    Kiedyś zrobiłem prosty voltomierz na atmega32 z linijką diodową i wyświtlaniem LCD:
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    'konfiguracja wyświetlacza LCD
    Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
    Config Lcd = 16 * 2
    Cursor Off
    'konfiguracja portu b - dla wyswietlania diod
    Config Portb = Output
    Portb = 255
    
    
    Dim Val0 As Word                                            ' wartosc odczytana
    Dim Val0_str As String * 4                                  ' wartosc odczytana- string
    Dim Volt As Single                                          ' w voltach
    Dim Vol_str As String * 4                                   ' volty w przyjanym formacie
    Dim Val1 As Word                                            ' pomocnicza przy aktualizacji lcd
    Val1 = 1024                                                 ' aby pierwszy raz wyswietlilo wartosc
    Dim Channel As Byte                                         ' kanal (pin)
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'prescaler (7 bit, najlepiej auto) i zrodlo odniesienia
    
    Start Adc
    
    Channel = 0                     'PINA.0
     Cls
     Lcd "Volt:"
     Lowerline
     Lcd "ADC: "
    
    
    Do
       Val0 = Getadc(channel)
       Portb = 255
       If Val0 > 50 Then Reset Portb.0
       If Val0 > 150 Then Reset Portb.1
       If Val0 > 300 Then Reset Portb.2
       If Val0 > 450 Then Reset Portb.3
       If Val0 > 600 Then Reset Portb.4
       If Val0 > 750 Then Reset Portb.5
       If Val0 > 900 Then Reset Portb.6
       If Val0 > 1000 Then Reset Portb.7
    
       Volt = Val0 * 0.0048828
       Vol_str = Fusing(volt , "#.##")
       Val0_str = Str(val0)
       Val0_str = Format(val0_str , "0000")
    
       If Val0 <> Val1 Then
          Val1 = Val0
          Locate 1 , 7
          Lcd Vol_str
          Locate 2 , 7
          Lcd Val0_str
       End If
    Loop 
    

    Z częstotliwością nie robiłem, bo nie mam generatora, aby to sprawdzić :-)
  • #5 7667780
    sorex86
    Poziom 15  
    Korzystając z Waszych wskazówek przerobiłem program tak:

    Dim Test As Long  


    ...

    Start Adc
    Do
       Wart_ac = Getadc(1)
       Cls
    
    Lcd Wart_ac ;
    Lowerline    
    Lcd Test;    'poprawka  
    Waitms 250
    Loop
    
    End
    
    Czas:
    
      Stop Timer0
      Stop Timer1
      Czestotliwosc = Czestotliwosc * 64
      Czestotliwosc = Czestotliwosc + Counter0
      Test = Czestotliwosc                  'poprawka
      Czestotliwosc = 0
      Counter0 = 0
      Counter1 = Licznik
      Start Timer0
      Start Timer1
    
    
    Return
    
    Zlicz:
    Incr Czestotliwosc
    
    Return


    Niby teraz wszystko działa, jednak czy aby na pewno to jest poprawnie. Mam wątpliwości,. trochę błądzę jak dziecko we mgle..
  • #6 7669564
    Konto nie istnieje
    Poziom 1  
REKLAMA