Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Leggere una stringa da uart

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Leggere una stringa da uart

Messaggioda Foto Utentemrflower » 11 ott 2012, 16:39

Salve a tutto il forum,
il problema in cui mi sto imbattendo è quello di leggere (e memorizzare) una stringa in ingresso via UART.

Vi spiego meglio il mio intento:
ho un modulo GPS sul quale posso ricevere sms e chiamate e attuare di conseguenza determinate operazioni (il mio è un progetto di domotica remota). Non ho problemi a interfacciare micro (ATMEGA8535) e modulo GSM (SIMCOM SIM900), riesco ad inviare delle stringhe con successo. Il problema sta nella ricezione.
Quello che mi serve è verificare il numero di telefono del chiamante (o di chi invia l'sms) per controllare se sia tra la listi dei numeri consentiti.

Prendo l'esempio della chiamata perché più semplice ma per gli sms il procedimento è del tutto simile.
Tramite chiamata ho pensato di implementare un "apricancello": dunque io chiamo il numero della scheda inserita nel modulo e si attiva l'apricancello (che per ora sto simulando con l'accensione di un LED direttamente sull'STK500 ma questo non ha importanza).

L'algoritmo è questo:
1. Ricevo la chiamata;
2. Rifiuto dopo uno squillo;
3. Controllo il numero;
4. Decido di conseguenza cosa fare.

Come avrete capito, il problema lo incontro al punto 3. Nel momento in cui rifiuto la chiamata, il modulo invia una stringa molto lunga contenente tanti parametri, tra i quali il numero chiamante. Il mio proposito è quello di memorizzare tale stringa nella RAM per poi filtrare solo i caratteri relativi al numero e quindi confrontarlo.

Ecco il codice assembly che ho provato ad implementare senza successo:

Codice: Seleziona tutto
ExtInt1_call:           ; Handles voice calls
ldi Delay1, 0x80        ; Sets up registers for 3s delay routine
ldi Delay2, 0x4F        ;
ldi Delay3, 0x12        ;

Wait_time_to_reject:
subi Delay1, 1          ;
sbci Delay2, 0          ;
sbci Delay3, 0          ;
brcc Wait_time_to_reject;


rcall Send_A            ; Reject the incoming call
rcall Send_T            ;
rcall Send_H            ;
rcall Send_CR           ;

;================================
; CODICE DI PROVA SU 3 CARATTERI
;================================
; Y inizializzato a 0x060, prima locazione della RAM

ldi WaitCounter, 3       ;
Get_character:
sbis UCSRA, RXC            ; Wait for character
rjmp Get_character       ;
in temp, UDR             ; Read Character
st Y+, temp              ;
dec WaitCounter          ;
brne Get_character       ;

ldi YL, 0x60             ;
ld temp, Y+              ;
ld temp2, Y+              ;
ld temp3, Y              ;

out PortB, temp2        ; stampa di prova


Ciò che ottengo stampando temp, temp2 o temp3 è sempre il codice ascii relativo al LINE FEED (0A) o al FORM FEED (0C).
Non riesco a capire dove sbaglio, l'indirizzamento alle posizioni in RAM dovrebbe essere corretto. Escluderei lo stack overflow poiché lo stack pointer è inizializzato a RAMEND e l'indirizzamento che faccio io a RAMSTART. Ho pensato ad un certo punto fossero problemi di tempistica ma neanche quello perché ho fatto dei calcoli e tramite UART ricevo 1Byte ogni 830us e il ciclo di polling che ho creato controlla l'arrivo di un nuovo Byte ogni 4us.

Non riesco ad uscirne, qualsiasi aiuto è sinceramente gradito, anche un codice prefatto per la generica ricezione di una stringa da UART in assembly, anche se mi piacerebbe capire dove sbaglio col mio codice. A tal proposito non sono riuscito a trovare nulla, solo C, assembly pare parecchio snobbato.
Avatar utente
Foto Utentemrflower
8 4
 
Messaggi: 40
Iscritto il: 12 mar 2012, 0:26

0
voti

[2] Re: Leggere una stringa da uart

Messaggioda Foto Utentesimo85 » 11 ott 2012, 17:32

mrflower ha scritto:[..] e il ciclo di polling che ho creato controlla [..]

Perché non usare l'interrupt della ricezione? Mi sembra una soluzione migliore.. Vedi il datasheet a pag. 157.

assembly pare parecchio snobbato.

C o Assembly dipende da cosa vuoi fare o da come lo vuoi fare. Potresti anche farlo in C usando anche le avr-libc, e forse ti risulterebbe più facile e sbrigativo, ma questo è un altro discorso.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Leggere una stringa da uart

Messaggioda Foto Utentemrflower » 11 ott 2012, 19:41

Perché non usare l'interrupt della ricezione? Mi sembra una soluzione migliore..


Avevo pensato al fattore interrupt però dal punto di vista logico non dovrebbe cambiare molto rispetto al mio approccio di testare il flag RXC. Ci proverò comunque, potrei creare una routine di handling che legga e conservi il carattere appena ricevuto in posizioni di RAM successive.

Potresti anche farlo in C usando anche le avr-libc, e forse ti risulterebbe più facile e sbrigativo


Purtroppo non ho gradi di libertà sul linguaggio di programmazione. Assembly, insieme al modello di microcontrollore, è una delle specifiche di progetto.

Pensi ci siano errori dal punto di vista logico o sintattico nel codice che ho postato?
Avatar utente
Foto Utentemrflower
8 4
 
Messaggi: 40
Iscritto il: 12 mar 2012, 0:26

0
voti

[4] Re: Leggere una stringa da uart

Messaggioda Foto Utentesimo85 » 11 ott 2012, 20:02

L'interrupt è decisamente molto meglio, in tutto. Non devi fare nessun polling, fa tutto il micro, tu devi solo riempire il buffer nel quale salvi il valore ricevuto nel byte n .. n+1.

Pensi ci siano errori dal punto di vista logico o sintattico nel codice che ho postato?

Purtroppo non conosco l'Assembly AVR. Li programmo in C. :(
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Leggere una stringa da uart

Messaggioda Foto Utentemrflower » 11 ott 2012, 23:47

Non preoccuparti, grazie del consiglio!
Avatar utente
Foto Utentemrflower
8 4
 
Messaggi: 40
Iscritto il: 12 mar 2012, 0:26


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti