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][ATmega16] Pytanie początkującego

bb5 07 Kwi 2010 18:51 1967 16
REKLAMA
  • #1 7932013
    bb5
    Poziom 15  
    Witam!
    Skleciłem coś takiego:
    [BASCOM][ATmega16] Pytanie początkującego
    I programik:
    $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?
  • REKLAMA
  • Pomocny post
    #2 7932112
    landy13
    Poziom 31  
    Zastosuj podciąganie:
    Portb = &B11111111 

    A poza tym to widzę taki sam temat w koszu. Pewnie ktoś zaraportował jako obniżanie poziomu.
  • #3 7932208
    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 :)
  • #4 7953513
    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?
  • REKLAMA
  • #5 7954181
    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
  • REKLAMA
  • #6 7954314
    bb5
    Poziom 15  
       $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.
  • Pomocny post
    #7 7956250
    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:
    Function Sharp_odczyt(byval Kanal As Byte) As Word
       Stop Timer0
       Sharp_odczyt = Getadc(kanal)
       Start Timer0
     End Function

    Deklaracje zmienić na:
      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
  • #8 7956409
    bb5
    Poziom 15  
    Super!
    Dzięki. Jeszcze tylko jedno:
    Function Sharp_odczyt(byval Kanal As Byte) As Word
       Stop Timer0
       Sharp_odczyt = Getadc(kanal) 'nie powinno być Kanal?
       Start Timer0
     End Function
  • #9 7956419
    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
  • #10 7956442
    bb5
    Poziom 15  
    Aha. Ciągle się uczę :P
  • REKLAMA
  • #11 7960723
    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ć.
  • #12 7961841
    grysek
    Poziom 19  
    w której linijce ten error ? :P
  • #13 7961876
    bb5
    Poziom 15  
    Linijka 122(podświetla Loop) i 176 (podświetla Return)
  • #14 7961924
    grysek
    Poziom 19  
    Wyślij mi ten Twój kod :P Zobaczę co tam wyrobiłeś
  • #16 7962131
    grysek
    Poziom 19  
    Mi się to kompiluje bez problemu. Być może masz za starego BASCOMA ? i stąd jakieś błędy :P
  • #17 7962183
    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.
REKLAMA