problema con l'in line assembly in hi tech c

11 Anni 10 Mesi fa #1 da Chuck_Norris
problema con l'in line assembly in hi tech c è stato creato da Chuck_Norris
Ciao a tutti.
Devo realizzare una modulazione PWM estremamente precisa per il pilotaggio di un led IR alla massima potenza possibile con un pic12f683. Secondo il mio datasheet posso pilotarlo ad 1A se il periodo è inferiore ai 100 microsecondi e il dutycicle è del 10%. Siccome la mia portante è a 38KHz (periodo 26 micro), devo alzare ad 1 logico il piedino GP0 per 2,6 micro.
Ho pensato di usare una routine scritta in assembly da integrare nel programma di gestione del circuito ma sto incontrando diversi problemi. Partendo dal presupposto che non programmo in assembly da almeno 8 anni e sono molto arrugginito, vi posto la porzione di programma che ho scritto (che mi servirà per delle prove sul campo per controllare la distanza di trasmissione massima) e gli errori che mi da l'hi tech in fase di compilazione

#define PIC_CLK 8000000 // clock a 12MHz

#include <htc.h>
#include <delay.c>
#include <delay.h>

__CONFIG (FOSC_XT & WDTE_OFF & PWRTE_ON & MCLRE_OFF & IESO_OFF & FCMEN_OFF & BOREN_OFF & CPD_OFF & CP_OFF) ;

int _periodi , _count ;

void zerologic(void)
{
#asm
movwl 23
movf _periodi
_periodo:
bsf GPIO, 0
nop
nop
nop
nop
nop
nop
nop
bcf GPIO, 0
movwl 33
movf _count
_delayloop:
decfsz _count, 1
goto delayloop
decfsz _periodi, 1
goto periodo
#endasm
return;
}

void main(void)
{
TRISIO = 0b00000100 ;
ANSEL = 0b00000000 ;
WPU2 = 1;
while (1)
{
if (GP2=0)
{
DelayMs(200);
zerologic();
}
}
}


Non fate caso alla discrepanza sulla dichiarazione del clock, avevo previsto un clock a 12MHz (anche perchè ho il quarzo disponibile a casa) ma la libreria del delay non supporta quella velocità, inventerò qualcosa poi.

In "periodo" alzo e abbasso il piedino GP0 per circa 2,6micro, in "delayloop" aspetto la fine del periodo totale del segnale e in "periodi" mando il numero necessario di treni di impulsi per il mio test.

E questi sono gli errori del compilatore

Warning [1090] 17. variable "__count" is not used
Warning [1090] 17. variable "__periodi" is not used
Error [876] 22. syntax error
Error [845] symbol "movwl" defined more than once
Error [876] 34. syntax error
Error [876] 37. syntax error
Error [876] 39. syntax error
Error [800] undefined symbol "_periodi"
Error [800] 25. undefined symbol "GPIO"
Error [800] 35. undefined symbol "_count"
Error [800] 38. undefined symbol "delayloop"
Error [800] 40. undefined symbol "periodo"


sembra come se non riconoscesse il codice. Ho provato a cercare sul manuale ma sinceramente c'ho capito poco e niente

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Chuck_Norris
  • Avatar di Chuck_Norris
  • Premium Member
  • Premium Member
Di più
11 Anni 10 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: problema con l'in line assembly in hi tech c
Ciao,

non so se ha risolto ma usare l'assembly e varibili C tutto assieme pone dei vincoli che cambiano da compilatore a compilatore.
In particolare alcuni controlli vengono persi all'interno del codice assembly scritto nel C.

L'unico modo per uscirne e' quello di controllare la user guide e i limiti dell'assembly.
Mi aspetto che siano gli stessi dell'XC8...e non sono poche le cose da tener a mente.

_periodi , _count sono int e non credo che li puoi incrementare tanto facilmente come hai fatto visto che sono due byte!

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 10 Mesi fa - 11 Anni 10 Mesi fa #3 da Chuck_Norris
Risposta da Chuck_Norris al topic Re: problema con l'in line assembly in hi tech c
No non ho risolto, non ho avuto tempo di controllarlo per bene. Comunque sto usando il "vecchio" MPLAB con hi tech c. Il problema è che mi son letto la guida ma non mi ha chiarito molto le idee sinceramente... sarà che sono abbastanza arrugginito sull'assembly :D

qualche consiglio? definire le variabili in assembly?
Ultima Modifica 11 Anni 10 Mesi fa da Chuck_Norris. Motivo: errore

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Chuck_Norris
  • Avatar di Chuck_Norris
  • Premium Member
  • Premium Member
Di più
11 Anni 10 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: problema con l'in line assembly in hi tech c
Ciao,

in generale cerca una soluzione senza assembly.
100us non sono pochissimi e un timer potrebbe andare bene.
la chiamata ad interrupt ha un costo di cicli noto quindi puoi compensare.

In generale pero' non andare sul massimo della corrente.
I valori massimi dei datasheet non vanno usati nell'applicazione ma dovrebbero servire per valutare il margine tra il valore usato e quello massimo (un 30% rende il sistema piuttosto robusto).

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 10 Mesi fa #5 da Chuck_Norris
Risposta da Chuck_Norris al topic Re: problema con l'in line assembly in hi tech c
Andrò sul massimo della corrente per dei test che mi serviranno per determinare alcune cose, poi pensavo di rimanere su un 20% più basso sul circuito definitivo.

Il problema non sono i 100 micro ma i 2,6micro del tempo "up" dell'onda quadra. Sono un pò pochini per il C.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Chuck_Norris
  • Avatar di Chuck_Norris
  • Premium Member
  • Premium Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login