Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[C] Programmazione C per microcontrollori PIC

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

Messaggioda falcon80 » dom apr 18, 2004 11:00 am

#include
#include
#include "delay.c"
#include "lcd1.c"

__CONFIG (3FF9h);


main ()
{
int I;
int pos;

TRISD = 0;
TRISB = 0;
TRISA = 0;
TRISC = 0;
TRISE = 0;



DelayMs(20);
LCD_INIT(); //inizializza l'lcd
DelayMs(50);
LCD_CLEAR(); //pulisce lo schermo lcd
DelayUs(20);

/*presentazione a scorrimento*/

pos=20;

for (I=1; I==20; I++)
{
LCD_CMD (LCD_line1);
LCD_GOTO (1,pos);
LCD_PUTS ("Benvenuti.....!!!!!");
LCD_CMD (LCD_line2);
LCD_GOTO (2,pos);
LCD_PUTS(" Micro computer");
LCD_CMD (LCD_line3);
LCD_GOTO (1,pos);
LCD_PUTS (" di Gestione");
LCD_CMD (LCD_line4);
LCD_GOTO (1,pos);
LCD_PUTS (" parametri auto");

pos= pos-1;

DelayMs (50);
}

while (1)
{
LCD_CMD (LCD_line1);
LCD_PUTS ("Gestione di prova");
LCD_CMD (LCD_line2);
LCD_PUTS ("dell'LCD 20x4");
LCD_CMD (LCD_line3);
LCD_PUTS ("versione 1.1");
LCD_CMD (LCD_line4);
LCD_PUTS ("By Simone");
}
}
questo è il codice che ho fatto e che nn funziona.........praticamente sembra che come dichiaro delle variabili I e pos nn funziona piu
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » lun apr 19, 2004 9:07 pm

ciao io incomincio con il darti un paio di consigli:
1. attenzione a dichiarare char per int etc etc ricorda che sei su di un micro che ha poca ram quindi risparmia tutto quello che puoi se il tuo contatore è un inizializzato a 20 dichiara un char e risparmi 1 byte di ram, ma questo di sicuro non è il morivo per cui non funziona;

2. l'unica cosa che mi pare di strano a me è il fatto che tu incominci a scivere la colonna 19 e non 20 ma cerchi di scrivere 20 caratteri, questo potrebbe provocare nella ram dell'lcd una scrittura a celle non indirizzate e non visualizzate, prova scrivere sulla prima riga alla colonna 20 il primo carattere, poi indicizza il la nuova colonna con c-1 e riscriviil carattere di prima con il secondo carattere, a questo punto prosegui scrivendo un carattere per volta e dovrebbe funzionare.

se non funziona prova a passarmi le routine di lcd puts non vorrei che sia li il problema.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda falcon80 » mar apr 20, 2004 10:06 am

cio ho provato ma il risultato è lo stesso...e comunque la stessa cosa la ottengo impostando dei pin come e ntrate per dei pulsanti.....comunque ti allego la gestione lcd che iuso io

USER'S ROUTINES DESCRIPTION:

LCD_INIT() -----------> initilalize the LCD.
You must call it the first time you use the LCD
and before any other LCD routines.

LCD_CLEAR() ----------> Clears and Home LCD.

LCD_CMD('char') ------> Send a command to the LCD.
See LCD datasheet for the complete
list of commands.

LCD_GOTO(line,pos) ---> Set the Cursor to a specified Line and position.
Lines available are from 1 to 4. Pos available
starts from 1 to max available on your LCD.

LCD_PUTCH('char') ----> Write a character on LCD (ASCII representation).

LCD_PUTS("string") ---> Write a string on LCD.

LCD_PUTUN(number) ---> Write an Unsigned Number on LCD.
It works both with INT (16bit) and CHAR (8bit).

LCD_PUTSN(number) ---> Write a Signed Number on LCD (with Sign if <0).
It works both with INT (16bit) and CHAR (8bit).


/************************************************************************/
/* */
/* !!! ATTENTION !!! */
/* Follow these simple instructions to configure your LCD module */
/* */
/* 1) check your hardware to determine which lines to use */
/* (you need 6 output lines). */
/* 2) set properly TRIS registers in your main code to configure */
/* the 6 lines as outputs. */
/* 3) In the next step use the defines to set the 6 lines as your */
/* hardware requires. */
/* 4) Set LCD Rows and Columns number using the define as shown */
/* 5) You are ready...your LCD will work!!! :) */
/* */
/************************************************************************/


