Forum: Mikrocontroller und Digitale Elektronik UART receive interrupt beim PIC24FJ128.


von dom (Gast)


Lesenswert?

Hallo zusammen

Hat jemand den C-Code mitdem man auf einen Interrupt am UART1 RX Eingang 
reagieren kann? So wie bei Timer1 geht es so:

void __attribute__((_interrupt_, _shadow_)) _T1Interrupt(void)
{
/* Interrupt Service Routine code goes here */
IFS0bits.T1IF = 0;                       //Reset Timer1 interrupt flag

WATER_PULSE=!WATER_PULSE;                  // pulse water high/low 
generator (2.5kHz) (MOD 0030)

if(++prescaler_1ms_timer > 4)                // prescaler for 1ms Timer 
(MOD 0030)
  {
  prescaler_1ms_timer = 0;
  mSecDelayCounter--;
  if(elapsedCounter)elapsedCounter--;              // decrement mSec 
delay count


usw.


Vielen Dank

von Lehrmann M. (ubimbo)


Lesenswert?

Also ich such dir das jetzt mal nicht raus - ein gewisser Lerneffekt 
soll ja auch dabei sein. Grundsätzlich:

-Interrupts konfigurieren
-Interrupts anschalten

- in den C Compilern gibt es Funktionen für Low und High Interrupt. Wie 
genau die heißen kannst du dem Helpfile deines Compilers entnehemen 
(welchen verwendest du ?)

- in diesen Funktionen (für Low-Interrupt und High-Interrupt) musst du 
nun verifizieren welche Quelle den Interrupt ausgelöst hat. Dazu 
überprüfst du die Interrupt-Flags aller relevanten Quellen (kann auch 
nur eine sein)

- (Interrupts ausschalten) das evtl. auch schon früher in den Funktionen 
für Low-Interrupt und High-Interrupt. Man beachte das dies entfallen 
kann (Low-Interrupt)

- ISR (Interrupt Service Routine) also was passieren soll wenn der 
Interrupt ausgelöst wird. In deinem Fall Daten vom UART abholen. Wie das 
geht steht im Datenblatt oder du verwendest eine vorgefertigte Library.

- Interrupt-Flag wieder löschen !

- (Interrupts wieder freigeben)


So jetzt habe ich dir eine Anleitung hingeschmissen =) und du musst / 
willst daraus etwas sinnvolles produzieren. Ich weiss nicht wie fitt du 
bist und ob du nicht PIC Anfäger bist. Was ich dir sicherlich nicht 
sagen muss ist, dass du das Datenblatt studieren musst.

Ich kann dir auch nur ans Herz legen, nicht irgendwo Script-Kiddy zu 
spielen und dir einen Code klauen. So lernt man's nie richtig und das 
rächt sich später bzw. gleich bei der Fehlersuche.

Lerne es richtig! Bei allem nötigen Respekt, nichts für Ungut und nichts 
gegen deine Person: Ich glaube nicht, dass du den geposteten Code auch 
nur verstanden hast. Sei mir bitte nicht böse - ich weiß das nagt an 
einem aber man muss sich das eingestehen. Ich hab auch so angefangen 
aber ich habe die Kurve gekriegt und hab mich dann zwar zeitintensiv 
aber dennoch erfolgreich mit dem Thema beschäftigt.
Und so rate ich dir auch mit deinem Kenntnisstand zu handeln.

Ich wünsche dir viel Erfolg und wenn du Fragen hast kannst du dich auch 
gerne per Persönlicher Nachricht (musst angemeldet sein) oder an 
"kruszi[at]web.de" melden. Ich helfe dir gerne aber nur wenn du dich 
auch weiterbildest.

Gruß


Michael

PS: wenn du vor deinen C-Code "C" ohne Anführungszeichen dafür mit 
eckiger Klammer auf C und dann eckiger Klammer zu schreibst UND nach dem 
C-Code "/C" auch jeweils in eckigen Klammern dann wird dein Code nicht 
derart massakriert (unterstrichen, etc.)

von Dom (Gast)


Lesenswert?

Hallo

Ja selber raussuchen kann ich auch, aber danke für die ausführliche 
Info, wollte eigentlich ein Application Note von microchip und hoffte da 
hat es jemand schon und kann es nur schnell posten...

Wie wärs damit?
void __attribute__((_interrupt_, _shadow_)) _U1RXInterrupt(void)
  {
  /* Interrupt Service Routine code goes here */
  IFS0bits.U1RXIF = 0;
  }

Sollte funzen denke ich. Ich bin dir auch nicht böse, wie könnte ich 
nur... :-) Zum Code der da steht, den habe ich geschrieben plus die 
Elektronik Schema-Layout usw. habe ich auch gezeichnet, gerechnet usw... 
Der Timer Interrupt wird nämlich zur Wasserstandsüberwachung benutzt, 
denn 2.5kHz auf einem Stahldraht gegen einen Stahldraht der auf GND ist 
mit der entsprechenden Elektronik dazu (einige Dioden, Transi und R 
sowie C) kann man sehr einfach und vor allem günstig über einen ADC das 
Level detektieren, wobei es nur darum geht ob Wasser vorhanden ist oder 
nicht, damit der Boiler nicht abfackelt... So wie du siehst war ich 
einfach zu faul um mir die Application Note zu suchen...

Trotzdem danke & schönen Tag noch

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.