Sari la conținut
ELFORUM - Forumul electronistilor

Am creierul zdrobit!


Vizitator ionaspa

Postări Recomandate

Vizitator ionaspa

#include <pic.h>#include <stdio.h>#define LOAD_L 0x0B#define LOAD_H 0xFFunsigned int msec;void initializare_timer1(void){	RP1=0;	RP0=0;	T1CON=0x00;	TMR1H=LOAD_H;	TMR1L=LOAD_L;        RP1=0;	RP0=1;	       TMR1IE=1;	//TMR1IF=0;	GIE=1;}void interrupt timer(void)//wait for 1ms  {	if(TMR1IF)	{		TMR1H=LOAD_H;		TMR1L=LOAD_L;		msec++;				if(msec==1000)		{  			if(RB5)				RB5=0;			else				RB5=1;					        msec=0;		}		TMR1IF=0;	}}void main(void){	msec=0;	TXSTA=0x00;	SPBRG=31;	initializare_timer1();		RP1=0;	RP0=0;	TMR1ON=1;   //0 InitUSART();	TRISB=0x00;	RB5=1;	INTCON=0xA0;	while(1)	{		RP1=0;		RP0=0;		printf("izatech");		}}

In codul de mai sus am incercat sa aprind si sa sting un led legat la pinul RB5 al microcontrolerului PIC 16F877A utilizand intreruperea de timer1. Problema e ca rutina care trateaza intreruperea nu se executa niciodata, desi flagul asociat intreruperii se activeaza la fiecare depasire a timerului, iar flagul pentru validarea software a intreruperii respective este setat pe 1.

O alta problema este cu comunicatia seriala pe care am setat-o la 9600 si nu merge. Mi-ar fi de real folos daca m-ati ajuta cu aceste probleme, eventual sa-mi explicati mai multe despre sistemul de intreruperi al PIC-ului (timer 0-2 si intreruperea externa in special).

 

Multumesc frumos!

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Cristiano

    1

  • cirip

    1

Top autori în acest subiect

Poti sa postezi listingul asm care rezulta in urma compilarii? Asa din C pare OK, desi ar putea fi particularitati ale compilatorului de care nu-mi dau seama. Eu lucrez cu picii numai in asm. De ex, pozitioneaza corect rutina de intrerupere la adr 4? De unde stii ca nu ajunge la intrerupere? pe ce rulezi? Simulator, emulator?Cirip

Link spre comentariu

Legat de intreruperea pentru TMR1, ai uitat sa setezi PEIE:

PEIE: Peripheral Interrupt Enable bit1 = Enables all unmasked peripheral interrupts0 = Disables all peripheral interrupts

Legat de comunicatia seriala, ai uitat mai multe configurari:

When setting up an Asynchronous Transmission,follow these steps:1. Initialize the SPBRG register for the appropriatebaud rate. If a high-speed baud rate is desired,set bit BRGH (Section 10.1 ?USART BaudRate Generator (BRG)?).2. Enable the asynchronous serial port by clearingbit SYNC and setting bit SPEN.3. If interrupts are desired, then set enable bit TXIE.4. If 9-bit transmission is desired, then set transmitbit TX9.5. Enable the transmission by setting bit TXEN,which will also set bit TXIF.6. If 9-bit transmission is selected, the ninth bitshould be loaded in bit TX9D.7. Load data to the TXREG register (startstransmission).8. If using interrupts, ensure that GIE and PEIE(bits 7 and 6) of the INTCON register are set.

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