Sari la conținut
ELFORUM - Forumul electronistilor

Program basic PIC ptr aprins /stins LED


Postări Recomandate

Salut,

 

Am scris programul de mai jos in Basic pentru a aprinde si stinge un LED pe pinul RA1, prin intreruperi:

 

Dim x As Bit
Dim y As Byte
x = y.7
y.6 = 1

TRISA.1 = 0
TRISB = 0
PORTA.1 = 1

INTCON.INTF = 0
Dim t As Word
t = 100
WaitMs t
INTCON.INTF = 0

INTCON.INTE = 1

 

Enable

T1CON = 0x35
PIE1.TMR1IE = 0x1
INTCON.PEIE = 0x1
INTCON.GIE = 0x1


End

 

On Interrupt

 

Save System
Dim x As Bit
Dim y As Byte
x = y.7
y.6 = 1
TRISA.1 = 0
TRISB = 0
PORTA.1 = 0

INTCON.INTF = 0
Dim t As Word
t = 100
WaitMs t
INTCON.INTF = 0

Resume

 

 

Problema e ca il aprinde dar nu intra in intrerupere sa il stinga.

Daca cineva ma poate sfatui cum sa procedez as fi recunoscator.

 

Mersi,

Daniel

Editat de craciun
Link spre comentariu
  • Răspunsuri 25
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

L-am rezolvat cu:

 

PIR1.TMR1IF = 0x1
PIE1.TMR1IE = 0x1
T1CON = 0x35
INTCON.PEIE = 0x1
INTCON.GIE = 0x1


Acum vreau sa bucleze :)


L-am rezolvat:

 

 

Dim x As Bit
Dim y As Byte
x = y.7
y.6 = 1

loop: TRISA.1 = 0
TRISB = 0
PORTA.1 = 1

INTCON.INTF = 0
Dim t As Word
t = 10
WaitMs t
INTCON.INTF = 0

INTCON.INTE = 1

Enable
PIR1.TMR1IF = 0x1
PIE1.TMR1IE = 0x1
T1CON = 0x35
INTCON.PEIE = 0x1
INTCON.GIE = 0x1


Goto loop
End

 

On Interrupt

TRISA.1 = 0
TRISB = 0
PORTA.1 = 0

PIR1.TMR1IF = 0x0

Resume

 

 

 

Multumesc tuturor ptr sfaturi.

Link spre comentariu

Dupa sintaxa pare a fi scris in PIC Simulator IDE

 

Corect asa ar trebui sa arate:

AllDigital

Config PORTA = Output
Config PORTB = Output
PORTA = 0  'start with all outputs Low
PORTB = 0  'start with all outputs Low

'timer1 registers prescaler= 8 - tmr1 preset = 3036
'freq = 2.00 hz - period = 0.500000 seconds
T1CON.T1CKPS1 = 1  'bits 5-4  Prescaler Rate Select bits
T1CON.T1CKPS0 = 1  'Bit 4
T1CON.T1OSCEN = 1  'Bit 3 timer1 oscillator Enable control Bit 1 = On
'T1CON.t1sync = 1  'Bit 2 Timer1 External Clock Input Synchronization Control Bit...1 = Do Not synchronize external clock Input
T1CON.TMR1CS = 0  'Bit 1 timer1 clock source Select Bit...0 = internal clock(fosc / 4)
T1CON.TMR1ON = 1  'Bit 0 enables timer
TMR1H = 11  'preset For timer1 msb register
TMR1L = 220  'preset For timer1 LSB register


'Interrupt Registers
INTCON = 0  'clear the interrpt control register
INTCON.T0IE = 0  'bit5 TMR0 overflow Interrupt Enable Bit...0 = disables the TMR0 Interrupt
PIR1.TMR1IF = 0  'clear timer1 interupt flag TMR1IF
PIE1.TMR1IE = 1  'Enable Timer1 interrupts
INTCON.T0IF = 0  'bit2 clear timer 0 Interrupt flag
INTCON.GIE = 1  'bit7 global Interrupt Enable
INTCON.PEIE = 1  'bit6 Peripheral Interrupt Enable Bit...1 = Enables all unmasked peripheral interrupts



loop:
Goto loop

End                                               

On Interrupt  'interrupt routine
Save System

PORTA.1 = Not PORTA.1
PIR1.TMR1IF = 0  'Interrupt must be cleared by software
PIE1.TMR1IE = 1  'reenable the Interrupt

Resume  
Editat de Kreator
Link spre comentariu

Salut,

Programul este scris cu compilatorul Basic din mediul integrat OSHONSOFT IDE versiunea 7.31

Functioneaza si cu delay in intrerupere.

Am mai adaugat in intrerupere inca o linie , si am eliminat primele linii care erau dintr-un exemplu.

Acum functioneaza foarte bine:

 

loop: TRISA.1 = 0
TRISB = 0
PORTA.1 = 1

Dim t As Word
t = 30
WaitMs t

INTCON.INTE = 1

Enable
PIR1.TMR1IF = 0x1
PIE1.TMR1IE = 0x1
T1CON = 0x35
INTCON.PEIE = 0x1
INTCON.GIE = 0x1

Goto loop
End

 

On Interrupt

TRISA.1 = 0
TRISB = 0
PORTA.1 = 0
t = 100
WaitMs t

PIR1.TMR1IF = 0x0
PIE1.TMR1IE = 0x1
Resume

 

 

 

Mentionez ca acesta e al doilea program scris de mine vreodata in Basic, dupa niste exemple din manualul compilatorului online.

Stiu ca se poate optimiza mult mai mult dar eu am vrut doar sa vad ca PIC-ul intra in intrerupere si se intoarce in programul principal, in scop didactic.

Mediul IDE il gasiti la http://www.oshonsoft.com/

 

 

Succes

Editat de craciun
Link spre comentariu

Salut!

 

De obicei in loop nu se pune nimic.

Tot ceea ce ai scris in loop sunt declaratii care trebuie facute o singura data, la inceputul programului.

Sfat: In intrerupere nu folosi niciodata wait delay sau alte functii mari consumatoare de timp deoarece daca depaseste durata intruperii apar disfunctionalitati in executia programului.

 

Succes!

 

LE

Si eu tot cu programul asta am inceput!

Editat de Kreator
Link spre comentariu

Ba da, ca si caz general, dar in cazul nostru instructiunile care trebuie sa se repete se scriu in cadrul procedurii interrupt, (iar executia lor nu trebuie sa depaseasca perioada stabilita pt TMR1) si se vor executa de fiecare data cand se produce aceasta.

loop->goto loop nu face altceva decat tine MCU treaz sa sesizeze producerea intreruperii. Declaratiile (TRISA.1 = 0, TRISB = 0, PORTA.1 = 1 etc) le faci o singura data, la inceputul programului, daca le pui in bucla ele se vor executa la infinit, ca in cazul tau.

E ca la autoturism: nu pui contactul si pornesti motorul decat la inceput (sau cand iti moare motorul) nu de fiecare data cand opresti masina la semafor (dar mai sunt unii care fac si asa).

Editat de Kreator
Link spre comentariu

Asta e ultima varianta functionala cu intrerupere data de expirarea lui TMR1 , ce era inainte il forta pe TMR1 sa dea intrerupere:

 

loop: TRISA.1 = 0
TRISB = 0
PORTA.1 = 1

Dim t As Word
t = 10
WaitMs t

INTCON.INTE = 1
Enable
PIR1.TMR1IF = 0x0
PIE1.TMR1IE = 0x1
T1CON = 0x35
INTCON.PEIE = 0x1
INTCON.GIE = 0x1

Goto loop
End

 

On Interrupt

TRISA.1 = 0
TRISB = 0
PORTA.1 = PORTA.1 Xor PORTA.1

PIR1.TMR1IF = 0x0
PIE1.TMR1IE = 0x1
Resume

 

@Kreator cum ziceam mai sus , daca scriu loop si gotoloop una dupa alta nu cred ca mai intra in intrerupere...daca ai mediul as avea rugamintea sa scrii un programel cu loop gotoloop si o intrerupere si sa il rulezi sa vezi exact ce si cum, eu nu imi dau seama de ce nu intra in intrerupere scrise asa...

Editat de craciun
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări