Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM][ATmega16] Pytanie początkującego

bb5 07 Kwi 2010 18:51 1769 16
  • #1 07 Kwi 2010 18:51
    bb5
    Poziom 15  

    Witam!
    Skleciłem coś takiego:
    [BASCOM][ATmega16] Pytanie początkującego
    I programik:

    Code:
    $regfile = "m16def.dat"        
    
    $crystal = 1000000                       

    Config Portb = Input                                 
           Portb = &B00000000                                   
    Config Portc = Output                                     
           Portc = &B00000000                                 


     Do                                             

       If Pinb.0 = 0 Then                     
       Portc.1 = 1                               
       Elseif Pinb.1 = 0 Then                         
       Portc.1 = 0                                         
       End If                                                 

     Loop                                                     

    End

    Program nie działa tak jak powinien. Mianowicie zapala diodę ale już jej nie gasi. Czy możecie mi powiedzieć co zrobiłem źle?

    0 16
  • Pomocny post
    #2 07 Kwi 2010 19:08
    landy13
    Poziom 29  

    Zastosuj podciąganie:

    Code:
    Portb = &B11111111 

    A poza tym to widzę taki sam temat w koszu. Pewnie ktoś zaraportował jako obniżanie poziomu.

    0
  • #3 07 Kwi 2010 19:26
    bb5
    Poziom 15  

    Dzięki działa. To ja usunąłem, bo coś mi zaświtało w głowie ale nie wypaliło i założyłem jeszcze raz :)

    0
  • #4 12 Kwi 2010 21:17
    bb5
    Poziom 15  

    Witajcie!
    Znów mam problem, mianowicie z odczytem sharpa:

    Kod:

    Function Sharp_odczyt1() As Word
    Stop Timer0
    Sharp_odczyt1 = Getadc(0)
    Start Timer0
    End Function



    I po próbie skompilowania programu wyrzuca mi błąd:
    Kod:

    'Niewłaściwy typ danych' Invalid datatype[[0006]]


    Co jest nie tak?

    0
  • #5 12 Kwi 2010 22:52
    grysek
    Poziom 19  

    Mi się to kompiluje :P może pokaż cały kod, bo być może że błąd znajduje się gdzie indziej

    0
  • #6 12 Kwi 2010 23:24
    bb5
    Poziom 15  

    Code:
       $crystal = 8000000                                      
    

       $regfile = "m16def.dat"                                 

                                                                 

       Led1 Alias Portc.1

       Led2 Alias Portc.2                                     

       S1 Alias Pinb.0                                         

       S2 Alias Pinb.1

       S3 Alias Pinb.2                                         

       Pp Alias Pinc.7                                         

       Lp Alias Pinc.6                                         

       Lt Alias Pinc.5                                         

       Pt Alias Pinc.4                                         

       A1 Alias Portd.0                                       

       A2 Alias Portd.1

       B1 Alias Portd.2                                 

       B2 Alias Portd.3

       Ena Alias Portd.4                                     

       Enb Alias Portd.5                                     



       Ddra = &B00000011

       Ddrd = &B00111111

       Ddrb = &B00000000

       Ddrc = &B00000110



       Portd = &B00000110





       Porta = &B00000000

       Portc = &B00000000

       Portb = &B11111111



       'Dekleracja funkcji i procedur

       Declare Function Sharp_odczyt() As Word

       Declare Sub L_do_przodu(byval Szybkosc As Byte)

       Declare Sub L_do_tylu(byval Szybkosc As Byte)

       Declare Sub P_do_przodu(byval Szybkosc As Byte)

       Declare Sub P_do_tylu(byval Szybkosc As Byte)

       Declare Sub L_stop

       Declare Sub P_stop



       'Konfiguracja przetwornika analogowo-cyfrowego

       Config Adc = Single , Prescaler = Auto , Reference = Avcc

       Start Adc



       'Konfiguracja PWM dla silnikow

       Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64



       'Konfiguracja timera dla programu, przerwanie co ~2ms

       Config Timer0 = Timer , Prescale = 64

       On Timer0 Przerwanie



       Enable Interrupts                                       



       'Deklaracja zmiennych

       Dim Czas As Byte                                     

       Dim Czas2 As Byte                                   

       Dim Linie As Byte                                 

       Dim Namierzony_sharp1 As Bit

       Dim Namierzony_sharp2 As Bit                           

       Dim Stan As Byte                               

       Dim Obrot As Word                                 





       'Program glowny



       Linie = 0

       Led1 = 1                                     

       Wait 1

       Led1 = 0

       Bitwait S1 , Reset                             

       Led1 = 0                                           

       Wait 5

       Enable Timer0                             





       'Petla glowna



       Do

          If S1 = 0 Then                                   

             Stop Timer0

             Call L_stop

             Call P_stop

             Do                                           

             Loop

          End If





          If Czas2 = 12 Then                                   

             If Sharp_odczyt1() > 145 Then             

                Namierzony_sharp1 = 1             

             Else

                Namierzony_sharp1 = 0                         

                   If Sharp_odczyt2() > 145 Then

                Namierzony_sharp2 = 1

             Else

                Namierzony_sharp2 = 0

                End If

             End If

          End If



          If Czas2 = 13 Then                               

             Czas2 = 0                               

          End If



          Select Case Stan                         

          Case 1

          Gosub Pucieczka                               

          Case 2

          Gosub Tucieczka

          Case 0                                         

             If Namierzony_sharp1 = 1 Then               

                Gosub Gon

             Else

                If Namierzony_sharp2 = 1 Then

                Gosub Gon1

                Else                                           

                Gosub Szukaj

                End If

             End If

          End Select





       Loop                                                 



       Przerwanie:                                             

          Incr Obrot                                   

          Incr Czas2                                         

          If Czas = 0 Then                               

             Czas = 1                                   

          End If

          Decr Czas

          Linie.0 = Lp                                       

          Linie.1 = Lt                                         

          Linie.2 = Pp                                     

          Linie.3 = Pt



          Select Case Linie                                 

          Case 14                                             

             Stan = 1                                       

             Czas = 250                                     

             Call P_do_tylu(255)                             

             Call L_do_tylu(255)

          Case 13                                             

             Stan = 2

             Czas = 250

             Call P_do_przodu(255)                             

             Call L_do_przodu(255)

          Case 11

             Stan = 1                                           

             Czas = 250

             Call P_do_tylu(255)

             Call L_do_tylu(255)

          Case 7                                               

             Stan = 2

             Czas = 250

             Call P_do_przodu(255)

             Call L_do_przodu(255)

          Case 5                                               

             Stan = 2

             Czas = 250

             Call P_do_przodu(255)

             Call L_do_przodu(255)

          Case 10                                               

             Stan = 1

             Czas = 250

             Call P_do_tylu(255)

             Call L_do_tylu(255)

          Case 12                                               

             Stan = 3                                           

             Call P_do_przodu(255)                             

             Call L_do_tylu(255)

          Case 3

             Stan = 3                                         

             Call P_do_tylu(255)                               

             Call L_do_przodu(255)

          End Select

       Return



       Szukaj:                                                 

          Led = 1                                             

          If Obrot > 800 Then                                   

          Call P_do_przodu(65)                                 

          Call L_do_tylu(65)

          Else

          Call P_do_przodu(90)

          Call L_do_przodu(90)

          End If

          If Obrot = 2000 Then                                 

          Obrot = 0

          End If

       Return



       Gon:                                                     

          Call P_do_przodu(255)                                 

          Call L_do_przodu(255)

          Led = 0

          Obrot = 0

       Return

       Gon1:                                           

          Call P_do_tylu(255)                         

          Call L_do_tylu(255)

          Led = 0

          Obrot = 0

       Return



       Pucieczka:                                             

       If Czas > 0 And Czas < 128 Then                       

       Call P_do_tylu(255)

       Call L_do_przodu(255)

       End If

       If Czas > 129 Then                                   

       Call P_do_tylu(255)

       Call L_do_tylu(255)

       End If

       If Czas = 0 Then                                     

       Stan = 0

       End If

       Obrot = 0                                             

       Return





       Tucieczka:                                 

       If Czas > 0 Then                                   

       Call P_do_przodu(255)

       Call L_do_przodu(255)

       Else

       Stan = 0

       End If

       Obrot = 0

       Return





       Function Sharp_odczyt1() As Word         

       Stop Timer0                                             

       Sharp_odczyt1 = Getadc(0)                       

       Start Timer0                                           

       End Function



       Function Sharp_odczyt2() As Word                       

       Stop Timer0                                             

       Sharp_odczyt2 = Getadc(1)                               

       Start Timer0                                     

       End Function



       Sub P_do_przodu(byval Szybkosc As Byte)                 

       A1 = 1

       A2 = 0

       Pwm1a = Szybkosc

       End Sub



       Sub P_do_tylu(byval Szybkosc As Byte)

       A1 = 0

       A2 = 1

       Pwm1a = Szybkosc

       End Sub



       Sub L_do_przodu(byval Szybkosc As Byte)

       B1 = 1

       B2 = 0

       Pwm1b = Szybkosc

       End Sub



       Sub L_do_tylu(byval Szybkosc As Byte)

       B1 = 0

       B2 = 1

       Pwm1b = Szybkosc

       End Sub



       Sub P_stop                                             

       A1 = 0

       A2 = 0

       End Sub



       Sub L_stop

       B1 = 0

       B2 = 0

       End Sub


    Prawdę mówiąc jest to zmodyfikowany program Konaru.

    0
  • Pomocny post
    #7 13 Kwi 2010 16:00
    grysek
    Poziom 19  

    W zasadę działania programu nie wnikałem ale błędy jakie znalazłem to:

    1. Masz zadeklarowaną Funkcję Sharp_Odczyt natomiast w programie wywołujesz funkcje Sharp_Odczyt1 i Sharp_Odczyt2 które nie są zadeklarowane. Proponuję funkcję Sharp_Odczyt przerobić tak:

    Code:
    Function Sharp_odczyt(byval Kanal As Byte) As Word
    
       Stop Timer0
       Sharp_odczyt = Getadc(kanal)
       Start Timer0
     End Function

    Deklaracje zmienić na:
    Code:
      Declare Function Sharp_odczyt(byval kanal as byte) As Word  

    a wywoływać ją w ten sposób że zamiast Sharp_odczyt1 wywoływać Sharp_odczyt(0) a zamiast Sharp_odczyt2, Sharp_odczyt(1).


    2. Na początku programu masz przypisane nazwy dla Portc.1 i Portc.2, LED1 i LED2 natomiast w programie 3 razy przypisujesz wartość dla bitu LED którego nie ma.

    To by było chyba wszystko po poprawieniu błędów program powinien się bez problemu skompilować :P

    Pozdrawiam

    0
  • #8 13 Kwi 2010 16:43
    bb5
    Poziom 15  

    Super!
    Dzięki. Jeszcze tylko jedno:

    Code:
    Function Sharp_odczyt(byval Kanal As Byte) As Word
    
       Stop Timer0
       Sharp_odczyt = Getadc(kanal) 'nie powinno być Kanal?
       Start Timer0
     End Function

    0
  • #9 13 Kwi 2010 16:45
    grysek
    Poziom 19  

    Chodzi Ci o to że z małej litery napisałem? A BASCOM nie zwraca na to uwagi czy z dużej czy z małej :P

    0
  • #11 14 Kwi 2010 17:39
    bb5
    Poziom 15  

    Poprawiłem kod. Lecz ciągle nie chce skompilować :( Wyświetla błąd "Nieznane oświadczenie [SZUKAJ]". Raczej wszystko powinno działać.

    0
  • #13 14 Kwi 2010 21:25
    bb5
    Poziom 15  

    Linijka 122(podświetla Loop) i 176 (podświetla Return)

    0
  • #14 14 Kwi 2010 21:31
    grysek
    Poziom 19  

    Wyślij mi ten Twój kod :P Zobaczę co tam wyrobiłeś

    0
  • #16 14 Kwi 2010 22:00
    grysek
    Poziom 19  

    Mi się to kompiluje bez problemu. Być może masz za starego BASCOMA ? i stąd jakieś błędy :P

    0
  • #17 14 Kwi 2010 22:07
    bb5
    Poziom 15  

    Mam 1.11.9.0. Poszukam innej wersji. Może być 1.11.9.8?

    //edit:
    Po mimo instalacji nowszej wersji nic. Możesz mi podesłać plik hex?
    //edit2:P
    Na innym komputerze się udało. Nie wiem co o tym myśleć. Ale już wszystko ok.

    0