Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
Avatar utente
da nautiluso
#180
Buongiorno a tutti.

Giocando con una demoboard per pic 16f877 ho notato un problema a mio pararere inspiegabile.

Ho scritto un semplice programma che accende in successione 6 led.

Il programma gira tranquillamente MA OGNI TANTO all'accensione e solo all'accensione le uscite si accendono TUTTE CONTEMPORANEAMENTE, il programma non và in esecuzione per qualche istante.

La cosa strana è che anche resettando RARE VOLTE queste uscite sono come FANTASMI all'accensione che spariscono dopo qualche istante, ma faccio tempo a vedere lampeggi di led che NON dovrebbero accendersi.

Nei fuses ho impostato PWRT_ON e sopratutto la rete RC sul pin MCLR è una da 10K e 100 nF.

Il tutto è alimentato da un classico 7805 e un alimentatore lineare da laboratorio.

Il difetto avviene sempre quando i condensatori di alimentazione sono SCARICHI, mentre, provando diverse volte, non c'è cenno al difetto.

Grazie a chi mi può aiutare!!!!!


Nautiluso
Avatar utente
da Maxim
#181
Ciao Nautiluso, hai provato ad eliminare il condensatore su MCLR e vedere cosa succede?
da mars
#182
Che oscillatore usi?
Quali sono le prime righe del programma che inizializzano gli I/O?

Il condensatore su MCLR, in generale, non serve a nulla, se non a dilazionare il reset.
PWRTE_ON aggiunge solamente 72ms di ritardo all' avvio per la stabilizzazione del circuito.

Il fatto che si crea al reset o all' accensione fa supporre un problema di alimentazione o di oscillatore o di MCLR o di settaggio degli I/O.

Da tenere presente che al POR gli I/O sono configurati come ingressi e quindi non possono dare corrente a carichi in uscita; LED collegati direttamente non si accendono se non dopo aver configurato i pin come uscite
Avatar utente
da nautiluso
#193
chiedo scusa se non ho risposto subito. ho modificato il programma e ho provato a collegare alle uscite 2 ponti ad H L6203 a cui sono attaccati 2 motorini, per sincerarmi che realmente girassero per qualche istante. Il difetto c'è e l'alberino si sposta (almeno 1 secondo) . Il problema è totalmente casuale ma dopo n accensioni, sembra scomparire.
L'alimentazione è quella di un alimentatore da laboratorio lineare, 12V, poi il classico 7805 con c da 100 nF e da 100 uf in uscita. Infine ho messo anche 2 vk200 sui rami della alimentazione.

l'oscillatore è un quarzo 20Mhz classico H49.

Dimenticavo di dire che il programma è in PicbasicPro 2.60 e la scheda è la EVR C230, ma ne derivo le sole uscite.

io non uso display ho collegato solo 4 pulsanti (pullup con R da 10K) e tramite questi abilito le uscite per 2 motori (ovvero 3 per il mot 1 e 3 per il mot2) in quanto ciscun ponte ha IN1, IN2 e ENABLE.
Premendo i pulsanti 1 o 2 il motore 1 ruota in senso orario o antiorario
Premendo i pulsant1 3 o 4 fà la stessa cosa il motore 2


Le righe di inizializzazione sono:

Codice: Seleziona tutto@ device pic16f877,hs_osc,wdt_off,pwrt_on,protect_off

DEFINE OSC 20
DEFINE LOADER_USED 1

INCLUDE "modedefs.bas"   


TRISA = %000000'
TRISB = %00000000' tutte uscite
TRISC = %00000000
TRISD = %11111111
TRISE = %110

' ASSEGNAZIONE PIN DISPLAY 2X16
' PIN PIC   | PIN LCD
' 40 RB7    | 14 bit 8
' 39 RB6    | 13 bit 7
' 38 RB5    | 12 bit 6
' 37 RB4    | 11 bit 5
' 36 RB3    |  6 bit E
' 35 RB2    |  5 bit RW
' 34 RB1    |  4 bit RS
'              3 CONTRASTO
'              2 +5V
'              1 GND

