Forum: Mikrocontroller und Digitale Elektronik PIC16C74 Interruptproblem?


von Kurt (Gast)


Lesenswert?

Hallo!

Habe beim Programmieren des PIC 16C74 ein Problem mit der 
Interruptroutine. Die Parameter des PICs sind so eingestellt, dass die 
ISR bei einer Änderung an Port B durchlaufen wird. Ich habe nun ein 10Hz 
Signal an PIN_B1 angehängt. Mein Problem ist nun, das die ISR nicht 
nicht durchlaufen wird und fdd immer 0 ist.
Das 10 Hz Rechtecksignal an PIN_B1 habe ich mit dem Oszi überprüft und 
hat die Zustände 0.1V und 4.8V.

Kann mir jemand weiterhelfen?
Kurt

Programm(Im PCW PIC C Compiler geschrieben):

//globale Variablen, damit die ISR auch zugreifen kann
unsigned int fa=0, fb=0, fc=0, faa=0, fbb=0, fcc=0, fdd=0, br=0, xa=0, 
xb=0, xc=0, xd=0, xaa=0, xbb=0, xcc=0, xdd=0;

#include <INTERRU2.H>

#int_rb

rb_isr()
{

   xa=input( PIN_B2 );
   xb=input( PIN_B3 );
   xc=input( PIN_B5 );
   xd=input( PIN_B1 );
   br=input( PIN_B6 );

   if(xd!=xdd)
   {
   xdd=xd;
   fdd++;
   }


}


main()
{

  setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  setup_port_a(ALL_ANALOG);
  setup_adc(ADC_CLOCK_INTERNAL);
  port_b_pullups(0);
  enable_interrupts(RB_CHANGE);
  enable_interrupts(GLOBAL);

  while(1)
     {
  delay_ms(250);
     //..Ausgabe von fdd über das Display..
  }
}

von Stark Erhard (Gast)


Lesenswert?

Hast du die Hauptfreigabe für Interrupts freigegeben?
Beim 16F84 z.B. ist es im INTCON-Register Bit7 (GIE).
Ist dieses Bit gelöscht, werden keine Interrupts ausgeführt.

von Kurt (Gast)


Lesenswert?

Ja, das müsste mit dem Befehl "enable_interrupts(GLOBAL);

" erfolgen....

von Kurt (Gast)


Lesenswert?

Ich habe noch am PIN_B6 einen Schalter dranhängen, und wenn ich diesen 
betätige, wird die ISR problemlos durchlaufen. Aber der 10Hz Rechteck an 
PIN_B1 löst keinen Start der ISR aus....
Wie ist das zu erklären?

von Stark Erhard (Gast)


Lesenswert?

Wenn du mal probeweise versuchen würdest, das 10kHz-Signal an Pin_B6 
anzulegen, um zu sehen, was passiert.
Oder du legst an Pin_B1 den Taster an, um zu sehen, ob das Register 
"mechanisch" hochzählt.
Der Pin_B1 ist schon auf Eingang eingestellt,oder? (Entschuldige, aber 
ich beherrsche nur Assembler und kein C)
Hast du schon einen anderen 16C74 dazu benutzt, könnte ja sein, daß 
dieser Pin defekt ist.

von Kurt (Gast)


Lesenswert?

PIN_B0 bis PIN_B7 sind als Eingänge definiert.

Ich habe jetzt alle Pins mit dem Schalter durchgetestet.
Es haben alle Anschlüsse ausser PIN_B0, PIN_B1, PIN_B2 funktioniert.

Ich kann mir nicht vorstellen, dass die Pin defekt sind(verwende 2 
16C74, bei beiden das gleiche Verhalten).

Komisch??

von Florian S. (Gast)


Lesenswert?

Ihr solltet beachten, das
- der Port-B-"Änderungs"-Interrupt nur für Port B4-B7 zuständig ist. Bei 
Änderungen an B0, B1, B2 und B3, wird also die ISR NICHT durchlaufen!!!
- Port B0 der "Ext."-Interrupteingang ist.

Gruß Flo

von Kurt (Gast)


Lesenswert?

Habe jetzt die Interruptquellen auf die PINs B4 bis B7 angehängt, jetzt 
funktioniert es einwandfrei. Danke für die Hilfe!

cu Kurt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.