- Messaggi: 35
- Ringraziamenti ricevuti 2
Conversione da Mikrobasic 7.2 a C18
11 Anni 9 Mesi fa - 11 Anni 9 Mesi fa #1
da aduri
Conversione da Mikrobasic 7.2 a C18 è stato creato da aduri
Salve a tutti,
dopo aver risolto, col vostro aiuto, i primi problemi con le librerie comincio ad affrontare il mio primo progetto nel quale tenterò di usare le librerie LaurTec (GLCD_KS0108B).
Il progetto da cui parto è un oscilloscopio (o meglio un visualizzatore di forme d'onda) funzionante in Mikrobasic 7.2 ma da migliorare specialmente nella parte trigger.
Il trigger è molto semplice ed è basato sullo zero crossing ed a volte è veramente performante e riesce a fermare delle forme d'onda con frequenze di diversi KHz ed in altri momenti non riesce proprio ad agganciare.
Il mio primo problema è l'uso del GOTO che non è molto elegante ma io in questo momento non conosco alternative e mi da errore..
Ho commentato il primo goto per verificare altri errori e ho visto che non mi accetta un ciclo IF nidificato all'interno di un ciclo FOR.
Grazie per l'aiuto
Antonio
Allego il codice del main.c:
// programma c_scope conversione in C
#include <p18f4550.h>
#include "GLCD_KS0108B.c"
// verificare library
#include <delays.h>
// non usato ADC del compilatore ma settato i registri direttamente a codice
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//FOSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici rimane solo PORTA
void main (void) {
// Dichiarazione delle variabili
unsigned char Raw = 0;
unsigned char temp = 0;
unsigned char i = 0;
unsigned char trig = 0;
unsigned char myArray1[128];
unsigned char myArray2[128];
// Array di numeri con 128 elementi
unsigned char myArray[128];
// Imposto PORTA
LATA = 0x00;
TRISA = 0x07;
//set analog input as I/O
ADCON1 = 0x0F;
// Imposto PORTB tutte uscite x segnali controllo GLCD
LATB = 0x00;
TRISB = 0x00;
// Imposto PORTD tutte uscite x dati GLCD
LATD = 0x00;
TRISD = 0x00;
initialize_GLCD (); // richiamo libreria glcd Laurenti verif. pins
backlight_GLCD (TURN_ON_LED);
clear_GLCD (FILLING_WHITE);
while (1) { // LOOP infinito
Delay10TCYx(72); // Wait to stabilise
// azzera mioarray1 e mioarray2
for (i = 0; i < 128; i++) {
mioArray1 = 0;
}
for (i = 0; i < 128; i++) {
mioArray2 = 0;
}
// goto poztrigger // verificare sintassi (wait for +ve edge trigger)
Raw = Raw >> 2; // Raw = Raw/4 (256/4=64) scale Raw for display
for (x = 0; i < 128; i++) {
mioArray1[x] = Raw;
Raw = readADC(0); //verificare sintassi richiamo libreria adc
Raw = Raw >> 2; //Raw = Raw/4 scale Raw for display
myarray1[x] = 64 - myarray1[x];
}
for (x = 0; x < 128; x++) { //Do A/D & fill up myarray1
if (myarray1[x] <> myarray2[x]) {
Glcd_Dot(x, myarray2[x], 0);
Glcd_Dot(x, myarray1[x], 1);
}
}
goto poztrigger () // verificare sintassi (wait for +ve edge trigger)
Raw = Raw >> 2 // Raw = Raw/4 (256/4=64) scale Raw for display
for (x = 0; i < 128; i++) {
mioArray2[x] = Raw;
Raw = readADC(0); //verificare sintassi richiamo libreria adc
Raw = Raw >> 2; //Raw = Raw/4 scale Raw for display
myarray1[x] = 64 - myarray2[x];
}
for (x = 0; x < 128; x++) { //Do A/D & fill up myarray1
if (myarray1[x] <> myarray2[x]) {
Glcd_Dot(x, myarray1[x], 0);
Glcd_Dot(x, myarray2[x], 1);
}
}
}
Poztrigger:
Raw = readADC(0); // Get A/D reading
Raw = Raw >> 2; // Raw = Raw/4 (1024/4=256) from 10 to 8 bit res.
temp = Raw;
Delay10TCYx(72); // delay 60uS - nr.1TCY = 4/48MHz = 1/12 us so wait a bit before next reading..
Raw = readADC(0); // Get A/D reading
Raw = Raw >> 2; // Raw = Raw/4 from 10 to 8 bit resolution
if ((raw >127) and (raw <129)) { // Near zero crossing ? 127 to 129 (zero = 128)
GoTo exitloop ();
}
if (raw > (temp+4)) { // Positive going edge ? negative
GoTo exitloop ();
}
if ((raw > (temp-3)) && (raw < (temp+3))) { // Positive going edge ? negative
GoTo exitloop ();
}
else { // Negative going edge... ignore
trig = 0;
GoTo Poztrigger (); // Start over
}
GoTo Poztrigger ();
exitloop:
Trig = Trig | 1 // Toggle trigger LED (or bit a bit)
}
void setupADC(void) {
//Set port A0 e A1 to input
TRISA=0b11;
//Set FOSC/32, this is detailed in section 21.0, page 261 of the PIC18f4550 datasheet
ADCON2bits.ADCS0=0;
ADCON2bits.ADCS1=1;
ADCON2bits.ADCS2=0;
//Set voltage reference and port A0 and A1 as analogue only,
//this is detailed in section 21.0, page 260 of the PIC18f4550 datasheet
ADCON1=0b00001101;
ADCON0bits.ADON=1; //Turn on ADC
}
unsigned int readADC(void) {
unsigned char adh,adl;
unsigned int result;
//Read port A0
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=0;
ADCON0bits.CHS3=0;
// CHANNEL 0 set, note, to read Port A1, ADCON0bits.CHS0=1
// page 259 of the PIC18f4550 datasheet
ADCON0bits.GO=1;
while (ADCON0bits.GO);
//Convert high and low bytes to a 16 bit value
adl= ADRESL;
adh= ADRESH;
result=adh*256;
result=result+adl;
return result;
}
dopo aver risolto, col vostro aiuto, i primi problemi con le librerie comincio ad affrontare il mio primo progetto nel quale tenterò di usare le librerie LaurTec (GLCD_KS0108B).
Il progetto da cui parto è un oscilloscopio (o meglio un visualizzatore di forme d'onda) funzionante in Mikrobasic 7.2 ma da migliorare specialmente nella parte trigger.
Il trigger è molto semplice ed è basato sullo zero crossing ed a volte è veramente performante e riesce a fermare delle forme d'onda con frequenze di diversi KHz ed in altri momenti non riesce proprio ad agganciare.
Il mio primo problema è l'uso del GOTO che non è molto elegante ma io in questo momento non conosco alternative e mi da errore..
Ho commentato il primo goto per verificare altri errori e ho visto che non mi accetta un ciclo IF nidificato all'interno di un ciclo FOR.
Grazie per l'aiuto
Antonio
Allego il codice del main.c:
// programma c_scope conversione in C
#include <p18f4550.h>
#include "GLCD_KS0108B.c"
// verificare library
#include <delays.h>
// non usato ADC del compilatore ma settato i registri direttamente a codice
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//FOSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici rimane solo PORTA
void main (void) {
// Dichiarazione delle variabili
unsigned char Raw = 0;
unsigned char temp = 0;
unsigned char i = 0;
unsigned char trig = 0;
unsigned char myArray1[128];
unsigned char myArray2[128];
// Array di numeri con 128 elementi
unsigned char myArray[128];
// Imposto PORTA
LATA = 0x00;
TRISA = 0x07;
//set analog input as I/O
ADCON1 = 0x0F;
// Imposto PORTB tutte uscite x segnali controllo GLCD
LATB = 0x00;
TRISB = 0x00;
// Imposto PORTD tutte uscite x dati GLCD
LATD = 0x00;
TRISD = 0x00;
initialize_GLCD (); // richiamo libreria glcd Laurenti verif. pins
backlight_GLCD (TURN_ON_LED);
clear_GLCD (FILLING_WHITE);
while (1) { // LOOP infinito
Delay10TCYx(72); // Wait to stabilise
// azzera mioarray1 e mioarray2
for (i = 0; i < 128; i++) {
mioArray1 = 0;
}
for (i = 0; i < 128; i++) {
mioArray2 = 0;
}
// goto poztrigger // verificare sintassi (wait for +ve edge trigger)
Raw = Raw >> 2; // Raw = Raw/4 (256/4=64) scale Raw for display
for (x = 0; i < 128; i++) {
mioArray1[x] = Raw;
Raw = readADC(0); //verificare sintassi richiamo libreria adc
Raw = Raw >> 2; //Raw = Raw/4 scale Raw for display
myarray1[x] = 64 - myarray1[x];
}
for (x = 0; x < 128; x++) { //Do A/D & fill up myarray1
if (myarray1[x] <> myarray2[x]) {
Glcd_Dot(x, myarray2[x], 0);
Glcd_Dot(x, myarray1[x], 1);
}
}
goto poztrigger () // verificare sintassi (wait for +ve edge trigger)
Raw = Raw >> 2 // Raw = Raw/4 (256/4=64) scale Raw for display
for (x = 0; i < 128; i++) {
mioArray2[x] = Raw;
Raw = readADC(0); //verificare sintassi richiamo libreria adc
Raw = Raw >> 2; //Raw = Raw/4 scale Raw for display
myarray1[x] = 64 - myarray2[x];
}
for (x = 0; x < 128; x++) { //Do A/D & fill up myarray1
if (myarray1[x] <> myarray2[x]) {
Glcd_Dot(x, myarray1[x], 0);
Glcd_Dot(x, myarray2[x], 1);
}
}
}
Poztrigger:
Raw = readADC(0); // Get A/D reading
Raw = Raw >> 2; // Raw = Raw/4 (1024/4=256) from 10 to 8 bit res.
temp = Raw;
Delay10TCYx(72); // delay 60uS - nr.1TCY = 4/48MHz = 1/12 us so wait a bit before next reading..
Raw = readADC(0); // Get A/D reading
Raw = Raw >> 2; // Raw = Raw/4 from 10 to 8 bit resolution
if ((raw >127) and (raw <129)) { // Near zero crossing ? 127 to 129 (zero = 128)
GoTo exitloop ();
}
if (raw > (temp+4)) { // Positive going edge ? negative
GoTo exitloop ();
}
if ((raw > (temp-3)) && (raw < (temp+3))) { // Positive going edge ? negative
GoTo exitloop ();
}
else { // Negative going edge... ignore
trig = 0;
GoTo Poztrigger (); // Start over
}
GoTo Poztrigger ();
exitloop:
Trig = Trig | 1 // Toggle trigger LED (or bit a bit)
}
void setupADC(void) {
//Set port A0 e A1 to input
TRISA=0b11;
//Set FOSC/32, this is detailed in section 21.0, page 261 of the PIC18f4550 datasheet
ADCON2bits.ADCS0=0;
ADCON2bits.ADCS1=1;
ADCON2bits.ADCS2=0;
//Set voltage reference and port A0 and A1 as analogue only,
//this is detailed in section 21.0, page 260 of the PIC18f4550 datasheet
ADCON1=0b00001101;
ADCON0bits.ADON=1; //Turn on ADC
}
unsigned int readADC(void) {
unsigned char adh,adl;
unsigned int result;
//Read port A0
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=0;
ADCON0bits.CHS3=0;
// CHANNEL 0 set, note, to read Port A1, ADCON0bits.CHS0=1
// page 259 of the PIC18f4550 datasheet
ADCON0bits.GO=1;
while (ADCON0bits.GO);
//Convert high and low bytes to a 16 bit value
adl= ADRESL;
adh= ADRESH;
result=adh*256;
result=result+adl;
return result;
}
Ultima Modifica 11 Anni 9 Mesi fa da aduri.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- aduri
- Autore della discussione
- Junior Member
Riduci
Di più
11 Anni 9 Mesi fa #2
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: Conversione da Mikrobasic 7.2 a C18
nell'IF...if (myarray1[x] <> myarray2[x])
credo che <> non sia implementato..potresti risolvere con...
if(!(myarray1[x] == myarray2[x]))
riguardo il goto è un'istruzione assembler e quindi devi scriverla così:
_asm GOTO poztrigger _endasm
Ste
credo che <> non sia implementato..potresti risolvere con...
if(!(myarray1[x] == myarray2[x]))
riguardo il goto è un'istruzione assembler e quindi devi scriverla così:
_asm GOTO poztrigger _endasm
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Ringraziano per il messaggio: aduri
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
11 Anni 9 Mesi fa #3
da aduri
Torno a chiedere aiuto al forum.
Ho cercato di risolvere da solo, leggendomi la user guide del C18 ma mi sono rimasti un paio di errori ed una warning di cui vorrei chiedervi delucidazioni.
Allego sia il main.c che il messaggio d'errore.
Grazie ancora
Antonio
Risposta da aduri al topic Re: Conversione da Mikrobasic 7.2 a C18
Torno a chiedere aiuto al forum.
Ho cercato di risolvere da solo, leggendomi la user guide del C18 ma mi sono rimasti un paio di errori ed una warning di cui vorrei chiedervi delucidazioni.
Allego sia il main.c che il messaggio d'errore.
Grazie ancora
Antonio
Si prega Accedi o Crea un account a partecipare alla conversazione.
- aduri
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 35
- Ringraziamenti ricevuti 2
11 Anni 9 Mesi fa #4
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: Conversione da Mikrobasic 7.2 a C18
"call of function without prototype" significa che hai usato una funzione (l'hai richiamata), ma non hai definito il prototipo prima.
Si usa fare ad esempio..
//Dichiarazione prototipo di funzione
void scriviDisplay (void);
....
....
void scriviDisplay (void)
{
istruzioni del corpo funzione...
}
la dichiarazione dei prototipi di tutte le funzioni, tranne la main, va fatta all'inizio, prima di iniziare a scrivere le funzioni vere e proprie.
Inoltre non so se per convenzione o perché altrimenti non funziona, ma la funziona main scrivila sempre per ultima.
Ho notato che dichiari..
unsigned int readADC(void)
...però poi fai anche..
Raw = readADC(0);
innanzitutto Raw è dichiarato come "unsigned char Raw = 0;" e non sono sicuro che ti sia permesso di porre un char = int...forse facendo un casting si può...e poi chiamando la funzione gli passi il valore zero, quando lei si aspetta void..quindi devi chiamarla così: readADC();
Vedi se risolvi, altrimenti siamo qui.
Ste
Si usa fare ad esempio..
//Dichiarazione prototipo di funzione
void scriviDisplay (void);
....
....
void scriviDisplay (void)
{
istruzioni del corpo funzione...
}
la dichiarazione dei prototipi di tutte le funzioni, tranne la main, va fatta all'inizio, prima di iniziare a scrivere le funzioni vere e proprie.
Inoltre non so se per convenzione o perché altrimenti non funziona, ma la funziona main scrivila sempre per ultima.
Ho notato che dichiari..
unsigned int readADC(void)
...però poi fai anche..
Raw = readADC(0);
innanzitutto Raw è dichiarato come "unsigned char Raw = 0;" e non sono sicuro che ti sia permesso di porre un char = int...forse facendo un casting si può...e poi chiamando la funzione gli passi il valore zero, quando lei si aspetta void..quindi devi chiamarla così: readADC();
Vedi se risolvi, altrimenti siamo qui.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
11 Anni 9 Mesi fa #5
da aduri
Risposta da aduri al topic Re: Conversione da Mikrobasic 7.2 a C18
Ti ringrazio di nuovo.
Se devo essere sincero della funzione readADC(void), rileggendo il codice, c'ero arrivato (ciò mi consola perchè è indicazione che comincio a capire qualcosa), invece del cast non ci avevo fatto caso.
Dovrei provare a definire come int la Raw e shiftando otterrei 8 bit che io shifto di nuovo per adeguare lo schermo del GLCD e diventa 6bit (2^6=64 che è l' asse y del GLCD).
Proverò a far fare il cast automatico al compilatore e se non funzionasse provo forzandolo con
(unsigned char) Raw = Raw <<2.
Riguardo il warning del prototipo, la dichiarazione la dovrei posizionare appena prima del void main() vero?
Spero di non aver detto fesserie e che la sintassi sia corretta.
Ciao
Antonio
Se devo essere sincero della funzione readADC(void), rileggendo il codice, c'ero arrivato (ciò mi consola perchè è indicazione che comincio a capire qualcosa), invece del cast non ci avevo fatto caso.
Dovrei provare a definire come int la Raw e shiftando otterrei 8 bit che io shifto di nuovo per adeguare lo schermo del GLCD e diventa 6bit (2^6=64 che è l' asse y del GLCD).
Proverò a far fare il cast automatico al compilatore e se non funzionasse provo forzandolo con
(unsigned char) Raw = Raw <<2.
Riguardo il warning del prototipo, la dichiarazione la dovrei posizionare appena prima del void main() vero?
Spero di non aver detto fesserie e che la sintassi sia corretta.
Ciao
Antonio
Si prega Accedi o Crea un account a partecipare alla conversazione.
- aduri
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 35
- Ringraziamenti ricevuti 2
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.