Leggere una stringa da uart (AVR assembly)
Posted: 12 Oct 2012, 17: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:
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.
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:
- Code: Select all
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.