/************************************************************************/
/* Use this includes if these files are not included in your main code */
/************************************************************************/
//#include "pic.h"
//#include "delay.c"


/************************************************************************/
/* Use the following defines to set the lines as your hardware requires */
/* ...you can use ANY output line of the MCU, even on several ports :) */
/************************************************************************/

#define LCD_RS RD6 // Register select
#define LCD_EN RD7 // Enable
#define LCD_D4 RD2 // LCD data 4
#define LCD_D5 RD3 // LCD data 5
#define LCD_D6 RD4 // LCD data 6
#define LCD_D7 RD5 // LCD data 7



/************************************************************************/
/* Now you have only to write LCD Rows and Columns number */
/************************************************************************/
/* !!! NOTE !!! */
/* Some 1x16 LCD works as 2x8!!! ...be sure how to configure */
/* yours, see its datasheet!!! */
/************************************************************************/

#define LCD_ROWS 2 // valid numbers are: 1,2
// (set to 2 for 2 or more rows)
#define LCD_COLS 20 // valid numbers are: 8,16,20





/************************************************************************/
/* */
/* YOUR LCD IS NOW READY TO WORK!!! :) */
/* YOU CAN IGNORE THE FOLLOWING CODE */
/* ENJOY !!! */
/* */
/************************************************************************/





/************************************************************************/
/* Use the following defines to send fast command */
/* to the LCD */
/* EX: LCD_CMD(LCD_line2); will set the cursor on line 2 */
/* You can add fast command of your own!!! */
/************************************************************************/
/* */
/* !!! NOTE !!! */
/* DON'T CHANGE THE DEFINES WITHIN #if-#endif */
/* */
/************************************************************************/

#define LCD_CLR 0x01 // Clear Display
#define LCD_HOME 0x02 // Cursor to Home position

/************************************************************************/
#if (LCD_COLS==20)
#define LCD_line1 0x80 // Line 1 position 1
#define LCD_line2 0xC0 // Line 2 position 1
#define LCD_line3 0x94 // Line 3 position 1 (20 char LCD)
#define LCD_line4 0xD4 // Line 4 position 1 (20 char LCD)
#else
#define LCD_line1 0x80 // Line 1 position 1
#define LCD_line2 0xC0 // Line 2 position 1
#define LCD_line3 0x90 // Line 3 position 1 (16 char LCD)
#define LCD_line4 0xD0 // Line 4 position 1 (16 char LCD)
#endif
/************************************************************************/


/****************************************/
/* Enable LCD to read data */
/****************************************/
void LCD_STROBE (void)
{
LCD_EN = 1;
DelayUs(1);
LCD_EN=0;
}


/****************************************/
/* Write a nibble to the LCD */
/****************************************/
void LCD_NIBBLE_OUT (unsigned char c )
{
if ( c & 0b10000000 )
LCD_D7=1;
else LCD_D7=0;
if ( c & 0b01000000 )
LCD_D6=1;
else LCD_D6=0;
if ( c & 0b00100000 )
LCD_D5=1;
else LCD_D5=0;
if ( c & 0b00010000 )
LCD_D4=1;
else LCD_D4=0;
LCD_STROBE();
}


/****************************************/
/* Write a byte to the LCD (4 bit mode) */
/****************************************/
void LCD_WRITE (unsigned char c)
{
LCD_NIBBLE_OUT(c);
c <<= 4;
LCD_NIBBLE_OUT(c);
DelayUs(50);
}


/****************************************/
/* send a command to the LCD */
/****************************************/
void LCD_CMD (char c)
{
LCD_RS = 0; // write command
LCD_WRITE(c);
}


/****************************************/
/* GoTO specified line and position */
/****************************************/
void LCD_GOTO (char line,char pos)
{
switch(line)
{
case 1: LCD_CMD((LCD_line1-1)+pos);
break;
case 2: LCD_CMD((LCD_line2-1)+pos);
break;
case 3: LCD_CMD((LCD_line3-1)+pos);
break;
case 4: LCD_CMD((LCD_line4-1)+pos);
}
}


/****************************************/
/* Clear and Home LCD */
/****************************************/
void LCD_CLEAR (void)
{
LCD_CMD(LCD_CLR);
DelayMs(3);
}


/****************************************/
/* Write one character to the LCD */
/****************************************/
void LCD_PUTCH (char c)
{
LCD_RS = 1; // write characters
LCD_WRITE(c);
}


/****************************************/
/* Write numbers to the LCD */
/****************************************/
void LCD_PUTUN (unsigned int c)
{
unsigned char t1,i,wrote;
unsigned int k;

wrote=0;
for (i=4;i>=1;i--)
{
switch(i){
case 4: k=10000;
break;
case 3: k=1000;
break;
case 2: k=100;
break;
case 1: k=10;
}
t1=c/k;
if((wrote)||(t1!=0))
{
LCD_PUTCH(t1+'0');
wrote=1;
}
c-=(t1*k);
}
LCD_PUTCH(c+'0');
}
/****************************************/
void LCD_PUTSN (signed int c)
{
if(c<0)
{
LCD_PUTCH('-');
c*=(-1);
}
LCD_PUTUN(c);
}


/****************************************/
/* Write a string to the LCD */
/****************************************/
void LCD_PUTS (const char * s)
{
LCD_RS = 1; // write characters
while(*s)
LCD_WRITE(*s++);
}


/****************************************/
/* Initialize LCD */
/****************************************/
void LCD_INIT (void)
{
LCD_RS = 0; // write control bytes
DelayMs(15); // power on delay
LCD_D4=1;
LCD_D5=1;
LCD_D6=0;
LCD_D7=0;
LCD_STROBE();
DelayMs(5);
LCD_STROBE();
DelayUs(100);
LCD_STROBE();
DelayMs(5);
LCD_D4=0; // set 4 bit mode
LCD_STROBE();
DelayUs(40);

#if (LCD_ROWS==1)
LCD_WRITE(0b00100000); // 4 bit mode, 1 line, 5x8 font
#else
LCD_WRITE(0b00101000); // 4 bit mode, 2 or more lines, 5x8 font
#endif

LCD_WRITE(0b00001000); // display off
LCD_WRITE(0b00001100); // display on, curson off, blink off
LCD_WRITE(0b00000110); // shift entry mode, display not shifted
}

/************************************************************************/
#undef LCD_ROWS
#undef LCD_COLS
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche


Messaggioda fier » ven apr 23, 2004 11:36 am

ciao raga, qualcuno potrebbe inviarmi qualche progettino da fare o quelche idea per poter implementare, insomma qualcosa di interessante per passare un po di tempo.
[applauso][^]

grazie fier
Avatar utente
fier
Neo Iscritto
Neo Iscritto
 
Messaggi: 7
Iscritto il: gio mar 04, 2004 12:59 pm
Località: Piemonte

Messaggioda falcon80 » sab apr 24, 2004 10:28 am

ti ringrazio adesso lo provo subito

ciao
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » lun apr 26, 2004 10:34 pm

ciao falco80, scusa se non ti ho risposto prima, ma non mi sono collegato in questi giorni... non capisco perché ottieni le stesse cose se dichiari degli input o degli output sul lcd. io non conosco il tuo hardware, ma credo che hai dei pin come input e altri come output, i pin dell'lcd sono degli out e vengono usati solo per lcd o mi sbaglio... le tue routine mi sembrano abbastanza standard che micro usi? che compilatore c usi? se usi quello di microchip libero le routine dele librerie dovrebbero funzionare.... eventualmente controlla che nel codice non vai a scrivere sulla porta dell'LCD quando fai altre operazioni.. ciao fammi sapere
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda falcon80 » mar apr 27, 2004 2:47 pm

allora il compilatore e il pcclite e le routine di gestione lcd le ho scaricate d aun sito il pic è il 16f877. si per i pic uso le porte d del pic...pero nn so perché mi a cosi......come dichiaro una variabile boom mi si sballa
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » mar apr 27, 2004 6:59 pm

allora prova a fare così:
1. scollega quello che hai collegato sulle porte dell'LCD;
2. realizza un programma demo che si intereessi solo della scrittura sull'lcd e dai le prove del caso;
3. dopo aver fatto funzionare il punto 2 in serisci la gestione di un tasto per esempio scrivendo un numero su lcd.
4. se funziona il punto 3 inserisci un output su un altro pin
5. se vuoi usare quei pin per altri scopi ti consiglio di mettere un buffer altrimenti idati conflittano.

