Problem ze zmiennymi w BascomAVR oraz Atmega8

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
prodig
-
Posty: 3
Rejestracja: 13 mar 2008, 8:26
Lokalizacja: Siemianowice Śląskie

Problem ze zmiennymi w BascomAVR oraz Atmega8

Post autor: prodig » 13 mar 2008, 12:05

Witam serdecznie.

Poniżej zamieszczam kod, który nie działa prawidłowo.

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Config Lcd = 16 * 1a
Cursor Off

Config Adc = Single , Prescaler = 128 , Reference = Off
Start Adc

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinc.5 = Input

Dim W As Word
Dim Y As Single
Dim P As Single
Dim Q As Single
Dim W5 As Single
Dim W4 As Single
Dim W3 As Single
Dim W2 As Single
Dim Wart As Single
Dim A As Word
Dim Pozycja As Byte
Dim Wart2 As String * 5                                     'At $190
Dim Wart3(30) As String * 5                                 'At $200

Dim P0 As Word At 800 , P11 As Word At 810

Enable Interrupts

Pozycja = 1

P = 0
Q = 0

W = Getadc(0)

P0 = 1000                                                   ' normalnie te dwie wartości znajdują się w EEPROM
P11 = 640

Cls

For A = 1 To 30
Wart3(a) = "0.000"
Next A

Poczatek:
Do
  W = Getadc(0)

If W > P11 Then
              W2 = P0 - P11
              W5 = P0 - W
              W3 = 1100 / W2
              W4 = W5 * W3
              W4 = W4 / 1000
              Y = 0 + W4

              W2 = Y * Y
              W2 = 0.4261 * W2
              W3 = Y * 0.4631
              W3 = W2 - W3
              W3 = W3 + 0.0033
              Y = Y + W3

If Y < 0 Then Y = 0.000001

              Q = Q + Y
              P = P + 1

If P = 20 Then
            Q = Q / 20
            P = 0
            Y = Q
            Q = 0
            Wart = Y
            Wart2 = Str(wart)
            Wart2 = Left(wart2 , 4)
            Cls
               If Pozycja = 1 Then Lcd Wart3(pozycja) Else Lcd Wart3(pozycja -1)
            Lcd "  " ; Wart2 ; "0  "
         End If

Waitms 25
End If

Loop

End
Gdyby działał prawidłowo to na LCD powinno być w pierwszej linii 0.000 i w drugiej też 0.000. Jest natomiast tak, że w pierwszej linii mam 06953 a w drugiej 0.000. Wynik w drugiej linii zależy od zmiennej 'w', która odczytywana jest z przetwornika A/C.. Problem jest z pierwszą linią, w której powinno być "0.000" bo taka wartość zapisana jest na początku programu do tablicy. Dodatkowo wartość w pierwszej linii zmienia się gdy 'w' się zmienia a co za tym idzie inne zmienne też, wg wzorów w programie - tak jakby tablica była nadpisywana.

Wszystko zaczyna działać poprawnie gdy ręcznie przyporządkuję miejsce w pamięci dla tablicy:

Kod: Zaznacz cały

Dim Wart3(30) As String * 5 At $200
Dlaczego tak się dzieje? Przecież kompilator powinien automatycznie prawidłowo przydzielić pamięć wszystkim zmiennym.

Drugi problem dotyczy niszczenia danych w pamięci EEPROM. Co jakiś czas zostają samoczynnie zmienione dane lub całkowicie skasowane. Dlaczego?

Awatar użytkownika
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

Post autor: robson » 13 mar 2008, 17:55

Może spróbuj uruchomić symulator i w trybie krokowym przeanalizować program? :mrgreen:

ZbeeGin

Re: Problem ze zmiennymi w BascomAVR oraz Atmega8

Post autor: ZbeeGin » 13 mar 2008, 18:26

prodig pisze:

Kod: Zaznacz cały

Config Lcd = 16 * 1a
Cursor Off
Gdyby działał prawidłowo to na LCD powinno być w pierwszej linii 0.000 i w drugiej też 0.000.
O jakich dwóch liniach kolega mówi, skoro z definicji wynika, że używasz wyświetlacza 1x16 o specyficznej organizacji wewnętrznej?

prodig pisze:Drugi problem dotyczy niszczenia danych w pamięci EEPROM. Co jakiś czas zostają samoczynnie zmienione dane lub całkowicie skasowane. Dlaczego?

Kod: Zaznacz cały

Dim P0 As Word At 800 , P11 As Word At 810

P0 = 1000                                                   ' normalnie te dwie wartości znajdują się w EEPROM
P11 = 640
Z definicji zmiennych nie wynika wcale, że akurat P0 i P11 są w pamięci EEPROM. O drobnym szczególe zapomniałeś tutaj.

prodig pisze:Wszystko zaczyna działać poprawnie gdy ręcznie przyporządkuję miejsce w pamięci dla tablicy:

Kod: Zaznacz cały

Dim Wart3(30) As String * 5 At $200
Dlaczego tak się dzieje? Przecież kompilator powinien automatycznie prawidłowo przydzielić pamięć wszystkim zmiennym.
Jakimś raportem kompilacji z mapą adresów zmiennych mógłbyś się z nami podzielić?

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 13 mar 2008, 18:38

Nie analizowałem dokładnie tego programu, ale na końcu RAM'u znajduje się stos, który jak najbardziej można nadpisać jakąś zmienną, a w szczególności tablicą (która jest duża i niesprawdzana pod kątem czy się w RAM'ie mieści) Oprócz tego zbyt mała przydzielona ilość pamięci na stos i "inne pola z options/chip", też często "psuje" program.

ODPOWIEDZ