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

[BASCOM] [ATMEGA16] blad danych RS232, timer

sorex86 23 Mar 2010 22:25 1696 4
  • #1 7872421
    sorex86
    Poziom 15  
    Witam,.

    Mam następujący problem:

    Przetwornik analogowy na ADC pin 1
    Przetwornik częstotliwość na Timer0
    max232 1uF
    Kwarc 8Mhz i atmega16L

    Na kablu ze złączkami BNC mam połączenie atmega -> przetwornik czestotliwosci (2 kolumna). Wydaje mi się, że wszystko dobrze zlutowane oraz nie ma przerw w kablu BNC. Kabel mam 50 Ohm.

    Podczas wysyłania danych na PC przez COMa mam takie błedy:

    308.77 49.30
    304.78 25769738257.50
    310.66 49.80
    293.02 49.60
    316.54 49.70
    297.92 48.90
    316.54 48.70
    293.48 48.60
    309.68 573440.30
    294.98 49.81
    304.78 48.50
    304.78 44.90


    Brak stabilności danych w stałych warunkach.

    Mój program wygląda następująco:

    $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
    
    Config Timer1 = Timer , Prescale = 64
    Config Timer0 = Counter , Edge = Falling
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Cursor Off
    Dim Czestotliwosc As Long
    Dim Wart_ac As Word
    Dim P As Single
    Dim V As Single
    Dim W As Single
    Dim T As Single
    Const Licznik = 64285
    
    On Timer1 Czas
    On Timer0 Zlicz
    
    Enable Interrupts
    Enable Timer1
    Enable Timer0
    Counter1 = Licznik
    
    Do
    
       Wart_ac = Getadc(1)
    
       V = Wart_ac * 0.0049
       P = V * 200
    
       Lcd ;
       Cls
    
       Lcd Fusing(p , "#.##") ; " hPa";
       Lowerline
       Lcd Fusing(t , "#.##") ; " kHz"
    
       Print Fusing(p , "#.##") ; " ";
       Print Fusing(t , "#.##") ;
       Print
    
       Waitms 150
    
    Loop
    
    End
    
    Czas:
    
      Czestotliwosc = Czestotliwosc * 64
      Czestotliwosc = Czestotliwosc + Counter0
      T = Czestotliwosc
      T = T / 10
      Czestotliwosc = 0
      Counter0 = 0
      Counter1 = Licznik
    
    Return
    
    Zlicz:
    Incr Czestotliwosc
    Return
    


    Pytanie:

    Czy program powoduje chwilowe wieszanie się mikroprocesora? Zdaje sobie sprawę, że jest strasznie prymitywny - to są moje początki z mikroprocesorami i nie do końca rozumiem jak poprawnie korzystać z jego możliwości. Czy po prostu luty, kabel mam kiepskie (już 3 kable testowałem oraz pół dnia z lutownicą spędziłem) i styki są przyczyną? Wydaje mi się, że połączenia mam poprawne, dlatego wole się upewnić czy po prostu mikroprocesora nie wieszam. Gdzie szukać błędu?:)

    Bardzo proszę o pomoc o wgląd do programu...
  • #2 7873017
    jony15
    Poziom 24  
    Może spróbuj uśredniać wyniki z ADC np 50 pomiarów i średnia z 50 pomiarów jako wyjściowa wartość, lub 52 pomiary, największy i najmniejszy pomiar odrzucasz i średnia z reszty.
  • #3 7873185
    sorex86
    Poziom 15  
    No wlasnie, ze rzad bledu jest tak duzy, ze usredniania calkowicie nie eliminuje bledow chociaz niewielka poprawa juz jest.

    A da sie moze to napisac bez wykorzystania? Zauwazylem, ze jak zmienie na 500 ms to praktycznie bledow nie ma lecz za mala liczba pomiarow wtedy wystepuje

    
    Do
    
    ....
    Waitms 150 
    
    Loop
    


    Tzn,. pewnie sie da, ale jak?:)
  • #4 7873187
    Logan
    Poziom 30  
    Piszesz, że masz kwarc 8MHz, w programie, że ustawione fabryczne taktowanie 1MHz. Jak masz fusy?
  • #5 7873211
    sorex86
    Poziom 15  
    Fusy mam na 8Mhz, czas odmierza dobrze, czestotliwosc takze. Sprawdzalem miernikiem oraz na 40min testow spieszy sie o jakies 2-3s ( -+ czas reakcji na stoperze).
REKLAMA