se dovessi avere ancora problemi, guarda che il tuo compilatore non abbia delle limitazioni relative a spazio di ram o codice usato, oppure a righe di codice... purtroppo io ho usato la famigli 16xxx solo in assembler e non conosco i vari compilatori per questa famiglia. Se non sei troppo avanti con il codice ed l'hardware ti consiglio di migrare su fam.18, il compilatore è gratis sul sito ufficiale e funziona bene. se hai altri problemi fammi sapere.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda falcon80 » mar apr 27, 2004 8:42 pm

allora finbo al punto tre tutto ok...solo che nulla metto il tasto e puff da il solito problema......sto impazzendo...
cje sia forse li limitazioni del compilatore...boh
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » gio apr 29, 2004 5:41 pm

allora a questo punto prova ad inserire la gestione del tasto in assembler _asm _endasm vedi se fa casino; se hai ancora problemi ti consiglio di leggerti le limitazioni del complilatore sul sito dove lo hai scaricato;

puoi anche provare a ridurre il codice direttamente gestendo il tasto e scrivendo un carattere se verificato, se è un problema di troppo codice così lo dovresti limitare.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda falcon80 » gio apr 29, 2004 9:06 pm

mi potrtestispiegare meglio quasta cosa della gestione tramite assembler


ciao
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » dom mag 02, 2004 9:49 am

tutti i micro possono essere programmati in vari linguaggi,il c che tu usi è uno dei più potenti, ma anche molto dispendioso in termini i di codice scritto per eseguire una operazione... i micro della microchip sono dei micro con tipologia risk e quindi con 35 istruzioni ti permettono di effettuare una programmazione completa. il problema dell'assembler e che per usarlo devi conoscere in modo approfondito l'hardware del micro il suo modo di indirizzamento alla memoria e così via ma fatto questo ti permette di risparmiare spazio in flash ed di eseguire codice con maggiore velocità. di solito i compilatori c prevedono la possibilita di inserire all'interno del codice in C del codice scritto in assembler inserendo prima dell'istruzione in assembler _asm istruzioni assembler _endasm . il codice assembler lo trovi nel manuale del micro, le istruzioni che ti interessano dovrebbero essere quelle di controllo dei singoli bit sui registri.
esiste una guida scaricabile liberamente che ti spiega come programmare il 16F84 in assembler l'autore è Tanzilli. ciao se non la trovi inviami il tuo indirizzo email che te la spedisco.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda falcon80 » dom mag 02, 2004 2:26 pm

ciao si corsi in assembler ne ho e lo uso anche....volevo solo provare il c.........anche perché nn so so usare bene le tabelle in assembler....comunque adesso provo e poi ti facci osapere come va....grazie di tutto ciao
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda Rob. » sab mag 22, 2004 12:28 am

Ci siete ancora ?
Ciao sono nuovo del forum, mi chiamo Roberto e programmo i PIC con il compilatore della CCS da circa 3 anni.
Sono passato alla famiglia 18 da poco , ma sento il bisogno anche di cambiare compilatore, vedi l'mcc18.
Se qualcuno vuole iniziare qui con me si faccia sentire...
Avatar utente
Rob.
Neo Iscritto
Neo Iscritto
 
Messaggi: 16
Iscritto il: sab mag 22, 2004 12:22 am
Località: Liguria

Messaggioda ciber_eln » sab mag 22, 2004 11:38 am

ciao , io sono passato alla fam 18 da circa 3 mesi, ho consegnato già 3 progetto e a breve consegnerò il 4°, uso il mcc18, con qualche buchetto qua e la, comunque è gratis, quindi non ci si può inc.. più di tanto, attenzione a scaricare la versione 2.20a perche ancge se ce la 2.30 questa non è possibile rinstallarla e quindi hai 30gg per fare quello che devi dopo di che devi acquistare il tool completo circa $500. esiste un compilatore della ccs per la fam. 18 ma costa circa $175 non so io fino adesso il mcc18 non ho avuto grossi problemi, ciao se vogliamo sentirci scrivi sul forum.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda Rob. » sab mag 22, 2004 3:00 pm

