Forum: Mikrocontroller und Digitale Elektronik Kann nicht Interrupt auslosen mit Timer4 und Timer5


von ivan (Gast)


Lesenswert?

Ich will eine Steuerung bauen für das Einschalten bzw Ausschalten der 
Heizung in der Wohnung, ueber MOD-GSM(also SMS Versand und 
Auswertung).Dazu  habe ich Olimex Platine mit Pi32MX220(40MHZ ->Fosc), 
programmiere in C mit Pinguino IDE version x.4. Ich habe aus der 
Dokumentation von Microchip rausgelesen, dass  die Timer4 und Timer5 
kann man zusammen schalten und daraus ein 32 Bit Timer bauen, ich will 
mit dem Timer45 ein Interrupt auslosen, das  hat schon mal nicht 
funktioniert. Keine Ahnung warum hier ist mein C Code:
1
/*----------------------------------------------------- 
2
Author:  --<Ivan>
3
Date: Sat Sep 14 16:12:03 2013
4
Description:
5
6
-----------------------------------------------------*/
7
#define K 7
8
  //First Definition
9
void __attribute__ ((nomips16)) ISR_wrapper_vector_20(void) __attribute__ ((section (".vector_20")));
10
// Put the ISR_wrapper in the good place
11
12
//Second Definition
13
void __attribute__ ((nomips16))  Tmr5Interrupt(void) __attribute__ ((interrupt));
14
// Tmr1Interrupt is declared as an interrupt routine
15
16
//Third Definition
17
void __attribute__ ((nomips16)) ISR_wrapper_vector_20(void) { Tmr5Interrupt(); }
18
// ISR_wrapper will call the Tmr1Interrupt()
19
20
// define here the code to execute when an interrupt occure
21
void  __attribute__ ((nomips16))  Tmr5Interrupt(void) 
22
   {
23
      
24
        digitalWrite(K,HIGH);
25
   
26
        init_timer45();
27
}
28
   
29
void init_timer45(void)
30
  {
31
    
32
    T4CON=0x0;      // Stop timer 4
33
    T5CON=0x0;      // Stop timer 5
34
    T4CONSET=0x0008;      // Enable  32 Bit mode pescaler 1:1,
35
                          // Internal clock source
36
                          
37
    TMR4=0x0;        // Clear contents of the timer 4 and timer 5
38
  
39
    PR4=0xDC3CBA00;      // Load PR4 and PR5 with 32 Bit value
40
  
41
    IPC5SET=0x00000004;    // Set priority level 1
42
    IPC5SET=0x00000001;    // Set sub priority level 1
43
    IFS0CLR=0x00100000;    // clear the timer 5 interrupt status flag
44
    IEC0SET=0x00100000;    // enable timer 5 interrupt
45
    T4CONSET=0x8000;        //Start the timer 
46
    
47
  }
48
49
void setup() {
50
    //run once:
51
    pinMode(K, OUTPUT);
52
    
53
    init_timer45();
54
    }
55
56
void loop() {
57
    //run repeatedly:
58
    //digitalWrite(K,HIGH);
59
    }
Definitiv habe ich irgendwo ein oder mehrere Fehlern, nach meinen 
Berechnungen soll Interrupt nach ca. 60 sec Portausgang K auf High 
setzen, ist aber nicht der Fall. Danke für die Hilfe.

von Thomas (Gast)


Lesenswert?

Probiere ohne (nomips16)

von Ivan (Gast)


Lesenswert?

Ich werde es heute nach der Arbeit probieren.
Danke

von ivan (Gast)


Lesenswert?

@Thomas
Nein hat nicht geholfen ich glaube es ligt an der Interrupt Vector 
definition! Kennt sich jemand aus mit dem kalkulieren der Vectornummer 
für Pic32, danke

von Peter D. (peda)


Lesenswert?

Zu einem Compiler gibt es meistens auch ein Verzeichnis mit Beispielen, 
die sollten eigentlich laufen.
Und wenn man die verstanden hat, kann man davon ausgehend seinen eigenen 
Code schreiben.
Nur planlos rumraten bringt allgemein garnichts.

Ich würde auch nicht gleich mit nem 32Bit-Boliden anfangen, sondern nem 
kleinen 8Bitter.
Die 40MHz sind für ne Heizungssteuerung etwa 1000-fach zu schnell.

von Ivan (Gast)


Lesenswert?

@Peter
Danke für den vorschlag, ich habe leider schon die platine vom olimex 
da, mit pic32mx, gerade die neue interrupt beispiele lassen sich nicht 
mit pinguino ide übersetzen.
Um das ganze langsammer zu machen wollte ich die timer4 und timer5 
zusammen schalten, damit ich auf 2^32 - 1, also ein 8byte wert in 
timer45 setzen kann.
Leider wird die interrupt routine nicht ausgelost, led leuchtet nicht. 
Also weiss ich nicht woran es liegen kann, aber danke für die 
rückmeldung.

von Peter D. (peda)


Lesenswert?

Ivan schrieb:
> gerade die neue interrupt beispiele lassen sich nicht
> mit pinguino ide übersetzen.

Du brauchst natürlich solche Beispiele, die zu Deiner Toolchain passen.
Ansonsten schmeiß die Toolchain weg und nimm eine passende.

von Ivan (Gast)


Lesenswert?

@Peter
ich finde kein beispiel wo ich zwei timer 2 und 3 bzw. 4 und 5 zu einem 
schalte und dann mit timer23 bzw. timer45 interrupt auslose. In meiner 
anwendung möchte ich die zwei priorisierten interrupts laufen lassen den 
1 interrupt fürs abholen der sms und den zweiten zum steuern der 
portsausgänge und zeitberechnung. Das abholen der sms funktioniert 
bereits, aber wenn ich dazu timer45 nehme, dann geht es nicht mehr. 
Interrupt wird nicht durch timer45 ausgelost. Keine ahnung warum? Werde 
dankbar für jeden hinweis.

von Chris B. (dekatz)


Lesenswert?

Die Initialisierung für Timer45 ist in Ordnung.

Ob die Initialisierung von der IPC, IFS und IEC Register OK ist habe ich 
nicht überprüft, wie auch die Interruptroutinen selbst - ziemlicher 
Aufwand um einen Timerinterrupt zu Händeln ( ich verwende MPLAB/MPLABX 
und dem C32/CX32 - da gibt es aussagekräftige Funktionen bzw. Macros 
dafür)
z.B.
void __ISR(_TIMER_1_VECTOR, IPL5SOFT) Timer1Handler(void)
{
    mT1ClearIntFlag();
    LATBINV = 0x00008000;       //Ausgangssignal für Testzwecke erzeugen
}
macht genau das was du machst - nur eben Timer1, Priority=5 und ein 
anderer Pin für die LED.

btw: Warum Initialisierts du in der Interruptroutine jedesmal Timer45 
aufs neue?? Das Löschen des entsprechenden Interruptflags reicht völlig.

von Peter D. (peda)


Lesenswert?

Ivan schrieb:
> ich finde kein beispiel wo ich zwei timer 2 und 3 bzw. 4 und 5 zu einem
> schalte und dann mit timer23 bzw. timer45 interrupt auslose.

Dann nimm doch erstmal ein Beispiel für einen Timer und bring das zum 
Laufen.
Du kannst dann im Interrupt einfach eine Variable hochzählen.
Man muß nicht alle Features nehmen, nur weil sie möglich sind.

Ich bin mir aber sicher, im Datenblatt werden die Unterschiede 
beschrieben sein, so viele können das ja nicht sein.

von Ivan (Gast)


Lesenswert?

@Chris
Hallo und danke zuerst für den hiweis, ich werde heute abend 
MPLAB/MPLABX
und den compiler C32/CX32 ausprobieren, vielleicht bringe ich es zum 
laufen mit diesem tool. Ich fand das pinguino ide ziemlich komfortabel, 
aber alles hat sein preis.
Warum ich timer45 neu initialisiere? Hm, ich war schon ziemlich 
verzweifelt, und dachte, wenn es nicht beim ersten durchlauf klappt dann 
... , also war nicht sicher ob der timer4 und timer5 laufen, habe kein 
simulator oder so was.
Ich probiere heute den neuen weg und melde mich noch mal. Danke!!!

von Chris B. (dekatz)


Lesenswert?

Es genügt MPLABX und der XC32 weil MPLAB und C32 nicht mehr von 
MICROCHIP aktualisiert werden!!

von Ivan (Gast)


Lesenswert?

@Chris
Gibt es auch für linux? Habe kein Windows leider :)

von Chris B. (dekatz)


Lesenswert?

MPLABX und XC32 auch für Linux !!

von Ivan (Gast)


Lesenswert?

@Chris
Vielen dank, ich melde mich heute abend mit dem ergebnis

von ivan (Gast)


Lesenswert?

@Chris
Habe schon MPLAB X c32 installiert, muss noch mich einarbeiten, mal 
sehen

von Ivan (Gast)


Lesenswert?

Habe so ein programm geschrieben bzw. angepasst und aufgespielt auf 
PIC32 MX220 mit MPLAB X
1
#include <plib.h>
2
3
4
5
main()
6
{
7
    mPORTCClearBits(BIT_7);           //Clear bits to ensure the LED is off.
8
    mPORTCSetPinsDigitalOut(BIT_7);   //Set port as output
9
10
   
11
 int j;
12
13
    while(1)    
14
    {
15
        j = 100000;
16
        mPORTCToggleBits(BIT_7);      //Toggle light status. 
17
        while(j--) {}                 //Kill time.
18
    }
19
}
Es funzt nicht led ist off?
Woran kann es liegen, ist die platine schon hinüber?
Danke

von Ivan (Gast)


Lesenswert?

OK, habe fehler gefunden PGM und PGD verwechselt
Sorry!

von Ivan (Gast)


Lesenswert?

Hier ist mein C Code:
1
#include <plib.h>
2
#include <stdio.h>
3
4
5
void __ISR(_TIMER_45_VECTOR, IPL5SOFT) Timer45Handler(void) //Priority=5
6
{
7
    mT45ClearIntFlag();
8
    mPORTCClearBits(BIT_6);
9
}
10
void init_timer45(void)
11
  {
12
    INTEnableSystemMultiVectoredInt();
13
    T4CON = 0x0; // Stop 16-bit Timer4 and clear control register
14
    T5CON = 0x0; // Stop 16-bit Timer5 and clear control register
15
    T4CONSET = 0x0008; // Enable 32-bit mode, prescaler at 1:1,     // internal clock source
16
    TMR4 = 0x0; // Clear contents of the TMR4 and TMR5
17
    PR4 = 0xFFFFFF00;//0xDC3CBA00; // Load PR4 and PR5 registers with 32-bit value
18
    IPC5SET = 0x00000006; // Set priority level = 6
19
    IPC5SET = 0x00000003; // Set sub-priority level = 3
20
    IFS0CLR = 0x00100000; // Clear the Timer5 interrupt status flag
21
    IEC0SET = 0x00100000; // Enable Timer5 interrupts
22
    T4CONSET = 0x8000; // Start timer
23
24
  }
25
main()
26
{   
27
    mPORTCClearBits(BIT_7);           //Clear bits to ensure the LED is off.
28
    mPORTCSetPinsDigitalOut(BIT_7);   //Set port as output
29
    mPORTCClearBits(BIT_6);           //Clear bits to ensure the LED is off.
30
    mPORTCSetPinsDigitalOut(BIT_6);   //Set port as output
31
    PORTCbits.RC6 = 1;
32
    //mPORTCClearBits(BIT_6);
33
    
34
    init_timer45();
35
 int j;
36
37
    while(1)
38
    {
39
        j = 100000;
40
        mPORTCToggleBits(BIT_7);      //Toggle light status.
41
        while(j--) {}                 //Kill time.
42
    }
43
}

Warum wird Interrupt nicht ausgelost? Kann jemand helfen, danke?

von Chris B. (dekatz)


Lesenswert?

.....PR4 = 0xFFFFFF00;
Keine Ahnung wie der Controller konfiguriert ist, aber wenn der mit FRC 
8MHz Takt läuft PBCLK 1:1 ist, dann dauert es 4294967040 * 0,125µs bis 
der Interrupt ausgelöst wird..das sind 536 Sekunden bzw. 9 Minuten

Und das hier:

void __ISR(_TIMER_45_VECTOR, IPL5SOFT) Timer45Handler(void) //Priority=5
....
IPC5SET = 0x00000006; // Set priority level = 6

passt auch nicht so recht zusammen - entweder 5 oder 6 !

von Ivan (Gast)


Lesenswert?

@Chris
Danke für die antwort, war schon zu spät wo ich das ganze zusammen 
geschrieben habe, konzentration war ganz unten. Ja, den fehler sehe ich 
auch, kann erst heute abend neu ausprobieren.
Habe noch eine frage Chris, da mein englisch nicht so gut ist, wie muss 
man richtig den IPLX für irgendein timer wählen, bin mit der tabelle von 
microchip nicht klar gekommen. Wenn du mir das kurz erklären kannst wäre 
schön.
Danke.

von Chris B. (dekatz)


Lesenswert?

IPLx{mode} legt fest auf welche Weise die Register bei Einsprung in die 
Interruptroutine gesichert werden.

IPLxSOFT: Sichert/Wiederherstellung die Register mit PUSH/POP Befehle 
auf den Stack - langsamste Methode

IPLxSRS: Sicher die Register in ein "Shadow Register Set" mit einem 
einzigen Befehl - schnellste Methode, da es aber nur 1 solches 
Registerset gibt (ev. gibt es mehrere, aber da müsste ich erst 
nachsehen!?) kann darüber nicht x-beliebig verfügt werden.

IPLxAUTO: erzeugt zusätzlichen Code welcher vor der Registersicherung 
testet, ob SOFT oder SRS verwendet werden kann/muss.

IPLx{mode} kann man auch weglassen, dann wird AUTO angenommen.

(nur so im Groben, wies exakt funkteoniert habe ich auch nicht im 
Kopf..ist im XC32-Compiler manual genauer beschrieben)

Das "x" in IPLx{mode}...musst du selbst entscheiden wie wichtig, 
dringlich, etc.  dein Timerinterrupt gegüber anderen Interruptquellen 
ist.
Muss dann aber mit den Einstellungen in den IPCx Registern 
übereinstimmen!

: Bearbeitet durch User
von Ivan (Gast)


Lesenswert?

@Chris
Danke, ich werde es heute abend ausprobieren.

von Ivan (Gast)


Lesenswert?

Also mit interrupts bin ich klar gekommen.
Habe aber ein problem mit UART schnittstelle, hier ist mein programm in 
C,
1
#include <stdio.h>
2
#include <string.h>
3
#include <p32xxxx.h>
4
#include <plib.h>
5
6
7
// Config Bits
8
#pragma config FNOSC = FRCPLL       // Internal Fast RC oscillator (8 MHz) w/ PLL
9
#pragma config FPLLIDIV = DIV_2     // Divide FRC before PLL (now 4 MHz)
10
#pragma config FPLLMUL = MUL_20     // PLL Multiply (now 80 MHz)
11
#pragma config FPLLODIV = DIV_2     // Divide After PLL (now 40 MHz)
12
                                    // see figure 8.1 in datasheet for more info
13
#pragma config FWDTEN = OFF         // Watchdog Timer Disabled
14
#pragma config ICESEL = ICS_PGx1    // ICE/ICD Comm Channel Select (pins 4,5)
15
#pragma config JTAGEN = OFF         // Disable JTAG
16
#pragma config FSOSCEN = OFF        // Disable Secondary Oscillator
17
18
19
 // Defines
20
#define SYSCLK 40000000L
21
22
23
 #define DESIRED_BAUDRATE     115200
24
25
26
 void WriteString(const char *string);
27
 int x = 1000000;
28
 char buffer[100];
29
30
int main(void)
31
 {
32
                 mPORTCClearBits(BIT_7);                            // Turn off RA7 on startup.
33
                 mPORTCSetPinsDigitalOut(BIT_7);           // Make RA7 as output.
34
35
 UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
36
     UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
37
     UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
38
     UARTSetDataRate(UART2, SYSCLK, DESIRED_BAUDRATE);
39
     UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
40
41
// Turn ECHO OFF
42
WriteString("ATE0\r\n");
43
     WriteString("ATE0\r\n");
44
     WriteString("ATE0\r\n");
45
     
46
     
47
                // Time delay
48
                while(x--) {}
49
               
50
     
51
     WriteString("AT+CMGF=1\r\n");
52
     WriteString("AT+CMGDA=\"DEL ALL\"\r\n");
53
54
                 
55
                 while (1){
56
                     //REQUEST THE NEW SMS MESSAGE
57
                     WriteString("AT+CMGR=1\r\n");
58
                     
59
                     // Wait until the SMS indicator string is received
60
                     x=1000000;
61
                     while(x--) {}
62
                     
63
                   
64
                     
65
                      char f = 0;
66
                      char c;
67
                     
68
                      x = 1000000;
69
70
                        do{
71
                            
72
73
                            PORTCbits.RC7 = 1;
74
                            //PORTCbits.RC7 = 0;
75
                            if(f<2){
76
                            c = UARTGetDataByte(UART2);//ReadUART2();
77
                    // Skip the <CR><LF> characters at the beginning of the string
78
                            if(!(c== 0x0d || c== 0x0a)){buffer[f] = c; f++;}
79
80
                            c = UARTGetDataByte(UART2);//ReadUART2() ;
81
                            if(!(c== 0x0d || c== 0x0a)){buffer[f] = c; f++;}
82
                            
83
                            }else{
84
                                c = UARTGetDataByte(UART2);//ReadUART2() ;
85
                                buffer[f] = c; f++;
86
                            }
87
                      
88
                        }while( c != 'K' );
89
                        buffer[f] = '\0';
90
PORTCbits.RC7 = 0;
91
92
  
93
94
95
    WriteString("AT+CMGDA=\"DEL ALL\"\r\n");
96
         }
97
                 return 0;
98
 }
99
 
100
101
 // helper functions
102
 void WriteString(const char *string)
103
 {
104
     while(*string != '\0')
105
     {
106
         while(!UARTTransmitterIsReady(UART2))
107
             ;
108
109
         UARTSendDataByte(UART2, *string);
110
         //putsUART2(*string);
111
         string++;
112
113
         while(!UARTTransmissionHasCompleted(UART2))
114
             ;
115
     }
116
 }

Nach meiner überlegung, wenn ich ein SMS mit inhalt 'K' sende muss die 
led off sein, ist aber nicht der fall, wenn jemand helfen könnte würde 
ich sehr dankbar

von Chris B. (dekatz)


Lesenswert?

Tut sich gar nichts auf den UART Pins?
Das ist doch ein PIC32MX220xxxxx - oder??
Da sind die Pins für UART, SPI, I2C nur über PPS (Peripheral Pin select) 
zugänglich.
Die Beschreibung dafür findet sich im PIC32MX1xx/2xx Manual (DS61168) ab 
Seite 143.
Ich habe hier einen PIC32MX220F032B auf Lochraster mit MAX3232 aufgebaut 
und die Zuordnung von RX/TX findet so statt:

// Zugriff auf PPS must erst freigeschaltet werden!!
  SYSKEY = 0;                   // locked durch sinnlosen Wert
  SYSKEY = 0xAA996655;          // Key1 für unlock
  SYSKEY = 0x556699AA;          // Key2 für unlock
  CFGCONbits.IOLOCK = 0;
  // Peripheral pin select:
  PPSInput(3,U1RX,RPB2);        // RX auf RB2
  PPSOutput(1,RPB3,U1TX);       // TX auf RB3
  // PPS-Zugriff wieder sperren
  CFGCONbits.IOLOCK = 1;
  SYSKEY = 0;                   // locked

Für dein Board musst du dir die entsprechenden PPSInput/PPSOutput 
entsprechend abändern.

: Bearbeitet durch User
von Ivan (Gast)


Lesenswert?

@Chris
Danke dir für info, ich werde mich zuerst einlesen, brauche paar minuten 
zeit
Vielen vielen dank :)

von Ivan (Gast)


Lesenswert?

@Chris

Habe mein code so angepasst:
1
#include <stdio.h>
2
#include <string.h>
3
#include <p32xxxx.h>
4
#include <plib.h>
5
6
// Config Bits
7
#pragma config FNOSC = FRCPLL       // Internal Fast RC oscillator (8 MHz) w/ PLL
8
#pragma config FPLLIDIV = DIV_2     // Divide FRC before PLL (now 4 MHz)
9
#pragma config FPLLMUL = MUL_20     // PLL Multiply (now 80 MHz)
10
#pragma config FPLLODIV = DIV_2     // Divide After PLL (now 40 MHz)
11
                                    // see figure 8.1 in datasheet for more info
12
#pragma config FWDTEN = OFF         // Watchdog Timer Disabled
13
#pragma config ICESEL = ICS_PGx1    // ICE/ICD Comm Channel Select (pins 4,5)
14
#pragma config JTAGEN = OFF         // Disable JTAG
15
#pragma config FSOSCEN = OFF        // Disable Secondary Oscillator
16
17
18
 // Defines
19
#define SYSCLK 40000000L
20
21
22
 #define DESIRED_BAUDRATE     115200
23
24
25
 void WriteString(const char *string);
26
 int x = 1000000;
27
 char buffer[100];
28
29
 int main(void)
30
 {                
31
32
  
33
                
34
                   
35
                 mPORTCClearBits(BIT_8);                            // Turn off RA7 on startup.
36
                 mPORTCSetPinsDigitalIn(BIT_8);           // Make RA7 as output.
37
                 mPORTCClearBits(BIT_9);                            // Turn off RA7 on startup.
38
                 mPORTCSetPinsDigitalOut(BIT_9);           // Make RA7 as output.
39
                 mPORTCClearBits(BIT_7);                            // Turn off RA7 on startup.
40
                 mPORTCSetPinsDigitalOut(BIT_7);           // Make RA7 as output.
41
                 mPORTCClearBits(BIT_6);                            // Turn off RA7 on startup.
42
                 mPORTCSetPinsDigitalOut(BIT_6);           // Make RA7 as output.
43
                 mPORTCClearBits(BIT_5);                            // Turn off RA7 on startup.
44
                 mPORTCSetPinsDigitalOut(BIT_5);           // Make RA7 as output.
45
  SYSKEY = 0;                   // locked durch sinnlosen Wert
46
  SYSKEY = 0xAA996655;          // Key1 für unlock
47
  SYSKEY = 0x556699AA;          // Key2 für unlock
48
  CFGCONbits.IOLOCK = 0;
49
  // Peripheral pin select:
50
  //PPSUnLock;
51
  PPSInput(2,U2RX,RPC8);        // RX auf RB2
52
  PPSOutput(4,RPC9,U2TX);       // TX auf RB3
53
  //PPSLock;
54
  CFGCONbits.IOLOCK = 1;
55
  SYSKEY = 0;                   // locked
56
     UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);
57
     UARTSetFifoMode(UART2, UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY);
58
     UARTSetLineControl(UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
59
     UARTSetDataRate(UART2, SYSCLK, DESIRED_BAUDRATE);
60
     UARTEnable(UART2, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
61
62
 WriteString("ATE0\r\n");
63
     WriteString("ATE0\r\n");
64
     WriteString("ATE0\r\n");
65
     
66
     
67
                // Time delay
68
                while(x--) {}
69
               
70
     
71
     WriteString("AT+CMGF=1\r\n");
72
     WriteString("AT+CMGDA=\"DEL ALL\"\r\n");
73
74
                 
75
                 while (1){
76
  
77
                     //REQUEST THE NEW SMS MESSAGE
78
                     WriteString("AT+CMGR=1\r\n");
79
                     
80
                     // Wait until the SMS indicator string is received
81
                     x=1000000;
82
                     while(x--) {}
83
                     
84
                   
85
                     
86
                      char f = 0;
87
                      char c;
88
                     
89
                      x = 1000000;
90
91
                        do{
92
                            
93
94
                            PORTCbits.RC7 = 1;
95
                            //PORTCbits.RC7 = 0;
96
                            if(f<2){
97
                            c = UARTGetDataByte(UART2);//ReadUART2();
98
                    // Skip the <CR><LF> characters at the beginning of the string
99
                            if(!(c== 0x0d || c== 0x0a)){buffer[f] = c; f++;}
100
101
                            c = UARTGetDataByte(UART2);//ReadUART2() ;
102
                            if(!(c== 0x0d || c== 0x0a)){buffer[f] = c; f++;}
103
                            
104
                            }else{
105
                                c = UARTGetDataByte(UART2);//ReadUART2() ;
106
                                buffer[f] = c; f++;
107
                            }
108
                      
109
                        }while( c != 'K' );
110
                        buffer[f] = '\0';
111
 PORTCbits.RC7 = 0;
112
 x=1000000;
113
 while(x--) {}
114
  
115
116
117
    WriteString("AT+CMGDA=\"DEL ALL\"\r\n");
118
                // PPS-Zugriff wieder sperren
119
  
120
         }
121
                 return 0;
122
 }
123
 
124
125
 // helper functions
126
 void WriteString(const char *string)
127
 {
128
     while(*string != '\0')
129
     {
130
         while(!UARTTransmitterIsReady(UART2))
131
             ;
132
133
         UARTSendDataByte(UART2, *string);
134
         //putsUART2(*string);
135
         string++;
136
137
         while(!UARTTransmissionHasCompleted(UART2))
138
             ;
139
     }
140
 }
141
 /*
142
 void PutCharacter(const char character)
143
 {
144
         while(!UARTTransmitterIsReady(UART2))
145
             ;
146
147
         UARTSendDataByte(UART2, character);
148
149
150
         while(!UARTTransmissionHasCompleted(UART2))
151
             ;
152
 }*/
153
 // UART 2 interrupt handler
154
 // it is set at priority level 2
155
void __ISR(_UART2_VECTOR, ipl2) IntUart2Handler(void)
156
 {
157
                 int c;
158
159
               // Is this an RX interrupt?
160
                 if(INTGetFlag(INT_SOURCE_UART_RX(UART2)))
161
                 {
162
                      c= UARTGetDataByte(UART2);
163
164
                      // Clear the RX interrupt Flag
165
                     INTClearFlag(INT_SOURCE_UART_RX(UART2));
166
167
                     // Echo what we just received.
168
                     //PutCharacter(c);
169
170
                    // Toggle LED to indicate UART activity
171
                    mPORTCToggleBits(BIT_7);
172
                 }
173
174
}
Trotzdem geht es nicht, die led an port RC7 ist konstant an, es liegt 
bestimmt an der auswertung von character, oder die while schleife ist 
nicht richtig oraniesiert. Ich habe übrigens :PIC32MX220F032D an dem 
olimex board. Habe noch zusätzlich an dem Tx ausgang led angelegt(nicht 
während der datenübertragung), die flimmert leicht, also tut sich da 
was, hm ??

von Chris B. (dekatz)


Lesenswert?

Hmmmm...der _UART2_VECTOR bedient 3 Interruptquellen, u.a. auch den 
TX-Interrupt (was nr.3 ist weiss ich jetzt nicht auswendig, habe ich bei 
mir aber auchnicht berücksichtigt...). Versuch einfach mal das TX-Int 
Flag zurückzusetzen, also nach dem

if(INTGetFlag(INT_SOURCE_UART_RX(UART2)))
  {
   ......
   ......
  }

fügst du noch:

// TX Interrupt ohne Funktion
  if ( INTGetFlag(INT_SOURCE_UART_TX(UART1)) )
    {
      INTClearFlag(INT_SOURCE_UART_TX(UART1));
    }

ein.

von Ivan (Gast)


Lesenswert?

@Chris
Leider hat nicht geholfen.

von Ivan (Gast)


Lesenswert?

@Chris
Ich checke noch mal hardware wegen drahtbruch u.s.w, villeicht habe ich 
da meht glück, wünsche dir schönen abend

von Ivan (Gast)


Lesenswert?

@Chris
Also HW ist in ordnung, ich habe probiert noch ein gleichen board 
(olimex pi32-pinguino-mx220) mit pinguino ide zu programmieren, das 
programm nutzt nicht uart2 wie ich sonder uart1 und es funktioniert, µC 
signaliesiert, dass die sms empfangen werden, ich werde probieren mein 
mplab programm auf uart1 umzustellen, wieso geht es nicht über uart2?

von Chris B. (dekatz)


Lesenswert?

Keine Ahnung auf die Schnelle.
Die beiden von mir geposteten Zeilen
......
// TX Interrupt ohne Funktion
  if ( INTGetFlag(INT_SOURCE_UART_TX(UART1)) )
    {
      INTClearFlag(INT_SOURCE_UART_TX(UART1));
    }
.....
hast du hofffentlich auf UART2 angepasst??

von Ivan (Gast)


Lesenswert?

ja habe geändert gehabt weil bei mir im programm nutze ich uart2

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.