Conversione da Mikrobasic 7.2 a C18

11 Anni 3 Mesi fa - 11 Anni 3 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;
}
Ultima Modifica 11 Anni 3 Mesi fa da aduri.

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

  • aduri
  • Avatar di aduri
  • Junior Member
  • Junior Member
Di più
11 Anni 3 Mesi fa #2 da StefA
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

..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
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
11 Anni 3 Mesi fa #3 da aduri
Risposta da aduri al topic Re: Conversione da Mikrobasic 7.2 a C18

File allegato:

Nome del file: main.c
Dimensione del file:5 KB



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
Allegati:

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

  • aduri
  • Avatar di aduri
  • Junior Member
  • Junior Member
Di più
11 Anni 3 Mesi fa #4 da StefA
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

..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
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
11 Anni 3 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

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

  • aduri
  • Avatar di aduri
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiStefA

Registrati al sito

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

Registrati al sito LaurTec.

Login