- Messaggi: 144
- Ringraziamenti ricevuti 3
problema con l'in line assembly in hi tech c
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
- Autore della discussione
- Premium Member
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.
qualche consiglio? definire le variabili in assembly?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Chuck_Norris
- Autore della discussione
- Premium Member
- Messaggi: 144
- Ringraziamenti ricevuti 3
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.
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
- Autore della discussione
- Premium Member
- Messaggi: 144
- Ringraziamenti ricevuti 3
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.