Błąd przy kompilacji.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Sebastian RCS
Użytkownik
Posty: 472
Rejestracja: 03 lut 2003, 18:23
Lokalizacja: Koluszki
Kontakt:

Błąd przy kompilacji.

Post autor: Sebastian RCS » 07 sie 2005, 13:20

Robię sobie sterownik do silników DC z gazety NE na ATtiny. Płytkę złożyłem i teraz tylko muszę to skompilować i wgrać do procka. Napotykam na błędy przy kompilacji.
Proszę zaradźcie coś!

Kod: Zaznacz cały

'Bascom-AVR ver.1.11.7.4
$regfile = "AT26DEF.DAT"
$crystal = 8000000

 Ddrb = &B00001100
Portb = &B00001111

'Osccal = 238
'Osccal = 226
'Osccal = 210
'Osccal = 190
'Osccal = 162
'Osccal = 124
'Osccal = 65
Osccal = 65

Pllcsr = &B00000010
Pllcsr = &B00000111
Ocr1c = 225
Ocr1b = 128

'Tccr1b = &B01000010
'Tccr1b = &B01000011
'Tccr1b = &B01000100
Tccr1b = &B01000100
Tccr1a = &B00110000

Config Pina.0 = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Pina.5 = Output
Config Pina.6 = Output
Config Pina.7 = Input
Config Pinb.0 = Input
Config Pinb.1 = Input

A_seg Alias Porta.5
B_seg Alias Porta.6
C_seg Alias Porta.4
D_seg Alias Porta.3
E_seg Alias Porta.2
F_seg Alias Porta.1
G_seg Alias Porta.0
   A_k Alias Pina.7
    S1 Alias Pinb.0
    S2 Alias Pinb.1

Declare Sub Cyfry(cyfra As Byte)
Dim Cyfra As Byte
Dim Ocr As Byte
Dim Czas As Word

'############################
'GŁÓWNA PĘTLA PROGRAMU
'############################

 If S1 = 0 Then
    Waitms 100
    Cyfra = 11
    Call Cyfry(cyfra)
    Do
    Loop Until S1 = 1
    Waitms 100
    Readeeprom Cyfra , 1
    If Cyfra > 9 Then Cyfra = 0
    Call Cyfry(cyfra)
 Do
  If S1 = 0 Then
     Waitms 100
     Incr Cyfra
            If Cyfra > 9 Then
               Cyfra = 0
            End If
     Call Cyfry(cyfra)
     Do
     Loop Until S1 = 1
     Waitms 100
  End If
 Loop Until S2 = 0
     Waitms 100
     Do
     Loop Until S2 = 1
     Waitms 100
 Writeeeprom Cyfra , 1
     Cyfra = 12
     Call Cyfry(cyfra)
     Wait 1
  End If

'#############################
'#############################

 Readeeprom Cyfra , 1
 If Cyfra > 9 Then Cyfra = 1
  Call Cyfry(cyfra)
 Select Case Cyfry
     Case 1 :
          Osccal = 128                                      '100Hz
          Tccr1b = &B01001100                               '100Hz
     Case 2 :
          Osccal = 128                                      '200Hz
          Tccr1b = &B01001011                               '200Hz
     Case 3 :
          Osccal = 204                                      '300Hz
          Tccr1b = &B01001011                               '300Hz
     Case 4 :
          Osccal = 128                                      '400Hz
          Tccr1b = &B01001010                               '400Hz
     Case 5 :
          Osccal = 175                                      '500Hz
          Tccr1b = &B01001010                               '500Hz
     Case 6 :
          Osccal = 176                                      '1k
          Tccr1b = &B01001001                               '1k
     Case 7 :
          Osccal = 176                                      '2k
          Tccr1b = &B01001000                               '2k
     Case 8 :
          Osccal = 116                                      '3k
          Tccr1b = &B01000111                               '3k
     Case 9 :
          Osccal = 176                                      '4k
          Tccr1b = &B01000111                               '4k
     Case 0 :
          Osccal = 210                                      '5k
          Tccr1b = &B01000111                               '5k

 End Select

'#################################
     Tccr1a = &B00010001
'#################################

  Ocr = 128
 Do
  If S2 = 0 Then
  If Czas < 6000 Then Waitms 40
          If Ocr < 225 Then Incr Ocr
          Czas = 0
     Do
      Incr Czas
     Loop Until S2 = 1 Or Czas = 6000
     If Czas < 6000 Then Waitms 40
  End If

'#################################

  If S1 = 0 Then
  If Czas < 6000 Then Waitms 40
          If Ocr > 0 Then Decr Ocr
          Czas = 0
     Do
      Incr Czas
     Loop Until S1 = 1 Or Czas = 6000
     If Czas < 6000 Then Waitms 40
  End If


 Ocr1b = Ocr
 Loop

'#################################
'*********************************
'#################################

 Sub Cyfry(cyfra As Byte)
 Select Case Cyfra
     Case 0 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 0
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 1
           End If
     Case 1 :
             If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           Elseif A_k = 1 Then
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           End If
     Case 2 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 0
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 1
              G_seg = 0
           End If
     Case 3 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 0
           End If

     Case 4 :
             If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 5 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 1
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 6 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 1
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
     Case 7 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           End If
     Case 8 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
     Case 9 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 11 :
             If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 0
           End If
     Case 12 :
             If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Elseif A_k = 1 Then
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
 End Select
 End Sub
 '******************************
 End
Błędy wyskakują takie:

Obrazek

Awatar użytkownika
radzio
Użytkownik
Posty: 573
Rejestracja: 07 gru 2004, 23:06
Lokalizacja: Sosnowiec
Kontakt:

Post autor: radzio » 07 sie 2005, 15:09

W linii numer 97 :

Kod: Zaznacz cały

 Select Case Cyfry

najprawdopodobniej ma być

Kod: Zaznacz cały

 Select Case Cyfra
bo nie spotkałem się z nazwą podprogramu jako parametrem instrukcj select case
Po takiej zamianie się kompiluje bez problemu, ale czy zadziała to nie wiem :?:

Sebastian RCS
Użytkownik
Posty: 472
Rejestracja: 03 lut 2003, 18:23
Lokalizacja: Koluszki
Kontakt:

Post autor: Sebastian RCS » 07 sie 2005, 15:22

Miałeś rację :mrgreen: .
Właśnie spojrzałem do gazety, jeszcze raz do tego kodu i okazało się, że źle przepisałem to jedno słowo.
Dzięki Ci serdeczne. Nikt mi nie potrafił pomóc, już kilka miesięcy wcześniej miałem ten problem i próbowałem na elektrodzie.
Jeszcze raz dzięki za pomoc. :!:

ZbeeGin

Post autor: ZbeeGin » 07 sie 2005, 16:41

A spróbuj tego programa:

Kod: Zaznacz cały

$regfile = "AT26DEF.DAT"
$crystal = 8000000

 Ddrb = &B00001100
Portb = &B00001111

'Osccal = 238
'Osccal = 226
'Osccal = 210
'Osccal = 190
'Osccal = 162
'Osccal = 124
'Osccal = 65
Osccal = 65

Pllcsr = &B00000010
Pllcsr = &B00000111
Ocr1c = 225
Ocr1b = 128

'Tccr1b = &B01000010
'Tccr1b = &B01000011
'Tccr1b = &B01000100
Tccr1b = &B01000100
Tccr1a = &B00110000

Config Pina.0 = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Pina.5 = Output
Config Pina.6 = Output
Config Pina.7 = Input
Config Pinb.0 = Input
Config Pinb.1 = Input

A_seg Alias Porta.5
B_seg Alias Porta.6
C_seg Alias Porta.4
D_seg Alias Porta.3
E_seg Alias Porta.2
F_seg Alias Porta.1
G_seg Alias Porta.0
  A_k Alias Pina.7

   S1 Alias Pinb.0
   S2 Alias Pinb.1

Declare Sub Cyfry(cyfra As Byte)
Dim Cyfra As Byte
Dim Ocr As Byte
Dim Czas As Word

'############################
'GŁÓWNA PĘTLA PROGRAMU
'############################

If S1 = 0 Then
  Waitms 100
  Cyfra = 11
  Call Cyfry(cyfra)
  Do
  Loop Until S1 = 1
  Waitms 100
  Readeeprom Cyfra , 1
  If Cyfra > 9 Then Cyfra = 0
  Call Cyfry(cyfra)
  Do
   If S1 = 0 Then
     Waitms 100
     Incr Cyfra
     If Cyfra > 9 Then
       Cyfra = 0
     End If
     Call Cyfry(cyfra)
     Do
     Loop Until S1 = 1
     Waitms 100
   End If
  Loop Until S2 = 0
  Waitms 100
  Do
  Loop Until S2 = 1
  Waitms 100
  Writeeeprom Cyfra , 1
  Cyfra = 12
  Call Cyfry(cyfra)
  Wait 1
End If

'#############################
'#############################

Readeeprom Cyfra , 1
If Cyfra > 9 Then Cyfra = 1
Call Cyfry(cyfra)

'-BŁĄD MIAŁEŚ TUTAJ------------------------------------------------------------
'
' Oryginalnie zapisałeś -- Select Case Cyfry --
' Cyfry to procedura nie funkcja więc nie zwraca wartości
' Struktura Select Case nawet nie przyjmuje bezpośrednio nazwy funkcji która ma
' zwrócić cokolwiek
' Ja wydedukowałem iż tutaj ma być Cyfra, ale Ty mogłeś mieć coś innego na myśli
' więc popraw to w/g Twojej idei.
'
Select Case Cyfra
'-------------------------------------------------------------------------------
' Po tej zmianie kompilacja przeszła, Flash used 98% (Bascom AVR 1.11.7.7 Full)
'-------------------------------------------------------------------------------
  Case 1 :
    Osccal = 128                                            '100Hz
    Tccr1b = &B01001100                                     '100Hz
  Case 2 :
    Osccal = 128                                            '200Hz
    Tccr1b = &B01001011                                     '200Hz
  Case 3 :
    Osccal = 204                                            '300Hz
    Tccr1b = &B01001011                                     '300Hz
  Case 4 :
    Osccal = 128                                            '400Hz
    Tccr1b = &B01001010                                     '400Hz
  Case 5 :
    Osccal = 175                                            '500Hz
    Tccr1b = &B01001010                                     '500Hz
  Case 6 :
    Osccal = 176                                            '1k
    Tccr1b = &B01001001                                     '1k
  Case 7 :
    Osccal = 176                                            '2k
    Tccr1b = &B01001000                                     '2k
  Case 8 :
    Osccal = 116                                            '3k
    Tccr1b = &B01000111                                     '3k
  Case 9 :
    Osccal = 176                                            '4k
    Tccr1b = &B01000111                                     '4k
  Case 0 :
    Osccal = 210                                            '5k
    Tccr1b = &B01000111                                     '5k
End Select

'#################################
Tccr1a = &B00010001
'#################################

 Ocr = 128
Do
  If S2 = 0 Then
    If Czas < 6000 Then Waitms 40
    If Ocr < 225 Then Incr Ocr
    Czas = 0
    Do
    Incr Czas
    Loop Until S2 = 1 Or Czas = 6000
    If Czas < 6000 Then Waitms 40
  End If

'#################################

  If S1 = 0 Then
    If Czas < 6000 Then Waitms 40
    If Ocr > 0 Then Decr Ocr
    Czas = 0
    Do
     Incr Czas
    Loop Until S1 = 1 Or Czas = 6000
    If Czas < 6000 Then Waitms 40
  End If

  Ocr1b = Ocr