'---------------------------------------------------------
'DEFINE LCD
DEFINE  LCD_DREG        PORTB   'LCD data port
DEFINE  LCD_DBIT        4       'LCD starting data 4
DEFINE  LCD_EREG        PORTB   'LCD enable port
DEFINE  LCD_EBIT        3       'LCD enable bit
DEFINE  LCD_RSREG       PORTB   'LCD register select port
DEFINE  LCD_RSBIT       1       'LCD register select bit
DEFINE  LCD_RWREG       PORTB   'LCD register select port
DEFINE  LCD_RWBIT       2       'LCD register select bit
DEFINE  LCD_BITS        4       'LCD bus size 4 bit
DEFINE  LCD_LINES       2       'LCD number of lines
DEFINE  LCD_COMMANDUS   4000    'LCD command delay time µs
DEFINE  LCD_DATUS       250    'LCD data delay µs
' Define ADC parametri
DEFINE  ADC_BITS        10
DEFINE  ADC_CLOCK       3
DEFINE  ADC_SAMPLEUS    50
ADCON1 = 7

PAUSE 1600
'VARIABILI

'MOTORE1

VERDE1           VAR     PORTC.2 'pin 17 INDIETRO
ROSSO1           VAR     PORTC.1 'pin 16 AVANTI
GIALLO1          VAR     PORTC.0 'pin 15 ABILITA
'--------------------------------------------------
VERDE2           VAR     PORTA.5 'pin 4 INDIETRO2
ROSSO2           VAR     PORTA.3 'pin 5 AVANTI2
GIALLO2          VAR     PORTA.2 'pin 6 ABILITA2

'PULSANTI

ALLARGA1         VAR     PORTD.4 ' pin 27 tasto 4
RESTRINGE1       VAR     PORTD.5 ' pin 28 tasto 3
RESTRINGE2       VAR     PORTD.6 ' pin 29 tasto 2
ALLARGA2         VAR     PORTD.7 ' pin 30 tasto 1
'---------------------------------------------------
'INGRESSI   
FUP1             VAR     PORTD.1 'pin 20
FDW1             VAR     PORTD.0 'pin 19
FDW2             VAR     PORTE.2 'pin 10


grazie a chi mi risponde
da mars
#225
Se fai

TRIS PORT = 0

come risultato hai configurato i port come uscite.

Ma non hai stabilito alcun valore per i latch. E al POR i latch hanno contenuto casuale.

Per cui, dal momento del TRIS=0 fino a quando il programma non scrive qualcosa nel PORT, le uscite sono a livelli casuali.

Per non avere glitch sui pin occorre:
- prima caricare i latch con il valore voluto; es.0 per avere tutti i LED collegati tra pin e massa spenti o 1 per avere tutti i LED collegati tra pin e Vdd spenti o quanto altro vuoi per avere i carichi nella condizione di partenza
I pin sono ancora come ingressi (default al POR) e quindi ad alta impedenza e non influiscono sul carico collegato
- poi dare la direzione. Ora i pin passano alla direzione voluta e quelli in uscita riflettono lo stato dei latch, che, però, ora sono pre caricati con i valori voluti
Avatar utente
da nautiluso
#229
Mars..ti rigrazio della risposta, purtroppo non sono molto esperto di questi setting..
In pratica cosa dovrei scrivere per settare i latch in modo non casuale?
Sono istruzioni assembly, ho consultato il datasheet ma non ho trovato nulla (o io non sò cercare..)
Grazie molte per la pazienza

ciao

Nautiluso
da mars
#237
Non usando Basic, non saprei con esattezza. Ma suppongo che
PORTA = %valore_binario_voluto
PORTB = %valore_binario_voluto
PORTC = %valore_binario_voluto
PORTD = %valore_binario_voluto
PORTE = %valore_binario_voluto

dove valore_binario_voluto è lo stato dei bit che vuoi avere al momento dell' avvio del programma.
Ad esempio, se a PORTB hai collegato 8 LED tra pin e Vss e non li vuoi accesi fino ad un comando specifico, sarà
PORTB = %00000000
Se vuoi che all' accensione siano illuminati i primi 4 LED senza dare altro comando specifico
PORTB = %00001111
E così via

La direzione in /out e lo stato di un pin dipendono da due registri diversi: PORT e TRIS (che nei midrange si trovano allo stesso indirizzo, ma sue banchi diversi). Se imposti la direzione in uscita, immediatamente questa riflette lo stato del port relativo, che, se non hai inizializzato, è all'accensione casuale e durante il funzionamento l' ultimo valore caricato.
Ovvero: capitano assai spesso casi in cui gli I/O all' accensione non devono essere casuali perchè passa un certo tempo prima che il programma li vada a considerare. Quindi il comando di pin è sempre meglio sia
- dare un valore al port
- dare un valore al tris
Vendo

OWON HDS2202S nuovo imballo originale 190.00 eur[…]

Sono comuni interruttori a levetta DPDT. Se le due[…]

Visita il nostro canale telegram