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

[Bascom] [Atmega8] Przyjmuje watrość inną niż podana

mkpl 04 Kwi 2011 15:13 1436 5
  • #1 9359084
    mkpl
    Poziom 37  
    Witam
    Siedzę nad kodem który dekoduje informację bcd na porcie D i gdy wykryje zmianę zmienia wartość zmiennej freq problem w tym, że program na symulatorze dziwnie startuje.

    Wykrywa zmianę wartości na porcie ale ma problem z przypisaniem odpowiedniej wartości do zmiennej Freq i ciągle wywala 0 dopiero po chwili zabawy stanami na portach program załapuje i działa tak jak chce


    
    $regfile = "m8def.dat"
    $sim
    $crystal = 8000000
    Dim C As Byte
    Dim B As Byte
    
    Dim Freq As Byte
    
    Config Pinc.5 = Input
    Config Pinc.4 = Input
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    
    
    Set Portc.2
    Set Portc.3
    Set Portc.4
    Set Portc.5
    
    
    Declare Sub Wart
    
    'S1 Alias Portc.6
    
    'Freq = 123
    
    'C = 0
    
    Do
    C = Portc
    C = C And &B00111100
    Shift C , Right , 2
    
    
    
    
    If C <> B Then
    Call Wart
    End If
    
    If C = 0 Then Freq = 123
    
    If C = 1 Then Freq = 122
    
    If C = 2 Then Freq = 13
    
    If C = 3 Then Freq = 144
    
    If C = 4 Then Freq = 155
    
    If C = 5 Then Freq = 166
    
    If C = 6 Then Freq = 177
    
    If C = 7 Then Freq = 188
    
    If C = 8 Then Freq = 199
    
    If C = 9 Then Freq = 146
    
    B = C
    
    
    
    Loop
    End
    
    
    
    Sub Wart
    Lcd "byla zmiana"                                           '
    Waitms 800
    Cls
    Lcd Freq
    Waitms 800
    Cls
    
    End Sub
    
    


    Proszę kod umieścić w znacznikach code.
    Robak
  • #2 9359777
    bogdan_p
    Poziom 39  
    Do odczytu stanu portu służy instrukcja PINx a nie PORTx , zmieniłem też sposób wyświetlania informacji bo przy Twoim nawet nie wiesz co było i co jest bo czyścisz za każdym razem wyświetlacz

    $regfile = "m8def.dat"
    $sim
    $crystal = 8000000
    Dim C As Byte
    Dim B As Byte
    
    Dim Freq As Byte
    
    Config Pinc.5 = Input
    Config Pinc.4 = Input
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    Set Portc.2
    Set Portc.3
    Set Portc.4
    Set Portc.5
    
    Do
    C = Pinc
    C = C And &B00111100
    Shift C , Right , 2
    
    If C <> B Then
    Locate 1 , 1
    Lcd "byla zmiana"
    End If
    
    If C = 0 Then Freq = 123
    
    If C = 1 Then Freq = 122
    
    If C = 2 Then Freq = 13
    
    If C = 3 Then Freq = 144
    
    If C = 4 Then Freq = 155
    
    If C = 5 Then Freq = 166
    
    If C = 6 Then Freq = 177
    
    If C = 7 Then Freq = 188
    
    If C = 8 Then Freq = 199
    
    If C = 9 Then Freq = 146
    
    B = C
    
    Lowerline
    Lcd Freq
    Wait 1
    Locate 1 , 1
    Lcd "           "
    Loop
    End
    
  • #3 9360349
    mkpl
    Poziom 37  
    Trochę w międzyczasie dopisałem.

    Synteza poprawnie działa ale tylko z wpisaną na początku programu wartością Freq i tylko na tą częstotliwość stroji... Jeśli wywalę Freq z początku programu nie rusza wcale. Próbowałem z Pin, Port i nie rusza

    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku dyrektyw mikrokontrolera
    $crystal = 7200000
    
    
    
    
    Config Portd.2 = Output                                     'data    pin5 lm7001
    Config Portd.3 = Output                                     'Clock   pin4 lm7001
    Config Portd.4 = Output                                      'CE      pin3 lm7001
    
    Config Pinc.5 = Input
    Config Pinc.4 = Input                                       ' zmienne wejsc
    Config Pinc.3 = Input
    Config Pinc.2 = Input
    
    
    
    Reset Portd.2                                               ' wstępne ustawienie stanów na portach
    Reset Portd.3                                               ' porty transmisyjne ustawione na zero
    Reset Portd.4
    
    
    Set Portc.2
    Set Portc.3
    Set Portc.4
    Set Portc.5
    
    
    
    Declare Sub Synteza                                         ' program przesyłania danych do syntezy
    Declare Sub Zegarek                                         '
    Declare Sub Wart
    
    
    Dim C As Byte
    Dim B As Byte
    Dim A As Byte                                               ' zmienna dla petli FOR
    Dim Freq As Word                                            ' zmienna ustawiająca częstotliwość LM7001
    Dim Sterowanie As Byte
    
    
    
    Call Synteza                                                ' ustawienie LM7001
    Freq = 5416
    Call Synteza
    
    
    
    Do
    C = Portc
    C = C And &B00111100
    Shift C , Right , 2
    
    'If C <> B Then
    Call Wart
    'End If
    
    'B = C
    Loop
    End
    
    
    
    Sub Wart
    
    
    If C = 0 Then
    Freq = 5352
    End If
    
    If C = 1 Then
    Freq = 5360
    End If
    
    If C = 2 Then
    Freq = 5368
    End If
    
    If C = 3 Then
    Freq = 5376
    End If
    
    If C = 4 Then
    Freq = 5384
    End If
    
    If C = 5 Then
    Freq = 5392
    End If
    
    If C = 6 Then
    Freq = 5400
    End If
    
    If C = 7 Then
    Freq = 5408
    End If
    
    If C = 8 Then
    Freq = 5416
    End If
    
    
    If C = 9 Then
    Freq = 5424
    End If
    
    
    Call Synteza
    
    
    End Sub
    
  • #4 9360771
    bogdan_p
    Poziom 39  
    Teraz to już nie wiem co Ty chcesz stworzyć , gotowy projekt na LM7001 http://sq1ftb.prothost.pl/articles.php?article_id=8 z którego chyba korzystasz , rozumiem że chcesz w inny sposób wprowadzać zmiany częstotliwości ale nie możesz do tego używać portu C na którym masz LCD , Port D.2 , D3 to enkoder wykorzystujący przerwanie . Masz gotowy projekt wystarczy zmienić tylko podprogram Getenkoder na inną formę wprowadzania zmian , pamiętając o usunięciu wszystkiego co jest związane z jego obsługą i wykorzystać wolne piny kontrolera .
  • #5 9361129
    mkpl
    Poziom 37  
    Wcale nie korzystam z tego programu. Na podstawie tego napisałem tylko kontrolę samej syntezy (potrzebowałem wzoru co i jak wysyłać ale nie dawałem go na forum aby nie robić zbyt długiego postu).

    Program od początku piszę sam (miejscami się tylko wzoruje). W moim projekcie jest tylko wybieranie jednej z 10 sztywno wpisanych częstotliwości które są wybierane za pomocą kodu BCD bo taki dostaję z wbudowanego impulsatora.

    W moim projekcie nie ma lcd enkodera rogera tonu i innych wodotrysków. Tylko Atmega + LM7001 oraz owy sygnał wybrania kanału :)

    Na początku masz rację próbowałem modyfikować tamten kod ale napisanie tego od początku było szybsze. Tylko właśnie wszystko chodzi poza wyborem częstotliwości.

    W symulatorze wszystko chodzi bezproblemowo natomiast w sam procesor nie odczytuje stanu portu i nie zmienia częstotliwości
  • #6 9366862
    mkpl
    Poziom 37  
    Przepisałem cały kod jeszcze raz i poprawiłem tu i ówdzie

    Problem jest następujący.
    Pętla główna ignoruje fizyczne zmiany na portach i za diabła nie chce odpalić.
    Jeśli na sztywno wpiszę np C = 9 to program działa poprawnie i ustawia częstotliwość przypisaną do wartości 9.

    Kombinowałem jak kolega mówił z portami. Zrobiłem porty podciągnięte do zasilania obecnie ustawiłem porty wejściowe w stan wysokiej impedancji i nic nie działa :|

    
    
    Config Pind.2 = 1 : Portd.2 = 0                             'data    pin5 lm7001
    Config Pind.3 = 1 : Portd.3 = 0                             'Clock   pin4 lm7001
    Config Pind.4 = 1 : Portd.4 = 0                             'CE      pin3 lm7001
    
    Config Pinc.5 = 0 : Portc.5 = 0                             'wejscia wybierajace
    Config Pinc.4 = 0 : Portc.4 = 0
    Config Pinc.3 = 0 : Portc.3 = 0
    Config Pinc.2 = 0 : Portc.2 = 0
    
    
    Declare Sub Synteza
    Declare Sub Takt
    Declare Sub Wart
    
    
    Dim B As Byte , C As Byte , Freq As Word
    
    
    Call Synteza                                                'wstepne ustawienie LM7001
    Freq = 5432
    
    
    
    
    Do
    C = Portc
    C = C And &B00111100
    Shift C , Right , 2
    'C = 7
       If C <> B Then
       Call Wart
       End If
    
    B = C
    Loop
    End


    Trywialny błąd aż dziw, że go nie zauważyłem :D zamiast portc ma być pinc inaczej program nie zareaguje na zmianę stanu wejść portu

    tutaj kawałek poprawionego kodu gdzie był ukryty bobol...

    
    Do
    C = Pinc ' tu był bład
    C = C And &B00111100
    Shift C , Right , 2
    'C = 7
       If C <> B Then
       Call Wart
       End If
    
REKLAMA