Atmega 644pa - problem z timerem


Witam szanownych kolegów!

Jestem tu nowy i piszę mając nadzieję, że ktoś pomoże mi rozwiązać mój problem z którym borykam się już któryś dzień :(

Otóż programuję w Bascomie Atmegę 644pa-pu do komunikacji po UART z modemem ZTE2639AT.

Mam problem ze sprawdzaniem siły sygnału GSM. Otóż chciałbym przy pomocy przerwania od timera0 wykonywać takie sprawdzanie a jego wynik wyświetlać na lcd.

Oto mój kod:

Quote:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m644pdef.dat"

$crystal = 16000000
$baud = 2400

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2

Cursor Off

Config Serialin = Buffered , Size = 50
Config Timer0 = Timer , Prescale = 256

Dim Poczatek As Byte , Zwloka_4ms As Byte , Indeks_sms As Byte , Zasieg As Byte , Licznik As Byte
Dim Modem As String * 70 , Nr_tel As String * 30 , Bufor As String * 10 , Kod As String * 4 , Telefon_sms As String * 11 , Tresc_sms As String * 50
Dim Zm_zas As Bit

Podswietlenie Alias Portb.1
Mod_zas Alias Portd.4
Mod_res Alias Portd.5

'********* Konfiguracja zmiennych **************
'***********************************************

Podswietlenie = 0 '0=podswietlenie wlaczone

'********** Uruchomienie modemu ***************
'***********************************************

Cls
Locate 1 , 1
Lcd "Uruchamianie"
Locate 2 , 1
Lcd "ukladu..."

Mod_res = 0 'reset modemu
Waitms 500
Mod_res = 1
Wait 1
Mod_zas = 0 'uruchamianie modemu

Enable Interrupts

Do
Gosub Nasluch_bezlcd

If Modem = "+CPIN: SIM not inserted" Then
Modem = ""
Mod_zas = 1
Goto Inicjalizacja
End If
Loop

'********** Inicjalizacja modemu ***************
'***********************************************

Inicjalizacja:

Print "ATE0" 'ATE0, don?t display input command on the terminal

Gosub Potwierdzenie

Waitms 200
Print "AT+CPIN={034}5555{034}"

Gosub Potwierdzenie

Waitms 200
Print "AT+CNMI=3,1,0,0,0"

Gosub Potwierdzenie

Waitms 200
Print "AT+CMGF=1"

Gosub Potwierdzenie

Waitms 200
Print "AT+CLIP=1"

Gosub Potwierdzenie
Waitms 200

Cls
Locate 1 , 1
Lcd "Modem gotowy!"
Wait 1
Cls

Enable Timer0 : On Timer0 Spr_zasiegu

'########## Glowna Petla Programu ##############

Do

'Gosub Spr_zasiegu

Loop
End

'###############################################
'*************** ETYKIETY **********************
'***********************************************

Nasluch_bezlcd:

If Ischarwaiting() = 1 Then '
Poczatek = Inkey()
If Poczatek = 10 Then
Input Modem

Do
Poczatek = Inkey()
Loop Until Poczatek = 10

End If
End If

Return

'-----------------------------------------------

Potwierdzenie:

Do
Poczatek = Inkey()
If Poczatek = 10 Then
Input Modem
Do
Poczatek = Inkey()
Loop Until Poczatek = 10

End If
Loop Until Modem = "OK"
Modem = ""
Return

'-----------------------------------------------

Spr_zasiegu:

Print "AT+CSQ"
Do
Gosub Nasluch_bezlcd
Bufor = Left(modem , 5)
Loop Until Bufor = "+CSQ:"

Bufor = Mid(modem , 7 , 3)
Zasieg = Val(bufor)

Locate 1 , 12
Toggle Zm_zas
If Zm_zas = 1 Then
Lcd Chr(0) 'wysw znaku zasiegu
Else
Lcd Chr(1) 'wysw znaku zas z nozka
End If

Select Case Zasieg
Case 99:
Lcd "!XX!"
Case 1 To 9:
Lcd Chr(2) ; "___"
Case 10 To 14:
Lcd Chr(2) ; Chr(2) ; "__"
Case 15 To 19:
Lcd Chr(2) ; Chr(2) ; Chr(2) ; "_"
Case 20 To 31:
Lcd Chr(2) ; Chr(2) ; Chr(2) ; Chr(2)
End Select
Gosub Potwierdzenie
Return

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

Program po wgraniu do uC wykonuje inicjalizację modemu, uruchamia timer, generuje przerwanie (przechodzi do etykiety "Spr_zasiegu") i wysyła komendę Print "AT+CSQ" ale niestety na tym się kończy. Mimo, że modem ładnie odpowiada (widzę to w terminalu podpiętym pod PC) to uC tak jakby nie umiał odebrać tych znaków i staje.

Co ciekawe jeśli usunę z kodu timer0 i wstawię w główną pętlę wykonywanie Gosub Spr_zasiegu to wszystko działa poprawnie!

Moje pytanie jest takie: co może zmieniać timer0, że etykieta Spr_zasiegu nie wykonuje się poprawnie?

Z góry dziękuję za każdą sugestię.
Pozdrawiam!




Portret użytkownika lm7812

Atmega 644pa - problem z timerem

Chodzi tu zapewne o priorytet przerwań, Timer 0; 1; 2 ma wyższy priorytet niż UART, z kolei UART potrzebuje
trochę "czasu".
Myślę , że przerwanie Timera wykonuje się cały czas nie doprowadzając do działania INKEY()