home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
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?
picmicro675




una ogni 10 livelli


postato il:
24.11.2018, alle ore 17:51

Il calcolatore dei timer lo trovi a http://eng-serve.com/pic/pic_timer.html

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.

Sto ancora cercando di capire perché il timer0 non conta. Comunque non serve chiamare la routine di interrupt perché deve avvenire da un evento dell\' hardware. Consigliato leggere i fogli dati ( DS30292B-page 47) , sia per il timer0 che per gli interrupt.

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.

Altro basic, che merita una nota è il Great Cow Basic, FREE
http://gcbasic.sourceforge.net/Typesetter/index.php/Home

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]




Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
26.11.2018, alle ore 02:40
Mi ha proprio colpito il perché non funzionasse quel programma. Ho investigato e per curiosità ho convertito il programma qui sopra in mikroC. Con grande sorpresa funziona!!!
Allora ho ripreso quel programma e riprovato a compilare. Guardando entrambe i risultati del C e del basic, ho scoperto le differenze in assembler . Adesso non sto ad evidenziarle, vedi questo sorgente in MikroBasic che funziona.
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




una ogni 10 livelli


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




una ogni 10 livelli


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.



Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

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




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale