Program na AT90S2313 nie kompiluje się dla ATmegi8

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:

Program na AT90S2313 nie kompiluje się dla ATmegi8

Post autor: Sebastian RCS » 19 lip 2006, 19:05

No właśnie dlaczego... Prześledziłem wszystko po koleii i według mnie powinno być wporządku. Kod źródłowy pochodzi z oślej łączki. Błędy, które wywala nic mi nie mówią.
Chcę skompilować ten program dla ATmegi8. Podłączyłem pod niego tak samo wsyzstkie wyjścia, PB, PD jak w przypadku zestawu z oślej łączki, ale on nawet nie chce się skompilować.
$regfile = "m8def.dat"
$crystal = 8000000

'C018b Prosty zegar z budzikiem
Dim Sekundy As Byte , Minuty As Byte , Godziny As Byte , Uniwers As Byte
Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte
Dim Godzjed As Byte , Godzdzies As Byte , Mux As Byte , Migaj As Bit , Maxi As Byte
Dim Godzinyb As Byte , Minutyb As Byte , Trybustawbudzika As Bit , Wlaczeniebudzika As Bit
Dim Przyciski As Byte , Minut As Byte , Godz As Byte , Klawisz As Byte , Pomoc As Bit
Dim Dzwiek As Bit , Mux1 As Byte , Blokada As Byte , Blok1 As Bit , Blok As Bit
Const Powrot = 3 ' czas automatycznego powrotu z trybu ustawiania budzenia
Config Portb = 255 : Portb = 255 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Config Timer1 = Timer , Prescale = 64
Enable Interrupts : Enable Timer0 : Enable Timer1 'odblokowanie przerwań
On Timer0 Co4ms : On Timer1 Co1s 'po przepełnieniu liczników skocz
Maxi = 100 : Blokada = 10 : Klawisz = 1 : Wlaczeniebudzika = 1 'wartości początkowe
Godziny = 22 : Minuty = 18 : Godzinyb = 22 : Minutyb = 19 'po minucie pracy włączy alarm

Do : Loop : End 'to jest główny program - pusta nieskończona pętla

Co1s: 'co 1 sekundę
Load Timer1 , 62500 : Incr Sekundy : Toggle Migaj 'standardowe odliczanie 1 sekundy
If Minuty = Minutyb And Godziny = Godzinyb Then 'przez minutę w porze budzenia
If Wlaczeniebudzika = 1 Then 'gdy budzik ma dzwonić
Wlaczeniebudzika = 0 'jednorazowe budzenie
Dzwiek = 1 'włączenie alarmu
Blok = 1 'żeby kasowanie alarmu nie zmieniało wskazań zegara
Blokada = 10 'przyciski zostaną zablokowane na 10s,
End If 'przez wpisanie "nadmiernego" opóźnienia do zmiennej Uniwers
Else
Dzwiek = 0 'zawsze, gdy nie jest pora budzenia
Blok = 0 'wyłącz dźwięk, zeruj flagę pomocniczą blokady
End If
' przez czas 10 sekund po każdym ręcznym wyłączeniu alarmu przyciski mają być zablokowane
' problem w tym, że ten czas 10s może wyjść poza minutę alarmu, dlatego
' poniższa procedura nie może być zawarta w poprzedniej:
If Blok1 = 1 Then 'zablokowanie możliwości zmian czasu
Uniwers = 255 'przyciski w ogóle nie reagują bo 255*4,096ms= 1,26sekundy
Decr Blokada ' wcześniej było: Blokada=10
If Blokada = 0 Then ' więc po 10 sekundach
Blok = 0 'znów normalna praca przycisków
Blok1 = 0 'bo za sekundę zostanie ustawiona wartosć Uniwers=40
End If ' a nie Uniwers=255
Else 'w czasie, gdy klawisze nie są zablokowane
Uniwers = 40 'ustawia standardowy czas opóźnienia reakcji przycisku
If Przyciski = 0 Then 'jeśli naciśnięte oba przyciski S1, S2
If Trybustawbudzika = 0 Then ' w trybie wskazywania czasu bieżącego
If Pomoc = 1 Then Trybustawbudzika = 1 'po sekundzie zwłoki przechodzi w tryb
Pomoc = 1 ' ustawiania budzika
Else 'w trybie ustawiania czasu budzenia
Toggle Wlaczeniebudzika 'załącz/wyłącz budzenie
End If ' co będzie sygnalizowane potem zaświeceniem prawej kropki
Else
Pomoc = 0 'gdy nie są przciśnięte S1+S2, zeruje
End If ' bit pomocniczy opóźnienia o sekundę reakcji sa S1+S2
End If
'poniżej procedura automatycznego wychodzenie z trybu ustawiania budzika
Decr Klawisz 'zmniejsz zawartość licznika Klawisz od Powrot do zera
If Klawisz = 0 Then Trybustawbudzika = 0 'wychodzi z trybu ustawiania budzika
Return 'koniec procedury Co1s

Co4ms: 'obsługa przerwania od T/C0 co 4,096ms
If Blok = 1 And Dzwiek = 0 Then '4ms po każdym ręcznym wyłączeniu alarmu
Blok1 = 1 ' blokowana jest możliwość zmian czasu
Uniwers = 255 'przez wpisanie "nadmiernego" opóźnienia
End If 'i tak będzie przez 10s - patrz wyżej

Przyciski = Pind And 3
Select Case Przyciski
Case 0: 'naciśnięte oba S1, S2
Klawisz = Powrot 'każde naciśnięcie dowolnego przycisku odświeża wartość Klawisz
Dzwiek = 0 'inne procedury zrealizowane w procedurze Co1s

Case 1: 'naciśnięty tylko S2 - minuty
Decr Uniwers
Klawisz = Powrot
Dzwiek = 0
If Uniwers = 0 Then
Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8 'coraz szybciej
If Trybustawbudzika = 1 Then 'w trybie ustawiania budzika
Incr Minutyb 'zwiększ minuty budzenia
Else ' w trybie zegara
Incr Minuty : Sekundy = 0 'zwiększ licznik minut i wyzeruj sekundy
End If
End If
Case 2: 'naciśnięty tylko S1 - godziny
Decr Uniwers
Klawisz = Powrot
Dzwiek = 0
If Uniwers = 0 Then
Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8 'coraz szybciej
If Trybustawbudzika = 1 Then 'w trybie ustawiania budzika
Incr Godzinyb 'zwiększ godziny budzenia
Else ' w trybie zegara
Incr Godziny 'zwiększ licznik godzin
End If
End If
Case 3: ' w spoczynku
Maxi = 100
End Select

' co 4ms sprawdzamy i korygujemy stany liczników
If Sekundy = 60 Then 'skróc cykl licznika sekund: 0...59 , itd...
Sekundy = 0 : Incr Minuty
End If 'tym razem nie zagnieżdzamy procedur sprawdzania,
If Minuty = 60 Then ' - zagnieżdżenie spowodowałoby błędy podczas
Minuty = 0 : Incr Godziny ' ustawiania zegara
End If '
If Godziny = 24 Then '
Godziny = 0
End If
If Minutyb = 60 Then ' - zagnieżdżenie spowodowałoby błędy podczas
Minutyb = 0 : Incr Godzinyb ' ustawiania zegara
End If '
If Godzinyb = 24 Then '
Godzinyb = 0
End If

Incr Mux 'obsługa wyświetlaczy jest teraz bardziej skomplikowana:
If Trybustawbudzika = 1 Then 'w trybie budzenia
Minut = Minutyb 'do zmiennych pomocniczych Minut i Godz
Godz = Godzinyb 'wpisujemy rzecz jasna czas budzenia
Mux = Mux And &B111 'w efekcie liczy 0...7
Else 'przy normalnej pracy
Minut = Minuty 'będzie wyświetlony czas bieżący
Godz = Godziny
Mux = Mux And &B11 'w efekcie liczy 0...3
End If
'teraz zamieniamy liczby dwójkowe na BCD
Mindzies = Makebcd(minut) 'zamieniamy liczbę dwójkową na BCD
Minjed = Mindzies And 15 'przez polecenie AND i maskę &B00001111 = 15
'uzyskujemy tylko cztery młodsze bity, czyli jednostki minut
Shift Mindzies , Right , 4 'przesuwając w prawo usuwany 4 młodsze bity
'pozostają dziesiątki minut w czterech młodszych bitach
'a w czterech starszych są zera - tak przecież działa polecenie SHIFT
Godzdzies = Makebcd(godz) 'zamieniamy liczbę dwójkową na BCD
Godzjed = Godzdzies And 15 'uzyskujemy tylko cztery młodsze bity - jednostki
Shift Godzdzies , Right , 4 'przesuwając w prawo usuwany 4 młodsze bity
'teraz wyświetlamy jedną cyfrę na wyświetlaczu:
Portd = &B1111111 'wygaś wszystko
Select Case Mux ' obsługa wyświetlacza
Case 0: 'wyświetl zawartość licznika jednostek minut
Portb = Lookup(minjed , Tabela) : Portd.3 = 0 : Portb.7 = Not Wlaczeniebudzika
Case 1: 'wyświetl zawartość licznika dziesiątek minut
Portb = Lookup(mindzies , Tabela) : Portd.4 = 0
Case 2: 'wyświetl zawartość licznika jednostek godzin
Portb = Lookup(godzjed , Tabela) : Portd.5 = 0 : Portb.7 = Migaj 'ew. włącz punkt dziesiętny
Case 3: 'wyświetl zawartość licznika dziesiatek godzin
Portb = Lookup(godzdzies , Tabela) : Portd.6 = 0
End Select

If Dzwiek = 1 Then Portd.2 = Migaj 'i daje przerywany sygnał dźwiękowy

Return 'koniec obsługi przerwania od T/C0 co 4,096ms

Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

A takie błędy pokazuje:

Obrazek

Przemek
-
Posty: 2
Rejestracja: 24 mar 2006, 8:37
Lokalizacja: Warszawa

Post autor: Przemek » 20 lip 2006, 7:22

Witam
Skopiowałem Twój kod z cytatu do BASCOMa (ver 1.11.7.9) i ... skompilował się bez żadnych błędów.
Może używasz wcześniejszej wersji BASCOMa

Pozdrawiam
Przemek

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

Post autor: Sebastian RCS » 20 lip 2006, 11:00

Posiadam wersję 1.11.8.1

[ Dodano: 2006-07-20, 12:41 ]
Nie wiem co jest grane. Właśnie zainstalowałem Bascom w wersji 1.11.7.7 i się skompilowało.
Dziwne.
W każdym bądź razie dziękuję za pomoc. Gdybyś nie napisał, że w Twojej starszej wersji się kompiluje program, to pewnie bym nawet nie pomyślał o tym.

ODPOWIEDZ