Stránka 1 z 1

komunikace pic16f877A a mobil siemens c35

Napsal: 29 pro 2013, 21:55
od mlike
Ahoj klucí.
nezkoušel jste někdo komunikovat mezi těmito dvěma zařízeními?? já jsem si zporvoznil načtení sms do picu přes usart, ale mám toršku problémek- buď nevim,jestli něco dělám špatně nebo je to funkce- namísto aby mi z toho lezly data ve formě bytu hex- konkrétně u mě 4F 71 DE 1E...... tak mi z toho leze 4 F 7 1 D E 1 E v asci tvaru. tak nějak nevim, jak z toho ven. nemáte někdo zkušenost a radu??? dík Marek

Kód: Vybrat vše

program GSM

' Declarations section
' set of AT commands
const atc0 = "AT+CMGD=1"
const atc1 = "AT+CMGL=0"
const atc2 = "ATE0"

   dim LCD_RS as sbit at Re0_bit
     LCD_EN as sbit at Re2_bit
     LCD_D4 as sbit at Rd4_bit
     LCD_D5 as sbit at Rd5_bit
     LCD_D6 as sbit at Rd6_bit
     LCD_D7 as sbit at Rd7_bit

     LCD_RS_Direction as sbit at TRISe0_bit
     LCD_EN_Direction as sbit at TRISe2_bit
     LCD_D4_Direction as sbit at TRISd4_bit
     LCD_D5_Direction as sbit at TRISd5_bit
     LCD_D6_Direction as sbit at TRISd6_bit
     LCD_D7_Direction as sbit at TRISd7_bit



     dim gsm_state, obsah, pom, pom_cislo, i, flag as byte
     dim start as word
     dim cislo as string[12]
     dim sms_obsah as string[20]
     dim sms_prevod as string[10]

    ' send ATC command   
   
     sub procedure send_atc(dim const s as ^char)
         while(s^ <> 0)
                  UART1_Write(s^)
                  inc(s)
         wend
         UART1_Write(0x0D)
     end sub

     sub procedure send_atm(dim const s as ^char)
         while(s^ <> 0)
                  UART1_Write(s^)
                  inc(s)
         wend
         UART1_Write(0x26)
     end sub
     
     sub procedure prevod ()
          for i = 0 to 9
          uart1_write(sms_obsah[i])   'vypis na linku pro kontrolu analyzator
          next i
         
         pom = sms_obsah[9]>>7
         sms_prevod[10] = sms_obsah[9] and 0x80  'prevod zatim jen
         sms_prevod[9] = ((sms_obsah[8])<<1) + pom    'nafofr zjednodus
         pom = sms_obsah[8]>>6
         sms_prevod[8] = ((sms_obsah[7])<<2) + pom
         pom = sms_obsah[7]>>5
         sms_prevod[7] = ((sms_obsah[6])<<3) + pom
         pom = sms_obsah[6]>>4
         sms_prevod[6] = ((sms_obsah[5])<<4) + pom
         pom = sms_obsah[5]>>3
         sms_prevod[5] = ((sms_obsah[4])<<5) + pom
         pom = sms_obsah[4]>>2
         sms_prevod[4] = ((sms_obsah[3])<<6) + pom
         pom = sms_obsah[3]>>1
         sms_prevod[3] = ((sms_obsah[2])<<7) + pom

         pom = sms_obsah[2]>>7
         sms_prevod[2] = sms_obsah[1] and 0x80
         sms_prevod[1] = ((sms_obsah[1])<<1) + pom
         pom = sms_obsah[1]>>6
         sms_prevod[0] = ((sms_obsah[0])<<2) + pom
         lcd_chr(1,1,sms_prevod[10])
         lcd_chr(1,2,sms_prevod[9])
         lcd_chr(1,3,sms_prevod[8])
         lcd_chr(1,4,sms_prevod[7])
         lcd_chr(1,5,sms_prevod[6])
         lcd_chr(1,6,sms_prevod[5])
         lcd_chr(1,7,sms_prevod[4])
         lcd_chr(1,8,sms_prevod[3])
         lcd_chr(1,9,sms_prevod[2])
         lcd_chr(1,10,sms_prevod[1])
         lcd_chr(1,11,sms_prevod[0])
     end sub
     
     sub procedure interrupt
      if pir1.5  then                            'preruseni pri naplnenym uartu
         obsah = uart1_read()
           
         start = start<< 8       'hledam znaky 0x3037 tj 07 to je zacatek
         start = start + obsah    'vlastniho kodu sms nemsuim se zabyvat
         if start  = 0x3037 then   '  ruznyma hlasenima a doprovodnym
            flag.1 = 1                  'kodem
            pom = 0       ' odpocitavam az k tel cislu a pote k obsahu zpravy '
            pom_cislo = 0   'cislo pro adresaci bytu ve stringu -
         end if                'zapis tlf. cisla a obsahu zpravy
         
         if flag.1 = 1 then
            portd.0 = 1
             pom = inc(pom)
                if (pom > 20) and (pom < 33) then
                      cislo[pom_cislo] = obsah   'prijme byte a ulozi do stringu
                      pom_cislo = inc(pom_cislo)   ':cislo na pozici :pom_cislo
                end if
             
                if pom = 49 then
                   pom_cislo = 0
                end if
                if pom = 75 then
                   flag.1 = 0
                   flag.2 = 1
                end if
                if (pom > 53) and (pom < 74) then   'to same jako u tlf. cisla
                   sms_obsah[pom_cislo]= obsah
                   pom_cislo = inc(pom_cislo)
                end if
                portd.0 = 1
         end if
         pir1.5 = 0
      end if
     end sub

