Forum: Mikrocontroller und Digitale Elektronik dspic30f c30 (fehlermeldung - ports) / (timer frage)


von speicherschorsch (Gast)


Angehängte Dateien:

Lesenswert?

hallo,

ich verwende einen dspic30f4013, C30 Compiler, einen ca. 7Mhz quarz und 
hab keine ahnung.

ich hab mich mal dran gemacht ein einfaches testprogramm zu schreiben:

das ding soll mithilfe des timers1 ca. jede sekunde alle ports auf 5V, 
dann auf 0V schalten. (am testboard hängen irgendwo ein paar LEDs, die 
müssten dann ja wohl blinken)

kann mal jemand über den code schauen, und beurteilen ob das so 
funktionieren könnte? (ich hab grad keine hardware da ... daher alles 
brain-in-the-loop)

dann noch eine spezielle frage:

kontext:

16bit timer, zählt bis max 2^16 = 65536

es wird ein externer 7MHz Quarz verwendet also eig. 1,43 x10^-7 s pro 
takt

_FOSC(CSW_FSCM_OFF & XT_PLL8); --> 7MHz * 8 = 56MHz

im datasheet steht folgendes:
> The input clock (FOSC/4 or external clock) to the 16-bit
> Timer has a prescale option of 1:1, 1:8, 1:64 and 1:256

ich komm mit den ganzen teilern nicht mehr zurecht!

heißt das jetzt:
der takt der beim timer 1 ankommt ist 7MHz * 8 / 4 = 14MHz. weiter mit 
dem prescaler vom timer 1/256 = 54687,5Hz.?

d.h. ich muss bis 54687 zählen (PR1=0xd59f;), damit ca. jede sekunde 1 
interrupt ausgelöst wird?

von Anja (Gast)


Lesenswert?

speicherschorsch schrieb:
> der takt der beim timer 1 ankommt ist 7MHz * 8 / 4 = 14MHz. weiter mit
> dem prescaler vom timer 1/256 = 54687,5Hz.?

Ja sollte so passen. (Ich habe hier mit 4 MHz Quarz und PLL = 16 einen 
16 MHz Takt für die Timer).

speicherschorsch schrieb:
> (ich hab grad keine hardware da ... daher alles
> brain-in-the-loop)

Warum verwendest Du nicht den Simulator? Da würdest du dann auch 
herausfinden ob der Prescaler beim erreichen von PR1 sofort gelöscht 
wird oder auch nicht. (hast Du auf- oder in Wirklichkeit ab-gerundet bei 
0,5).

Gruß Anja

von speicherschorsch (Gast)


Lesenswert?

Anja schrieb:
> Da würdest du dann auch
> herausfinden ob der Prescaler beim erreichen von PR1 sofort gelöscht
> wird oder auch nicht. (hast Du auf- oder in Wirklichkeit ab-gerundet bei
> 0,5).

wow, sorry, das versteh ich gar nicht.
prescaler ist doch 1/256 ... ne feste größe, wie kann der gelöscht 
werden?
und was hat das mitm runden zu tun ... ich hab 54687,5Hz original und 
die auf 54687 abgerundet ... das seh ich doch so ...??


nochmal die bitte, ob jemand über den code (erster post) gucken könnte 
... allgemeine kommentare bitte (ist mein erster µC code)

von speicherschorsch (Gast)


Lesenswert?

kann mir jemand helfen ... im simulator tut sich gar nix, d.h. keine 
variablen ändern sich etc ...
bitte mal irgendjemand den code anschauen (erster post)
dankeschön.

ach ja: ich hab beim kompilieren folgende warnung:
> main.c: In function '_T1Interrupt':
> main.c:71: warning:  PSV model not specified for '_T1Interrupt';
>    assuming 'auto_psv' this may affect latency

was bedeutet das jetz schon wieder?

von Wilhelm W. (tt-elek)


Lesenswert?

Hallo,
wo änderst du denn ison?

Wie wäre es mit:
/*ISR*/
void __attribute__((_interrupt_)) _T1Interrupt(void){
  if (ison == 1){
    alloff();
    ison = 0;
  }
  if (ison == 0){
    allon();
    ison = 1;
  }
  IFS0bits.T1IF = 0; /* reset timer 1 interrupt flag */
}

viele Grüße

von Wilhelm W. (tt-elek)


Lesenswert?

wer lesen kann, ist klar im Vorteil:

/*tools*/
void allon(void){
  LATA = 0xffff;
  LATB = 0xffff;
  LATC = 0xffff;
  LATD = 0xffff;
  LATF = 0xffff;
  ---------
  ison = 1;
  ---------
}

void alloff(void){
  LATA = 0x0000;
  LATB = 0x0000;
  LATC = 0x0000;
  LATD = 0x0000;
  LATF = 0x0000;
  ---------
  ison = 0;
  ---------
}


viele Grüße

von Anja (Gast)


Lesenswert?

speicherschorsch schrieb:
>>    assuming 'auto_psv' this may affect latency
>
> was bedeutet das jetz schon wieder?

Du solltest besser im "Handbook" lesen bei einem Interrupt hast du die 
Möglichkeit entweder alles einzeln auf dem Stack oder (für eine 
Interrupt-Ebene) in den schnellen Registern zu sichern.

speicherschorsch schrieb:
> prescaler ist doch 1/256 ... ne feste größe, wie kann der gelöscht
> werden?

Im Datenblatt steht: bei einem Schreibzugriff auf das Timer-Register 
wird der Prescaler gelöscht. Zumindest beim PIC16F876 wird im "Special 
Trigger Mode" auch der Prescaler gelöscht wenn der Vergleichswert 
erreicht ist. Die Periodendauer ist dadurch beim Prescaler 8:1 um 7 
Takte zu kurz.
Beim dsPIC habe ich es noch nicht überprüft.

Gruß Anja

von speicherschorsch (Gast)


Lesenswert?

ha, habn billigen allgemeinen programmieranfängerfehler gem8 
(kommentar):
1
void __attribute__((_interrupt_)) _T1Interrupt(void){
2
  if (ison == 1){
3
    alloff(); //hierin wird ison = 0 gesetzt --> beim nächsten if ist die bedingung true
4
  }
5
  if (ison == 0){ //immer true, weil vorher auf 0 gesesetzt.
6
    allon();
7
  }
8
  IFS0bits.T1IF = 0; /* reset timer 1 interrupt flag */
9
}

aber danke für die antwort schonmal.
--- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
nochmal zu:
> PSV model
was ist das? im datasheet irgendwie nix verständliches gefunden...

von Chris D. (m8nix)


Lesenswert?

1
void __attribute__((__interrupt__)) _T1Interrupt(void){
2
  if (ison == 1){
3
    alloff();
4
  }
5
  if (ison == 0){
6
    allon();
7
  }
8
  IFS0bits.T1IF = 0; /* reset timer 1 interrupt flag */
9
}

... da bist'e einem typischen Anfängerfehler auf den Leim gegangen.
Welchen Wert hat "ison" nach "alloff()" ? ... -> 0! - somit ist deine 2. 
if-bedingung auch erfüllt und "allon()" wird auch ausgeführt.

besser so...
1
void __attribute__((__interrupt__)) _T1Interrupt(void){
2
  if (ison == 1) alloff() else allon();
3
  IFS0bits.T1IF = 0; /* reset timer 1 interrupt flag */
4
}

Gruß
Chris


*** edit

hihi... bist ja von alleine drauf gekommen ;-)

von Anja (Gast)


Lesenswert?

Anja schrieb:
> Beim dsPIC habe ich es noch nicht überprüft.

Also bei mir läuft der Code im Simulator (MPLAB 8.33). Der Abstand 
zwischen 2 Interrupts ist im Simulator 14000127 Takte. Im ersten 
Durchlauf nach Reset 14000146 Takte. Ich hätte entweder 14000128 = 54688 
* 256 oder 13999873 = 54687 * 256 + 1 erwartet.

Gruß Anja

von Siegfried S. (dieleena)


Lesenswert?

Hallo Anja,
auf welchem Weg hast du das "Der Abstand zwischen 2 Interrupts ist im 
Simulator" erstellt/überprüft?
Siegfried

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.