Ciao,
Io sto usando tutt'ora la versione 3.148 di CCS , volendo posso aggiornarla alla 3.20.
Per esperienza personale ho visto che il compilatore ha avuto problemi (bug) molto frequenti fino alla versione 3.Ho anche il PCH (per la Famiglia 18).
L'mcc18 non lo conosco bene salvo per il fatto che è c..
La mia prima impressione è stato che ti da le comodità del C insieme al pieno controllo del chip,cioè una via di mezzo tra le built-in functions e la lettura e scrittura da zero dei vari registri.
Sempre per esperienza personale, penso infatti che usare solo le built ti rende schiavo del compilatore.
Per il resto non so ancora, so solo che ha dei problemi con conversioni di stringhe in numeri , genera troppo codice, cosi' mi ha detto un veterano del settore.
fammi sapere se condividi
Avatar utente
Rob.
Neo Iscritto
Neo Iscritto
 
Messaggi: 16
Iscritto il: sab mag 22, 2004 12:22 am
Località: Liguria

Messaggioda falcon80 » lun mag 24, 2004 8:31 pm

cioa....io resto con il mio problema invece :( anche se attualmente mi sono un po fermato...un po preso dal lavoro

ma l'mcc18 dove si puo prendere?
Avatar utente
falcon80
Neo Iscritto
Neo Iscritto
 
Messaggi: 15
Iscritto il: ven apr 16, 2004 2:14 pm
Località: Marche

Messaggioda ciber_eln » lun mag 24, 2004 10:39 pm

ciao, rob ma il ccs l'hai comprato ho hai una versione demo? io sinceramente ho lavorato con l'mcc18 e non mi pare che sprechi tanto codice, attenzione alle pragma etc etc perché se non si fa attenzione ti satura la ram, perché di default scrive tanta roba in ram che va messa invece in flash, io fino adesso ho lavorato sia sul 18f1320(8k flash) che sul 18f252(32k flash), ma con qualche attenzione qua e la non ho mai avuto grossi problemi. Sicuramente sul mercato esistono compilatori migliori, ma assai cari iar per esempio e comunque dalla mia esperienza con hitachi ed motorola tutti hanno buchetti qua e la; per il discorso di conversione e vari tool anche io penso che l'affidarsi a routine pronte per l'uso sia poco efficente sia per il compilatore sia per chi scrive il codice dato che usando quelle funzioni tende a conoscere meno il micro che usa, (tra qualche anno se si continua così useremo tool simile a VB e tutti i codici sembreranno uguali,non me ne vogliano i programmatori ad alto livello).
l'mcc18 lo scarichi dal sito ufficiale della microchip in abbinamento al nuovo ambiente MPLAB IDE.
Avatar utente
ciber_eln
Aficionado
Aficionado
 
Messaggi: 38
Iscritto il: mer feb 11, 2004 11:49 pm
Località: Emilia Romagna

Messaggioda Rob. » mar mag 25, 2004 9:54 pm

il compilatore l'ho comprato , tutt'ora sto usando un PIC18F452.
La ccs offre insieme al compilatore (non mi ricordo se sono scaricabili dal loro sito o anche con il loro demo) sorgenti di esempio forse +complessi al altre case che io conosco, sempre se quest'ultime non si sono aggiornate.
Quello che mi piacerebbe fare ora e un micro che interpreti alcune istruzioni BASIC (tipo basic stamp) o simbologia grafica.

in un sito inglese ho trovato questo , ma devo ancora leggerlo bene
http://www.hippy.freeserve.co.uk/diystamp.htm
Oppure qualcosa di semplice da poterne discutere insieme o anche semplici routine, però tutti dovrebbero avere la stessa attrezzatura SW, poi il tempo è quello che è..
Avatar utente
Rob.
Neo Iscritto
Neo Iscritto
 
Messaggi: 16
Iscritto il: sab mag 22, 2004 12:22 am
Località: Liguria

Messaggioda Rob. » mar mag 25, 2004 10:00 pm

Forse una demoboard uguale per tutti, posso capire che siamo su internet e nessuno si conosce , potremmo comunque provare
Avatar utente
Rob.
Neo Iscritto
Neo Iscritto
 
Messaggi: 16
Iscritto il: sab mag 22, 2004 12:22 am
Località: Liguria

PrecedenteProssimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising