FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc
Interrupt e timer0 con mikrobasic
Autore
Messaggio
opzioni
fabio1977
postato il: 23.11.2018, alle ore 17:47
Interrupt e timer0 con mikrobasic
Salve!sto impazzendo per far funzionare il timer 0 con interrupt sul pic 16f 876.uso il mikrobasic.
Ho scaricato il programma timer calculator ma non capisco come farlo funzionare!
Qualcuno mi può scrivere due righe di programma per capire perche non mi funziona!grazie!
fabio1977
postato il: 23.11.2018, alle ore 18:34
Il programma è il seguente:
'Timer0
'Prescaler 1:128 TMR0 PRELOAD =61 actual interrupt time=24,96 ms
Sub procedure inittimer( )
OPTION_REG =0X86
TMR0 =61
INTCON =0XA0
end sub
Sub procedure interrupt( )
If (TMR0IF_BIT) THEN
TMR0IF_BIT =0
TMR0 =61
PORTC=NOT PORTC
end sub
Portc=0
Trisc=0
Main:
inittimer( )
While true
Interrupt ( )
Wend
end.
I led della porta c non si accendono mai.aiuto!
Qual è l errore?
Per vedere ad occhio lampeggiare i LEDs come massimo lo puoi fare a 5 Hz.
Non sapendo a che frequenza ha messo il micro, cominciamo a tirare supposte (le idee) e cominciamo a definire che al meglio che che si ottiene, con 4 MHz di clock, 15.26 Hz. Molto difficile che si possa vedere, ma considerando che la frequenza si dimezza dal fatto che con un interrupt lo accendi e con uno lo spegni. Appena percettibile ad occhio.
Allora se si vuole una cadenza di lampeggio più lenta ti serve almeno un contatore che determina quando fare una accensione o uno spegnimento.
Di fatto sta che anche provando questo codice
program MyProject
const tmrset = 99 \' interrupt every 10 mS
Dim zeroX as Byte \' signalize a second is over
Dim ticks As Byte \' 10 msec counter
sub procedure ISR() iv 0x0004 ics ICS_AUTO
if INTCON.TMR0IF = 1 then \' the timer0 overflowed ?
INTCON.TMR0IF = 0
TMR0 = tmrset \' then reload its count
If ticks < 101 Then \' when the count reach 100, it\'s reset to zero
Inc(ticks) \' else it\'ll increase
Else
ticks = 0 \' reset
zeroX = 1 \' it records that one second is past
End If
End If
end sub
main:
OPTION_REG = 5 \' could be 0x85 if using Pullup on PORTB
PORTC = 0
TRISA = 0
TRISB = 0
TRISC = 0
INTCON.TMR0IE = 1
INTCON.GIE = 1 \' General interrupt ON, accepting interrupts
While 1 = 1 \' never-ending loop
If zeroX = true Then
PORTC = NOT PORTC
zeroX = false
End If
Wend
end.
Il debugger di mikrobasic e anche un altro, non si vede il Timer0 contare. Che dovrebbe apparire un incremento dopo 64 cicli macchina.
Ho provato con il ProtonBasic e funziona come ci si aspetta lo faccia. Lo puoi comodamente usa nella versione FREE che compila correttamente per il 16F876 senza limiti come quelli di mikrobasic.
Questo per dire che non mi sembra che mikrobasic faccia le cose a modo. Vedendo nel suo listato in assembler, non ho visto niente che tenesse conto il passaggio da PORTn a TRISn, che sono in banchi diversi.
Qual è l errore?
Mi sembra che il basic scelto non fa il suo lavoro.[/quote]
program BlinkAPort
const tmrset = 99 ' interrupt every 10 mS
Dim zeroX as Byte ' signalize a second is over (questo lo vorrei convertire in bit)
Dim ticks As Byte ' 10 msec counter
sub procedure interrupt
if INTCON.TMR0IF = 1 then ' the timer0 overflowed ?
INTCON.TMR0IF = 0
TMR0 = tmrset ' then reload its count
If ticks < 101 Then ' when the count reach 100, it's reset to zero
Inc(ticks) ' else it'll increase
Else
ticks = 0 ' reset
zeroX = 1 ' it records that one second is past
End If
End If
end sub
main:
OPTION_REG = 5 ' could be 0x85 if using Pullup on PORTB
PORTC = 0
TRISA = 0
TRISB = 0
TRISC = 0
INTCON.TMR0IE = 1
INTCON.GIE = 1 ' General interrupt ON, accepting interrupts
While 1 = 1 ' never-ending loop
If zeroX Then
PORTC = NOT PORTC
zeroX = 0
End If
Wend
end.
Faccio notare solo che con la condizione "If zeroX = true Then" non da risultato booleano vero. Mi riserbo di studiare come si può utilizzare i singoli bit, di una variabile. O quanto meno dare un nome.
Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675
postato il: 26.11.2018, alle ore 02:55
PS, ho scoperto come si nominano i bit.
Dim flags as Byte ' set a byte to hold 8 flags
Dim zeroX as sbit at flags.0
Dim notest as sbit at flags.1
Con il vantaggio di salvare qualche ciclo macchina, usando i comandi in assembler specifici.
Anno nuovo, forum nuovo.
Mi sa che lascio.
fabio1977
postato il: 26.11.2018, alle ore 09:38
Ecco l importanza di conoscre altri linguaggi tipo mikroC e assembler!grazie
picmicro675
postato il: 26.11.2018, alle ore 14:12
Il mikroC ha una certa attinenza con il mikrobasic. Ma anche in generale la diversità dei due linguaggi è lieve.
Il C segna la fine di una istruzione con punto e virgola, ma non il basic. Le istruzioni di comparazione sono racchiuse tra parentesi, ma il basic ne fa meno uso. Il C usa le parentesi graffe per racchiudere dei blocchi di istruzioni mentre il basic usa delle parole chiave, tipo IF-THEN-ELSE, SELECT-CASE-END SELECT, DO-WHILE, WHILE-WEND.
Però la logica di programmazione rimane uguale, quindi è la chiave di realizzazione dei programmi.
Alla fine è importante tenere a bada le funzioni disponibili per il micro-controllore che si sta usando, per questo consultare i fogli dati è la routine più frequente. Un po meno per arducoso, il quale offre molte librerie che offuscano (o alleviano) l' accesso diretto al micro.
Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito