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] 2 podobne programy - 1 działa 2 nie!

Gibol 21 Gru 2008 23:03 1716 13
REKLAMA
  • #1 5888069
    Gibol
    Poziom 17  
    Kawałek docelowego programu działa sprawnie, ale jak dodam "pozostałe funkcje, już niestety nie... Nie zmienia mi zmiennej "Stan" i nie wysyła ATH tym samym nie przechodzi do następnego etapu programu...

    Kod działający:
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    $baud = 19200
    
    Config Serialin = Buffered , Size = 100
    
    Config Porta.0 = Output
    
    
    
    Enable Interrupts
    Declare Sub Oproznij_bufor
    Declare Sub Odczytaj_uart
    Declare Sub Odczytaj_sprzetowy_uart
    
    Dim Ringtxt As Byte
    Dim Bufor As Byte
    Dim Ring As Byte
    Dim Kod As String * 100
    Dim Dane As String * 200
    Dim Stan As Bit
    
    
    Ringtxt = "RING"
    Stan = 0
    
      Waitms 100
      Print "ATX0" ; Chr(13)                                    'Odpowiadaj
      Waitms 100
      Print "ATZ" ; Chr(13)                                     'Ustaw domyślnie
      Waitms 100
      Print "ATE0" ; Chr(13)                                    'WYLACZ ECHO
      Waitms 100
      Print "AT+CLIP=1" ; Chr(13)                               'Wlaczanie prezentacji numeru
      Waitms 100
      Set Porta.0
      Waitms 100
      Reset Porta.0
      Waitms 100
    
       Gosub Oproznij_bufor
    
    
    Do
    Call Odczytaj_uart
       If Stan = 1 Then Set Porta.0
       If Stan = 0 Then Reset Porta.0
       Loop
    
    
    Odczytaj_uart:
    
    
      Kod = Inkey()
      Dane = Dane + Chr(kod)
      Bufor = Ischarwaiting()
      Ring = Instr(dane , Ringtxt)
    
      If Ring > 0 And Stan = 0 Then
      Stan = 1
       Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
       End If
    
      If Ring > 0 And Stan = 1 Then
      Stan = 0
      Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
    
      End If
    
      Gosub Oproznij_bufor
      Return
    
    
     Oproznij_bufor:
    Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
       Dane = "0"
    Loop Until Bufor = 0
    Return
    


    Kod nie działający:
    
    $regfile = "m32def.dat"
    $crystal = 16000000                                         '16MHz
    
    $baud = 19200
    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
    Config Timer2 = Pwm , Async = Off , Compare = Set , Pwm = On , Compare Pwm = Clear Down , Prescale = 8
    Config Portb.3 = Output
    Set Tccr0.pwm0
    Set Tccr0.com00
    Set Tccr0.com01
    Set Tccr0.cs00
    
    Config Serialin = Buffered , Size = 100
    
    Config Portc.0 = Output
    Config Portd.6 = Output
    
    
    Enable Interrupts
    Declare Sub Oproznij_bufor
    Declare Sub Odczytaj_uart
    Declare Sub Odczytaj_sprzetowy_uart
    Declare Sub Swiecenie
    
    Dim Ringtxt As Byte
    Dim Bufor As Byte
    Dim Ring As Byte
    Dim Kod As String * 100
    Dim Dane As String * 200
    Dim Stan As Bit
    
    Dim T1 As Byte
    Dim T2 As Byte
    Dim Licznik As Integer
    
    Pk1 Alias Portd.6
    Pk2 Alias Portc.0
    
    
    
    'zmienne poczatkowe
    T1 = 40
    T2 = 180
    Licznik = 0
    
    Ringtxt = "RING"
    Stan = 0
    
    'Inicjacja:
      Waitms 100
      Print "ATX0" ; Chr(13)                                    'Odpowiadaj
      Waitms 100
      Print "ATZ" ; Chr(13)                                     'Ustaw domyślnie
      Waitms 100
      Print "ATE0" ; Chr(13)                                    'WYLACZ ECHO
      Waitms 100
      Print "AT+CLIP=1" ; Chr(13)                               'Wlaczanie prezentacji numeru
      Waitms 100
    
      Pk1 = 1
      Wait 1
    
      Pwm1a = 255
      Ocr0 = 0
      Pwm1b = 0
      Ocr2 = 0
      Waitms 100
    
      itd itp..........
    
    
    Gosub Oproznij_bufor
    
    'koniec inicjacji
    
    Do
    
    Call Odczytaj_uart
    If Stan = 1 Then Call Swiecenie
    If Stan = 0 Then Waitms 100
    Loop
    
    
    Swiecenie:
    Do
    If Licznik < 18 Then Gosub Program1
    If Licznik < 8 Then T1 = T1 + 10
    If Licznik => 8 And Licznik < 17 Then T1 = T1 - 10
    If Licznik => 17 And Licznik < 217 Then Gosub Program2
    If Licznik => 17 And Licznik < 117 Then T2 = T2 + 2
    If Licznik => 117 And Licznik < 217 Then T2 = T2 - 2
    If Licznik = 217 Then T1 = 70
    If Licznik => 217 And Licznik < 300 Then Gosub Program1
    If Licznik = 300 Then Gosub Zeruj_liczniki
    Call Odczytaj_uart
    Loop Until Stan = 0
    Return
    
    
    
    'Obsluga telefonu:
    
    Odczytaj_uart:
    
      Kod = Inkey()
      Dane = Dane + Chr(kod)
      Bufor = Ischarwaiting()
      Ring = Instr(dane , Ringtxt)
    
      If Ring > 0 And Stan = 0 Then
      Stan = 1
       Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
       End If
    
      If Ring > 0 And Stan = 1 Then
      Stan = 0
      Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
    
    
      End If
    
      Gosub Oproznij_bufor
      Return
    
    
     Oproznij_bufor:
    
     Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
       Dane = "0"
    Loop Until Bufor = 0
    Return
    
    
    'programy swiecenia:
    
    Program1:
    Pwm1a = 1
    Pwm1b = 255
    Ocr0 = 16
    Ocr2 = 16
    Waitms T1
    Pwm1a = 16
    Pwm1b = 240
    Ocr0 = 10
    Ocr2 = 30
    itd itp...........
    Incr Licznik
    
    
    Return
    
    Program2:
    
    Ocr0 = 32
    Pwm1a = 80
    Ocr2 = 160
    Pwm1b = 220
    Waitms T2
    
    itd itp.........
    Incr Licznik
    Return
    
    
    
    Zeruj_liczniki:
    T1 = 40
    T2 = 180
    Licznik = 0
    Return                                                      
    


    Zaciąłem się i już 2h bez skutku próbuję...
    Może ktoś zerknie fachowym okiem co mam nie tak...
    Ładnie proszę ;)
  • REKLAMA
  • #2 5888626
    dawid512
    Poziom 32  
    Są dwie opcje:
    Oproznij_bufor:
    Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
       Dane = "0"
    Loop Until Bufor = 0
    Return 
    lub
    Odczytaj_uart:
    
      Kod = Inkey()
      Dane = Dane + Chr(kod)
      Bufor = Ischarwaiting()
      Ring = Instr(dane , Ringtxt)
    
      If Ring > 0 And Stan = 0 Then
      Stan = 1
       Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
       End If
    
      If Ring > 0 And Stan = 1 Then
      Stan = 0
      Wait 1
      Print "ATH" ; Chr(13)
      Waitms 100
      Ring = 0
    
    
      End If
    
      Gosub Oproznij_bufor
      Return 


    Wyświetl sobie na lcd stan zmiennej bufor. Być może nic się w nim nie znajduje.
  • REKLAMA
  • #4 5889095
    M. S.
    Poziom 34  
    Wg mnie program utyka w podprogramie Swiecenie. Jak tam wejdzie to nie odczytuje UART'a, a zatem nie ma prawa zmienić się zmienna Stan aby opuścić ten podprogram. W Podprogramie Swiecenie powinieneś zastosować Call Odczytaj_uart aby móc reagować na sygnał z telefonu.
  • #5 5889702
    Gibol
    Poziom 17  
    No przecież jest Call odczytaj_uart w nim...
  • #7 5891070
    mirekk36
    Poziom 42  
    Przede wszystkim to kolega autor ma (sorry za określenie) totalny śmietnik a nie kod. Żadnych wcięć a jak są to w ogóle bez sensu porobione. Kod napisany chaotycznie i nie uporządkowany. W związku z powyższym ciężko się w ogóle na niego patrzy a co dopiero mówić aby ktoś pokusił się o jakąś analizę. Dlatego nie dziwię się, że ktoś tam nie zauważył jakiegoś skoku do procedury bo w oczach kociokwiku można dostać.

    Proponuję to na prawdę uporządkować a może się wtedy okazać, że i sam kolega autor dojdzie co jest nie tak.
  • REKLAMA
  • #8 5891508
    zumek
    Poziom 39  
    W jednym z wcześniejszych postów, kol. Gibol o załączonym kodzie napisał:

    Pozbierałem różne fragmenty z forum i zlepiłem coś takiego ...

    A problem leży w tym, że autor chyba nie bardzo ten kod "rozumie", a to że mu zadziałał, zawdzięcza chyba temu, że nie dość, że urodził się w czepku, to jeszcze chyba w Niedzielę ;)
    Tyle żartów - proszę się nie obrażać :-P
    A teraz do rzeczy- odrobina krytyki.
    Co to jest :?:
    
    Dim Ringtxt As Byte
    '...
    
    Ringtxt = "RING"
    

    Albo to - choć mniej bolesne.
    
    Dim Kod As String * 100
    '...
       Kod = Inkey() 
    

    Jeśli autor rozumie do czego"piję", to proszę poprawić ten działający kod i sprawdzić czy nadal działa.
    Jeśli autor ma zamiar dołączyć do kolejnych postów jakieś źródła, to prosimy je ładnie sformatować.

    Pozdrawiam Świątecznie
    Piotrek
  • #9 5891767
    Gibol
    Poziom 17  
    Nie mam pojęcia do czego "pijesz"
    To jest mój 1 program!
    Nię będzie programu - nie będzie oświetlenia!
    Jaśniej troszkę - ładnie świątecznie proszę :)
  • #10 5891793
    dawid512
    Poziom 32  
    Gibol napisał:
    Nie mam pojęcia do czego "pijesz"
    To jest mój 1 program!
    Nię będzie programu - nie będzie oświetlenia!
    Jaśniej troszkę - ładnie świątecznie proszę :)


    Czyli jednak czekasz na gotowca... Pomyliłeś forum. Najpierw zacznij od przeczytania helpa do bascoma bo robisz rażące błędy.
  • #11 5891893
    Gibol
    Poziom 17  
    Wiem że robię błędy...
    nie czekam na gotowca...
    Taki kawał już zrobiłem z 5 dni nad tym siedziałem. Wiele problemów już pokonałem, ale tego nie mogę...
    Robiłem prawie zawsze metodą prób i błędów z pomocą helpa i elektrody, ale nie mogę zrobić tego tak żeby działało, bo albo mi załącza program i potem już nie wyłącza albo wogóle nie działa.
    O troszkę świątecznej wyrozumiałości proszę, chciałbym skończyć ten sterownik na święta, a tak to skończy się na tym że wezmę Atmega 8 do robienia rzeczy po rs, a Mega32 będzie robić świecenie bo w tym momencie mam do wytrawienia płytkę i poklejenie do niej całości czas nagli.
    O taki mały wyjątek proszę, po świętach obiecuję poprawę.
  • REKLAMA
  • #12 5891916
    dawid512
    Poziom 32  
    Zacznij od poprawienia błędów które wskazał Zumek.
  • #13 5893004
    Gibol
    Poziom 17  
    Nie wiem jak to mogą być błędy skoro są wyciągnięte z programu który działa i był na elektrodzie w DIY. (Powiadamianie GSM - jest dokładnie tak samo)
    Może tamten program również jest z błędami i działa cudem.
    Co jest z tymi zmiennymi nie tak?
  • #14 5893720
    dawid512
    Poziom 32  
    Przyjrzyj się:
    
    
    Dim Ringtxt As Byte
    '...
    
    Ringtxt = "RING"
    
    Dim Kod As String * 100
    '...
       Kod = Inkey() 

    W pierwszym kodzie zmienna Ringtxt powinna być typu string gdyż przechowujesz w niej text. W drugie kodzie zmienna Kod powinna być typu byte lub innego do przechowywania danych liczbowych. Więcej w helpie.
REKLAMA