main:
'   Main program

    porta = 0
    portb = 0
    portc = 0
    portd = 0
    porte = 0

    adcon1 = 6
    cmcon  = 7

    trisa = 0x20
    trisb = 0
    trisc = 0
    trisd = 0
    trise = 0
   
    PIE1.RCIE   = 1
    INTCON.PEIE = 1
    INTCON.GIE  = 1

    lcd_init()
    lcd_cmd (_lcd_clear)
    lcd_cmd (_LCD_cursor_OFF)
   
    uart1_init (19200)
    send_atc(@ATC2)                              'zakazat echo
    sms_obsah = "00000000000000000000"
  while true

          send_atc(@ATC1)
          delay_ms(500)

          delay_ms(500)
          if flag.2 = 1 then
             flag.2 = 0
             send_atc(@ATC0)
          end if
'          if flag.0 = 1 then
             flag.0 = 0
             prevod()
'          end if

  wend
end.

Napsal: 30 pro 2013, 00:27
od monterjirka
Ona nejde po sběrnici mezi mobilem a mikročipem poslat SMS v textové podobě, to je velmi složitě kodované.
Pokud nějaké "jednoduché" zařízení jako alarm atd. .. posílá SMS, má je uloženy v paměti mobilu a posílá pomocí AT příkazu "SMS s pořadovým číslem...".
Existuje kniha popisující zařízení mimo jiné GPA1 (Flajzar?) a tam je to docela pěkně popsáno a vysvětleno.

Napsal: 30 pro 2013, 09:03
od mlike
Ale jo, já vim jak vypadá zakódovaná smska i jak to funguje - nejvyšší bit je vždy nula, proto se vypustí a na jeho místo se posouvají další z vedlejšího bytu..., to problém není a funguje mi to. problém mám s tím, že se všude píše, že ti z telefonu vyleze jeden byte např. 0x4f, jenže mě z toho lezou místo jednoho 0x4f dva byty: 0x34 a 0x46, což je v ascii tabulce 4 a F......takže to budu muset buď převádět zpět na hexa 0x4F a bude z toho tuna zbytečnýho kódu navíc, nebo někde dělám chybu a mám něco blbě zapnutýho...

Napsal: 30 pro 2013, 09:04
od mlike
mimochodem zas tak složitá ta sms není, jen se tak tváří :D

Napsal: 30 pro 2013, 23:54
od procesor
Ten prevod dvoch Ascii do jedného Hex je jednoduchá funkcia. Výsledkom je štvorbitové číslo 0x0n. Jedno sa prehodí na 0xn0 a spoja obidva s fun. OR do osem bitového.

Napsal: 31 pro 2013, 11:29
od mlike
hmm, jenomže to není převod dvou ascii, ale dvou hex na jeden. nebo mi to nějak nejde.... to neva dnes ráno mi došlo, že to půjde celkem jednoduše (snad, je to jen nástřel, nejsem doma, abych to zkusil):

Kód: Vybrat vše

for i = 0 to 19
     if sms_obsah[i] > 96 then  'pokud je cislo vetsi nez 96 jde o
     sms_obsah[i] = sms_obsah[i]-86          ' mala pismena
         else sms_obsah[i] = sms_obsah[i]-48   'jinak jsou to cisla
     end if
next i
 
for i = 0 to 18 step 2
    (sms_obsah[0]/2) = sms_obsah[0] + swap(sms_obsah[i+1])
next i   

Napsal: 31 pro 2013, 11:58
od procesor
No je to jedno, vstupuje ako textový reťazec.
2ascii na 1 hex je na tej stránke dole (posledný príklad).