Loop

'#################################                                 #################################
'                                 *********************************
'#################################                                 #################################


Sub Cyfry(cyfra As Byte)
  Select Case Cyfra
    Case 0 :

'-A TU MARNUJESZ ZASOBY PAMIĘCI FLASH-------------------------------------------
'
' Po pierwsze nie stosuj ElseIf tylko samo Else. Bit A_k przecież może tylko
' przyjmować wartości 0 lub 1!!
' Po tej zmianie Flash Used 86% !!!!
'
' IMHO mżna to inaczej rozwiązać, gdyż każde z 7 przypisań to 2 bajty pamięci
' na rozkaz SBI/CBI. Przypisanie segmentów do linii portów jest przecież proste
' (nie ma żadnych przeplotów) zatem traktujesz PortA jako całość, maskujesz
' linię wejściową PinA.7 przez AND i wpisujesz nową wartość do PortA.6-PortA.0
' przez operację OR:
'
' PortA = PortA And &b10000000
' PortA = PortA Or &b0xxxxxxx
'
'-------------------------------------------------------------------------------

           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 0
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 1
           End If
     Case 1 :
           If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           Else
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           End If
     Case 2 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 0
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 1
              G_seg = 0
           End If
     Case 3 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 0
           End If
     Case 4 :
           If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 5 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 1
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 6 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 1
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
     Case 7 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           End If
     Case 8 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
     Case 9 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 1
              C_seg = 1
              D_seg = 1
              E_seg = 0
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 0
              C_seg = 0
              D_seg = 0
              E_seg = 1
              F_seg = 0
              G_seg = 0
           End If
     Case 11 :
           If A_k = 0 Then
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 1
           Else
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 0
           End If
     Case 12 :
           If A_k = 0 Then
              A_seg = 0
              B_seg = 1
              C_seg = 1
              D_seg = 0
              E_seg = 1
              F_seg = 1
              G_seg = 1
           Else
              A_seg = 1
              B_seg = 0
              C_seg = 0
              D_seg = 1
              E_seg = 0
              F_seg = 0
              G_seg = 0
           End If
  End Select
End Sub


'******************************

End                                                         'main

Sebastian RCS
Użytkownik
Posty: 472
Rejestracja: 03 lut 2003, 18:23
Lokalizacja: Koluszki
Kontakt:

Post autor: Sebastian RCS » 07 sie 2005, 20:51

Dzięki za komentarze do kodu. Ale ja wolałbym go nie zmieniać, gdyż jest to gotowy kod z gazety NE do gotowego układu. Jak zadziała wszystko, dopiero wówczas mogę eksperymentować.

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 07 sie 2005, 21:07

Sebastian RCS pisze:Miałeś rację :mrgreen: .
Właśnie spojrzałem do gazety, jeszcze raz do tego kodu i okazało się, że źle przepisałem to jedno słowo.
Dzięki Ci serdeczne. Nikt mi nie potrafił pomóc, już kilka miesięcy wcześniej miałem ten problem i próbowałem na elektrodzie.
Jeszcze raz dzięki za pomoc. :!:
A spójrz na swój wątek na elektrodzie i na mój post z 27 maja 2005. http://www.elektroda.pl/rtvforum/topic302165.html
:)
Pozdrawiam, Konrad.

Sebastian RCS
Użytkownik
Posty: 472
Rejestracja: 03 lut 2003, 18:23
Lokalizacja: Koluszki
Kontakt:

Post autor: Sebastian RCS » 07 sie 2005, 21:43

No dzięki Tobie przypisałem brakujące wartości zmiennym, tam gdzie nie podałem.
A odnośnie tego Twego posta, to ja zrozumiałem, że pod wyrazem, który napisałeś Cyfra, to mam podać jakąś cyfrę :D.

ODPOWIEDZ