freescale, Interrupt

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

freescale, Interrupt

Inlägg av SmourF »

hej

har suttit hela denna underbara dag, och natt, i hopp om att försöka lösa problemet,

där problemet är RealTimeInterrupt, hur den väcker från STOP läge,
jag lyckas ärligt talat inte göra interrupt funktion i codewarrior, de e skämmigt men sant, har sökt genom hela goggle men inte funnit ngt tråkigt nog,

processorn som används är RS08,

de e en sak o programmera i MPLAB men codewarrior, de va lite andra bullar :), hoppas ngn här har lite erfarenhet och kan hjälpa loss mig :)

tack i förhand,

gonatt ;)

MVH SmourF
Mackan
Inlägg: 210
Blev medlem: 1 mars 2006, 21:20:39
Ort: Fjärdhundra/Enköping
Kontakt:

Inlägg av Mackan »

Hej.......såg tråden idag.........vet inte om detta kommer att hjälpa dig eller om du redan löst problemet men här är mina tips:

För det första......testa att använda processor expert-pluginnen.........detta enklar upp allt som har med Clockinställningar och interrupt och dylig att göra......genererar bra skriven kod och färdiga funktionen som det bara är att addera din egen kod i

Om du inte vill använda processor expert så kan du testa att göra interruptfunktionen på följande sätt( skrivet för en 9S08GT60):

Kod: Markera allt

// timer interrupt for scanning of the IR-signal
void interrupt 8 handleIrInterrupt(void){
Funktionen är alltså deklarerad som en interruptfunktion för interrupt 8 i interruptvektorn.........alltså TPM1Overflow som i detta fall användes för att scanna av kommunikation från en vanlig IR-fjärrkontroll

Testa ngn av dessa sätt så fixar du nog till det.............och glöm inte att "cleara" interruptet i IRQ-funktionen som du gör.

Hoppas du micklar ihop det............

Mvh.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Inlägg av SmourF »

hej Mackan, tack för ditt svar, de e aldrig för sent :) jag kör givetvis med den där initierings programmet, de e nog de bästa med codewarrior, resten suger dock,

det du skriver är för alla processorer utom den ja använder, RS08, för den har inte sånna där interrupt vektorer, men tack för tipset!

just nu är mitt problem i att programmera skiten, jag har en sådan här programmerare
http://www.pemicro.com/products/product ... N=66832248

det jag vill är att programmera enbart, och köra sedan BDM pinnen som en utgång, men va de ska va komplicerat, ärligt talat finns där ingen fin knapp som heter programmera, har ngn erfarenhet av codewarrior så är ni hjärtligt välkomna o tipsa, ja tror ja spricker, inget går som jag vill :(

tack i förhand

MVH SmourF
Mackan
Inlägg: 210
Blev medlem: 1 mars 2006, 21:20:39
Ort: Fjärdhundra/Enköping
Kontakt:

Inlägg av Mackan »

Tjenare.......

Ojdå..........var lite snabb i mitt svar.........tog det förgivet att man körde interruptvektor-baserat...........jaja............man lär sig nåt nytt varje dag :)


Nu till ditt problem..........I codewarrior så trycker man F5 för att debugga det man nyss har gjort...........dock så vill du ju bara programmera den kod som du just gjort..........hmmmm.......
Lösning......det är nämligen så enkelt att när du trycker F5 så programmeras processorn med den kod du just kompilerat och sen drar hela debuggermiljön igång..............i stället för att börja debugga vilket i ditt fall ändå inte går då du ju vill använda "BKGD"-pinnen som utgång...........så slår du bara av strömmen till processorn och kopplar ur debugger'n och spänningsätter kortet igen.
Direkt vid "startup" så finns ingen debugmode aktiverad och ditt valiga nyss "nertankade" program drar igång som det skall..........testa gärna detta med ett enkelt "blinka" med en utgång-testkod.

Saxat ur manualen.........här står det om jag fattar det rätt att man inte skall ha BDM'n aktiverad/ansluten om man skall testa alternativa funktionen på pinnen vilket är precis det du vill göra........testa att göra som jag skrev ovanför då borde du få utgången att göra som du vill :hacker:
On some RS08 devices, the BKGD pin may be shared with an alternative output-only function. To support BDM debugging, the user must disable this alternative function. Debugging of the alternative function should be done in normal user mode without using BDM.

Kör hårt..........

Mvh,
/Markus
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Inlägg av SmourF »

hej igen Mackan :)

tack du, de funkade faktiskt, eller när jag satte på spänning till kretsen så lös LEDen :D och jag blev underbart glad :), har haft så mkt motgång att de va en så vacker syn :D

jag kör ju MCUn till ett skiftregister som jag båda matar med den matningsspänningen från programmeraren, och jag trodde, eller hoppades på, att den ger ström medan man har programmeraren ikopplad, men visst hade man fel :(

du verkar ju vara grymt bra på freescales produkter :) jag måste ju erkänna att jag tycker de e kasst dokumenterat, jag söker genom hela google och deras PDFer och de där online skolor de har men jag får inte svar på de enkla frågor

så jag fortsätter fråga dig :)

när man använder "define namn port" eller "define konstant" så klagar den alltid när jag sedan använder de i koden att en "}" eller ")", beroende var det används, saknas vilket gör mig så irriterad för jag gör så som man ska

jag har en kod där jag anropar ett skiftregister funktion

"
#define storeCLK PTAD_PTAD3;
#define dataOut PTAD_PTAD4;
#define shiftCLK PTAD_PTAD5;

void main (void){
shift_register(15);
}

void shift_register(char data){
char index = 0;

for (index = 0; index < 8; index++){
data = data >> 1; //rotate right through carry

shiftCLK = 1; //shift clock 0,1us
shiftCLK = 0; //shift clock 0,1us

}
storeCLK = 1; //store clock 0,1us
storeCLK = 0; //store clock 0,1us
}
"

sen en andra fråga, C och Z är ju inte "läsbara", jag ska ju skicka ut datan genom C, men hur kollar man då C, finns ju assembler men så bra kan ja inte freescale, blanda C och assembler med C variable :(

jag uppskattar verkligen din hjälp :) jag känner ingen som kan freescale/codewarrior hehe, förhoppningsvis känner mina kompisar ngn snart (H)

tack i förhand du!

MVH SmourF
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Varför ska du shifta genom Carry?

data = data >> 1; //rotate right through carry
betyder INTE vad du skriver i kommentaren!

data = data >> 1;
shifter alla bitsen ett steg åt höger och shifter in NOLL från vänster.
Kan även skrivas:
data >>= 1;

Edit:

Kod: Markera allt

for(index = 0; index < 8; index++)
  {
  dataOut = data & 1; // Sends out '1' if LSb is '1', otherwise '0'
  data >>= 1; // Shift 'data' 1 step right
  shiftCLK = 1; // shift clock 0,1us
  shiftCLK = 0; // shift clock 0,1us
...
Senast redigerad av Icecap 5 juni 2008, 11:14:20, redigerad totalt 3 gånger.
Mackan
Inlägg: 210
Blev medlem: 1 mars 2006, 21:20:39
Ort: Fjärdhundra/Enköping
Kontakt:

Inlägg av Mackan »

Alåha....

Kul att det hoppade igång :)

Nu till koden....precis som icecap skriver så skiftas datat inte på det sätt som du beskriver/önskar.

Om du vill att ngt skall hända på "dataOut/PTAD_PTAD4" så ser jag inte någonstans vart detta skulle kunna ske..........det finns ingen kod som "spottar" ut ngt på Port D pinne 4...........jaja all kod kanske inte är med.
Ser inte heller vart in/ut-funktionalitet sätts(alltså port-initiering)

Om du får kompileringsfel så får du kolla hur det ser ut där då tex. "PTAD_PTAD3" är deklarerad

Mvh.
/Markus
Mackan
Inlägg: 210
Blev medlem: 1 mars 2006, 21:20:39
Ort: Fjärdhundra/Enköping
Kontakt:

Inlägg av Mackan »

Tackar "icecap".........Där kom det som jag påpekade skulle till..............innan det händer ngt över huvu taget på utgången :)

Mvh
/Markus
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Inlägg av SmourF »

jaha :( jag utgick från att de roterade genom CARRYN, så som assembler funktionerna, utgick från det iaf, visserligen alltid när jag använt det har jag aldrig skiftat genom CARRYN utgick bara från de, baaah

Mackan, initieringen har jag gjort i de där initieringsprogrammet, där allt är utgångar förutom ACMP+ (8 ), ACMP- (7 )

Icecap, för jag vill ju skifta ut all data till CARRYN en och en, och enkelt läsa av den, så tänkte jag iaf, men man får väl göra en fuling då, men de tar ju onödigt mer clockcykler när de finns en assembler function som heter RotateRightThroughCarry, ja trodde kompilatorn skulle förstå det

Mackan, vet du hur man läser av CARRYN/ZERO då de inte är läsbara så som i microchips processorer ?

altså när de gäller felmeddelande, så får jag så fort jag använder mina DEFINE variabler, använder jag exempel "PTAD_PTAD3" då får jag inget, konstigt, och det stör mig för jag vill använda define, blir mer lättläsligt
" #define storeCLK PTAD_PTAD3;
#define dataOut PTAD_PTAD4;
#define shiftCLK PTAD_PTAD5; "

hoppas jag kunde ge er mer överblick i vad jag vill :)

tack för all hjälp

MVH SmourF


EDIT: så här får jag väl skriva skiftregistret om inget annat då, de borde ju funka, men åter igen, för varje define variabler jag använder får jag fel på att det saknas "}" eller ")" :(

void shift_register(char data){
char index = 0;

for (; index < 8; index++){

if ((data & 0b00000001) == 1){
dataOut = 1;
}else{
dataOut = 0;
}

data = data >> 1; //rotate right

shiftCLK = 1; //shift clock 0,1us
shiftCLK = 0; //shift clock 0,1us
}

storeCLK = 1; //store clock 0,1us
storeCLK = 0; //store clock 0,1us
}
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ta bort semikolon så ska du se på fan...

Alltså INTE:
#define storeCLK PTAD_PTAD3;
#define dataOut PTAD_PTAD4;
#define shiftCLK PTAD_PTAD5;

men:
#define storeCLK PTAD_PTAD3
#define dataOut PTAD_PTAD4
#define shiftCLK PTAD_PTAD5

Edit: det som händer är att "dataOut" blir bytt rent mot "PTAD_PTAD4;" och när kompilern sedan kör blir det t.ex.

Kod: Markera allt

 if(data & 0x01)
  {
  PTAD_PTAD4; = 1;
  }
else
  {
  PTAD_PTAD4; = 0;
  }
Och sluta GENAST med dumheterna!!!!
if ((data & 0b00000001) == 1) // FY! FY! FY!

if (data & 0b00000001) // Rätt sätt! Allt != 0 är sant
Denna gång fungerade det men andra bitvärden fungerar det inte på.
(data & 0x02) växlar mellan 0x00 och 0x02 osv. och då 0x00 alltid är FALSK och allt annat är SANT i C är det bästa sättet.

Enklast sätt kan vara:
dataOut = (data & 0x01) && 1;
Första delen maskar ut LSb och andra delen (&& 1) får hela uttrycket att bli SANT eller FALSKT.

Jag har sett ett o annat program som inte fungerade och där det var gjort liknande: [Data maskade med bitmönster == x] när det i själva verket skulle var finns/finns inte.
Mackan
Inlägg: 210
Blev medlem: 1 mars 2006, 21:20:39
Ort: Fjärdhundra/Enköping
Kontakt:

Inlägg av Mackan »

En sådan klassiker att jag inte ens såg/tänkte på att det var ett semikolon i definesatsen..........det är bra att du har ögonen öppna "Icecap"

:lol:

Mvh.
/Markus
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Inlägg av SmourF »

ooo herregud :( va dum ja känner mig, men inte lika dum som den förbaskade kompilatorn borde känna sig som inte ger fel när man skriver semikolon :D

tack Icecap, de va guld värt :) du har rätt i de par skrivsätten, ska lägga de på minnet!

och tack du också Mackan för all hjälp :)

nu ska ja sova sen ska ja på minisemester, sen när jag kommer hem ska jag försöka få ordning på det sista, för komponenterna har nog anlänt då :)

kommer säkert återkomma hehe :roll:

men ni får hade gott, tack än en gång :)

gonatt

MVH SmourF
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

ooo herregud va dum ja känner mig, men inte lika dum som den förbaskade kompilatorn borde känna sig som inte ger fel när man skriver semikolon

Njaa. Det är egentligen inget fel i C/C++ att ha semikolon där man inte måste ha det. Så kompilatorn gör rätt. Däremot kan man ju lyckas förvirra kompilatorn geom att lägga in det. Saker tolkas inte på det sätt som du tänkte.
SmourF
Inlägg: 268
Blev medlem: 13 april 2004, 15:33:58
Ort: Jönköping
Kontakt:

Inlägg av SmourF »

hej igen :)

vfr: nja, kände mig faktiskt rätt dum, men kompilatorn tyckte ja va dummare dock, men jag kollade upp de i MPLAB, där kvitta de om man har eller inte semikolon

men återigen till problemet, nu har ja ju fått mina motstånd så jag har lött alla till 7segmenten, och så kan ja förklara än en gång va ja ska göra, skifta ut ett 8bitars tall till ett skiftregister o presentera de på en 7segment LED

grejen är den att när jag programmerar som Mackan säger, man bara trycker på debug, så syns faktiskt ingenting, och då kan man fråga sig, hur vet du att du inte lött fel då, ju när jag programmerar i "full chip simulator" så lyser alla förutom 2 segment, konstant

jag känner att koden är rätt, så frågan e om de e programmeringsfråga ? för allt jag gör e kompilerar, väljer P&E Multilink, och trycker på debug, och då skulle de ju va "klart"

koden kortfattad här, alla variabler har startvärdet 0

I main snurrar den egentligen bara varje sekund och skiftar ut till 7segmenten

MAIN:

Kod: Markera allt

  while (1){
    
    shiftRegister(BCDto7SEGMENT[index]);  //shift out the ADValue to 7segment
    
    index++;
    
    if (index > 9){
      index = 0;
    }
    
    //wait 1sec
    for ( ; segmentDelay < 5000 ; segmentDelay++){
      MTIMSC_TSTP = 0;
      
      while (!SIP1_MTIM){
      }
      
      MTIMSC_TSTP = 1;
      MTIMSC_TRST = 1;
    }
    
    segmentDelay = 0;
    //end wait
  }

Kan va kul o se funktionen som används i main

7SEGMENT LED:

Kod: Markera allt

void shiftRegister(char data){
  char  i = 0;
  
  for (; i < 8; i++){ //shift out the 8bit "data"
    
    if (data & 0b00000001){
      dataOut = 1;
    }else{
      dataOut = 0;
    }
    
    data = data >> 1; //rotate right
    
    shiftCLK = 1; //shift clock 0,1us
    shiftCLK = 0; //shift clock 0,1us

  }

  storeCLK = 1; //store clock 0,1us
  storeCLK = 0; //store clock 0,1us

}

OCH lite huvudfråga sen start, den går nämligen inte in i interruptet, jag fattar inte varför, för när jag simulerar sätts flaggan iaf

INTERRUPT:
#pragma TRAP_PROC
void ISR(void){

if (SIP1_ACMP){
ACMPSC_ACF = 1; //clears the flag
...KOD...
}

else if (SIP1_MTIM){
MTIMSC_TRST = 1; //resets and clears the flag
...KOD...
}
}
nej jag vet inte vad mer jag ska pröva, om ngn har tips eller förslag prövar jag de direkt, behöver bli klart med detta nämligen, lite tidspress har man :(

tack i förhand

MVH SmourF
Skriv svar