MrCamarium Inserito: 16 maggio 2013 Segnala Inserito: 16 maggio 2013 Mi sto inoltrando nel mondo del pic ma di linguaggio ne capisco poco, ho il programmatore e un pic12f675 ho scaricato e installato mikroC ho smanettato un po e ho capito come funziona. adesso vorrei passare nel realizzare un mio progetto un divisore di frequenza vorrei che la frequenza sul piedino 5 potesse uscire 1000 volte divisa dal piedino 2 fino adesso ho fatto solo questo: void main() { CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5 //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts } Qualcuno mi ha suggerito di fare cosi: 0 - Imposti GP2 come ingresso e GP5 come uscita (Fatto) 1 - crei un contatore e lo azzeri 2 - verifichi il livello di GP4 e quando cambia stato, sommi 1 al contatore 3 - quando il contatore è a 500, inverti lo stato di GP5 4 - azzeri il contatore 5 - riprendi dal punto 2 Come si fa a creare un contatore?
Livio Orsini Inserita: 16 maggio 2013 Segnala Inserita: 16 maggio 2013 (modificato) Come si fa a creare un contatore? int cont = 0; //dichiaro la variabile cont(atore) intero e la azzero .............................. { ................ cont++; //incremento contatore if cont (>= 500) { cont = 0; RB5 = !=RB5; //nego RB5 } ................. } //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT Se usi l'interrupt sul front di salita il codice lo inserisci così com'è nella sub di servizio all'interrupt. Non hai bisogno di verificare alcun cambiamento di stato. Modificato: 16 maggio 2013 da Livio Orsini
MrCamarium Inserita: 16 maggio 2013 Autore Segnala Inserita: 16 maggio 2013 RB5 = !=RB5; //nego RB5 RB5 cosa è
Livio Orsini Inserita: 16 maggio 2013 Segnala Inserita: 16 maggio 2013 Scusaa sono abituato ad usare RXn per le porte RB5 == GP5
MrCamarium Inserita: 17 maggio 2013 Autore Segnala Inserita: 17 maggio 2013 Ho corretto e ho fatto cosi: int cont= 0; //dichiaro la variabile cont(atore) intero e la azzero void main() { CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5 //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts cont++; //incremento contatore if cont (>= 500) //Conta fino a 500 { cont= 0; //Azzera il contatore GP5= !=GP5; //nego GP5 } } Ma mi da questo errore: 28 405 '(' expected, but 'cont' found Divisore Di Frequenza.c 28 315 Invalid expression Divisore Di Frequenza.c 28 406 ')' expected, but '{' found Divisore Di Frequenza.c La riga 28 sarebbe questa: if cont (>= 500) //Conta fino a 500 come compilatore sto usando mikroC Pro, ho provato a eliminare le parentisi ma mi da lo stesso errore.
Livio Orsini Inserita: 17 maggio 2013 Segnala Inserita: 17 maggio 2013 (modificato) if cont (>= 500) //Conta fino a 500 Sorge spontanea una domanda: ma tu il "C" lo conosci, almeno nei suoi rudumenti fondamentali? Io ho fatto un'errore di battitura e d ho scritto: if cont (>= 500) //Conta fino a 500 in luogo di if (cont >= 500) //Conta fino a 500 perbacco però alla segnalazione di errore del compilatore questo errore è di evidenza solare! Poi dove hai dichiarato al variabile "cont"? Io ti ho messo la dichiarazione nel primo statemet! Se non conosci almeno decentemente il "C", comicia con il fare esercizietti molto più semplici come leggere un ingresso scrivere un'uscita, fare un dei semplici test, facendo programmini di poche righe, magari seguendo un testo sacro come il Ritchie & Kernigam Modificato: 17 maggio 2013 da Livio Orsini
MrCamarium Inserita: 17 maggio 2013 Autore Segnala Inserita: 17 maggio 2013 scusa hai ragione ma di solito io faccio delphi che si programma ad oggetti e per me è più facile. adesso sto cominciando il c ma solo per i pic. void main() { int cont= 0; //dichiaro la variabile cont(atore) intero e la azzero CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5 //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts cont++; //incremento contatore if (cont >= 500) //Conta fino a 500 { cont= 0; //Azzera il contatore GP5= !=GP5; //nego GP5 } } mi da questo errore: 31 315 Invalid expression Divisore Di Frequenza.c 31 318 Assigning to non-lvalue 'GP5' Divisore Di Frequenza.c la riga 31 è: GP5= !=GP5; //nego GP5 per caso la devo dichiarare?
Livio Orsini Inserita: 17 maggio 2013 Segnala Inserita: 17 maggio 2013 Io ti ho fornito il codice in un compilatore che non è microC, in microC l'operatore not ha una scrittura differente. Invece di chiedere la forum faresti molto prima e molto meglio a leggerti il manuale. Se poi consideriamo che stai chedendo le stesse cose in più forum viene anche la voglia di.............lasciamo perdere.
MrCamarium Inserita: 18 maggio 2013 Autore Segnala Inserita: 18 maggio 2013 hai ragione ho sbagliato il fatto è che non molti rispondono alle mie domande come te, in molti forum mi hanno mai risposto con inserimenti multipli speravo che qualcuno mi rispondesse, tu sei molto professionale e ti ringrazio. void main() { int cont= 0; //dichiaro la variabile cont(atore) intero e la azzero CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2 #define GP5 GP5 // invece di scrivere RD0, scriverò LED, così mi è più facile ricordare //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts cont++; //incremento contatore if (cont >= 500) //Conta fino a 500 { cont= 0; //Azzera il contatore GP5= 0 - GP5; //nego GP5 } } mi spiegheresti perchè mi da questo errore?: 32 318 Assigning to non-lvalue 'GP5' Divisore Di Frequenza.c sarebbe questa la riga: GP5= 0 - GP5; //nego GP5
Livio Orsini Inserita: 18 maggio 2013 Segnala Inserita: 18 maggio 2013 Percè GP5 è dichiarato booleano, inoltre l'inversione non si realizza inquesto modo. ma perchè non tidecidi a studiare il "C" ed il manuale del microC?
MrCamarium Inserita: 18 maggio 2013 Autore Segnala Inserita: 18 maggio 2013 GP5= GP5^1; //Inverto GP5 quello era un errore di battitura, l'inversione si può fare anche cosi, ma il problema non è questo non capisco come poter risolvere il problema del GP5
Livio Orsini Inserita: 18 maggio 2013 Segnala Inserita: 18 maggio 2013 Rileggi quello che ho scritto prima, per intero!
MrCamarium Inserita: 19 maggio 2013 Autore Segnala Inserita: 19 maggio 2013 void main() { #define OUT GP5_bit; // invece di scrivere GP5, scriverò LED, così mi è più facile ricordare int cont= 0; //dichiaro la variabile cont(atore) intero e la azzero CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2 //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts cont++; //incremento contatore if (cont >= 500) //Conta fino a 500 { cont= 0; //Azzera il contatore OUT= !OUT; //Inverto GP5 } } adesso va ma mi dice che: 32 315 Invalid expression Divisore Di Frequenza.c OUT= !OUT; //Inverto GP5
MrCamarium Inserita: 19 maggio 2013 Autore Segnala Inserita: 19 maggio 2013 Finalmente ho risolto: void main() { int cont= 0; //dichiaro la variabile cont(atore) intero e la azzero CMCON= 7; // Disabilita Comparatore. ADCON0= 0; // Disabilita convertitore A/D ANSEL= 0b00000000; //Tutte le porte in digitale TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2 //Impostazione del registro OPTION OPTION_REG= 0b11111111; //bit 0 -> Prescaler Rate Select bit 1 //bit 1 -> Prescaler Rate Select bit 1 //bit 2 -> Prescaler Rate Select bit 1 (1:256) //bit 3 -> Prescaler assegnato GP2/T0CKI pin //bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin //bit 5 -> Clock Transizione sulla GP2/T0CKI pin //bit 6 -> Interrupt sul fronte di salita del pin GP2/INT //bit 7 -> Resistenze di pull-up Disabilitate //Impostazione Interrupt INTCON= 0b10010011; //bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software) //bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software) //bit 2 -> TMR0 register did not overflow //bit 3 -> Disables the GPIO port change interrupt //bit 4 -> Enables the GP2/INT external interrupt //bit 5 -> Disables the TMR0 interrupt //bit 6 -> PEIE, Disables all peripheral interrupts //bit 7 -> GIE, Enables all unmasked interrupts cont++; //incremento contatore if (cont >= 500) //Conta fino a 500 { cont= 0; //Azzera il contatore TRISIO= !GP5; //Inverto GP5 } } Ho capito dove sbagliavo adesso lo compila bene. Passo alla simulazione, in pratica l'erroe non era nel linguaggio ma nella sintesi perchè con il compilatore HitecC dopo aver definito la porta: #define led GP5 // invece di scrivere GP5, scriverò LED, così mi è più facile ricordare se srvivo: led = !led me lo compila invece il compilatore mikroC non lo fa. Ragionadoci un po su su un codice di esempio che usciva in miKroC ho capito come dovevo procedere. Ti ringrazio mi sono divertito a scogliere quello che per me era un nodo. Buon lavoro!
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora