CeoN
03.04.2006, 19:29
Habe folgendes kleines Programm geschrieben um Interrupts zu testen:
/*
Soll Änderung an GPIO.1 erkennen und so aus Sleepmodus aufwachen um an GPIO.0 dauerzublinken
*/
#include "C:\Programme\bknd\cc5x\int16CXX.H" // notwendig für Interruptps
bit sender @ GPIO.0;
bit kippschalter @ GPIO.1;
bit zustand;
void sendMsg(void);
#pragma origin 4
interrupt Senden(void)
{
int_save_registers
if (GPIF)
{
sendMsg();
GPIF = 0;
}
int_restore_registers
}
void sendMsg(void)
{
while(1)
{
sender = 1;
nop();
sender = 0;
nop();
}
}
void main(void)
{
//----Konfiguration
#asm
BCF STATUS,RP0 // Bank 0
CLRF GPIO // Init GPIO
MOVLW b'000011' // GP0-GP1 als
MOVWF CMCON0 // digital I/O
BSF STATUS,RP0 // Bank 1
CLRF ANSEL // digital I/O
MOVLW b'111110' // GP0 digitaler Ausgang, GP1 digitaler Eingang
MOVWF TRISIO
BCF STATUS,RP0 // Bank 0
#endasm
GPIE = 1;
IOC = 0b.10; // Interrupt on Change für GPIO.1
OSCCON = 0b.0001.0001; // interner 125kHz Oszillator
OPTION = 0b.1000.0001; // Vorteiler auf 4 ( 001 ), 1 an der Stelle von Bit7 für Weakpullupenable
WPU = 0b.00.0010; // Weakpullup für GPIO.1
GPIO = 0b.00.0000;
GIE = 1; // Global Interrupt Enable
//----EndeKonfiguration
while(1) //endlosschleife
{
zustand = kippschalter; // einlesen des Wertes für Interruptreferenz
sleep();
nop();
}
}
als äußere Beschaltung ( sofern man davon reden kann *G* ) ist an die Versorgungsspannung ein Schalter geklemmt der die Spannung an GPIO.1 entweder auf Vdd legt oder eben Vss.
Eigentlich sollte egal was ich mache, sobald ich den Schalter umlege das Programm in die Interruptroutine springen und dort dann in der Blinkschleife festsitzen. Leider tut sich aber garnichts =(
Hab ich irgendwas Konfigurationstechnisches vergessen oder liegts an was anderem?
Als Vorlage diente mir der CC5xkurs hier: http://cc5x.de/cc5x_1.htm
dazu unterscheidet sich mein Code im groben durch den Sleep und die Interruptart.
Jedenfalls scheint der PIC sich im sleepmodus zu befinden und daraus nicht mehr rauszukommen. ( Kein Clockoutsignal am entsprechenden Pin )
Außerdem zieht der µC in diesem Betrieb 180µA. Hört sich wenig an, aber eigentlich läuft ja im Sleepmodus nicht viel oder etwa doch?
Achja bevor ichs vergesse, als Configword bzw. als Einstellungen für das Configword wurde in MPLAB folgendes gewählt:
Oszillator: Internak RC Clockout
Watchdog Timer: Off
Power Up Timer: Off
Master Clear Enable: Internal
Code Protect: Off
Data EE Read Protect: Off
Brown Out Detect: BOD Enabled, SBOREN Disabled
Internal External Switch Over Mode: Enabled
Monitor Clock Fail-Safe: Enabled
Falls hilfreich Links zum Datenblatt u.a.:
Datenblatt PIC12F683 (http://ww1.microchip.com/downloads/en/DeviceDoc/41211B.pdf)
Übersicht und Links zu weiteren PDFs (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010115)
/*
Soll Änderung an GPIO.1 erkennen und so aus Sleepmodus aufwachen um an GPIO.0 dauerzublinken
*/
#include "C:\Programme\bknd\cc5x\int16CXX.H" // notwendig für Interruptps
bit sender @ GPIO.0;
bit kippschalter @ GPIO.1;
bit zustand;
void sendMsg(void);
#pragma origin 4
interrupt Senden(void)
{
int_save_registers
if (GPIF)
{
sendMsg();
GPIF = 0;
}
int_restore_registers
}
void sendMsg(void)
{
while(1)
{
sender = 1;
nop();
sender = 0;
nop();
}
}
void main(void)
{
//----Konfiguration
#asm
BCF STATUS,RP0 // Bank 0
CLRF GPIO // Init GPIO
MOVLW b'000011' // GP0-GP1 als
MOVWF CMCON0 // digital I/O
BSF STATUS,RP0 // Bank 1
CLRF ANSEL // digital I/O
MOVLW b'111110' // GP0 digitaler Ausgang, GP1 digitaler Eingang
MOVWF TRISIO
BCF STATUS,RP0 // Bank 0
#endasm
GPIE = 1;
IOC = 0b.10; // Interrupt on Change für GPIO.1
OSCCON = 0b.0001.0001; // interner 125kHz Oszillator
OPTION = 0b.1000.0001; // Vorteiler auf 4 ( 001 ), 1 an der Stelle von Bit7 für Weakpullupenable
WPU = 0b.00.0010; // Weakpullup für GPIO.1
GPIO = 0b.00.0000;
GIE = 1; // Global Interrupt Enable
//----EndeKonfiguration
while(1) //endlosschleife
{
zustand = kippschalter; // einlesen des Wertes für Interruptreferenz
sleep();
nop();
}
}
als äußere Beschaltung ( sofern man davon reden kann *G* ) ist an die Versorgungsspannung ein Schalter geklemmt der die Spannung an GPIO.1 entweder auf Vdd legt oder eben Vss.
Eigentlich sollte egal was ich mache, sobald ich den Schalter umlege das Programm in die Interruptroutine springen und dort dann in der Blinkschleife festsitzen. Leider tut sich aber garnichts =(
Hab ich irgendwas Konfigurationstechnisches vergessen oder liegts an was anderem?
Als Vorlage diente mir der CC5xkurs hier: http://cc5x.de/cc5x_1.htm
dazu unterscheidet sich mein Code im groben durch den Sleep und die Interruptart.
Jedenfalls scheint der PIC sich im sleepmodus zu befinden und daraus nicht mehr rauszukommen. ( Kein Clockoutsignal am entsprechenden Pin )
Außerdem zieht der µC in diesem Betrieb 180µA. Hört sich wenig an, aber eigentlich läuft ja im Sleepmodus nicht viel oder etwa doch?
Achja bevor ichs vergesse, als Configword bzw. als Einstellungen für das Configword wurde in MPLAB folgendes gewählt:
Oszillator: Internak RC Clockout
Watchdog Timer: Off
Power Up Timer: Off
Master Clear Enable: Internal
Code Protect: Off
Data EE Read Protect: Off
Brown Out Detect: BOD Enabled, SBOREN Disabled
Internal External Switch Over Mode: Enabled
Monitor Clock Fail-Safe: Enabled
Falls hilfreich Links zum Datenblatt u.a.:
Datenblatt PIC12F683 (http://ww1.microchip.com/downloads/en/DeviceDoc/41211B.pdf)
Übersicht und Links zu weiteren PDFs (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010115)