Forum: Mikrocontroller und Digitale Elektronik Zwei gleichwertige PIC Anweisungen, aber nur eine funktoniert


von David (Gast)


Lesenswert?

Hallo

Von folgenden Funktionen zur Timerinitialisierung funktioniert 
seltsamerweise nur erstere. Ich entwickle mit MplabIDE.

Warum funktioniert die zweite Funktionnicht? Ich komme nicht dahinter.

Liebe Grüsse
David
1
void InitTimer1(void)
2
{
3
  T1CKPS1 = 1;
4
  T1CKPS0 = 1;
5
  TMR1ON = 1;
6
7
}
8
9
10
11
void InitTimer1(void)
12
{
13
   T1CON |= (T1CKPS1 | T1CKPS0 | TMR1ON);
14
15
}

von Marius W. (mw1987)


Lesenswert?

Da ich mich nicht mit PIC auskenne: Wie sehen die #defines hinter den 
Bezeichnern aus?

Gruß
Marius

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

David schrieb:
> Warum funktioniert die zweite Funktion nicht?
Wie sind T1CKPS1,  T1CKPS0 und TMR1ON definiert?
Gibt es da evtl. eine Header-Datei, wo das genauer beschreiben ist?

von Hannes S. (herrhannes)


Lesenswert?

Du setzt T1CON dauerhaft auf 1. Ist das deine Absicht?

von Steel (Gast)


Lesenswert?

Weil die zweite Variante blödsinn ist? Ein gutes C-Buch hilft hier, wie 
so oft. Da wird nichts gesetzt in der 2ten Variante.

von Hannes S. (herrhannes)


Lesenswert?

Mein Beitrag war Quatsch. Kann ihn nur leider nicht mehr ändern.
Steel schrieb:
> Weil die zweite Variante blödsinn ist? Ein gutes C-Buch hilft
> hier, wie
> so oft. Da wird nichts gesetzt in der 2ten Variante.

Sicher? Eventuell hat er das ja vorher irgendwo definiert.

: Bearbeitet durch User
von Justus S. (jussa)


Lesenswert?

Hannes Stoll schrieb:
> Sicher? Eventuell hat er das ja vorher irgendwo definiert.

dann dürfte die erste Variante aber doch nicht funktionieren...entweder 
die erste oder die zweite, beide gleichzeitig können ja nicht richtig 
sein...

von Simon V. (Gast)


Lesenswert?

Probiers mal damit: T1CONbis. T1CKPS1=1;

von Simon V. (Gast)


Lesenswert?

Aber ohne Leerzeicheen:[c]T1CONbis.T1CKPS1=1;[c/]
T1CKPS1 ist nur als Zahl zwischen 0 und 7 definiert. Ich weiß die genaue 
Nummer des bits nicht auswendig.

von David (Gast)


Lesenswert?

Hier ist die Begriffsdefinition aus der Include

1
/* Definitions for T1CON register */
2
static                bit  TMR1ON    @ ((unsigned)&T1CON*8)+0;
3
static                bit  TMR1CS    @ ((unsigned)&T1CON*8)+1;
4
static                bit  T1SYNC    @ ((unsigned)&T1CON*8)+2;
5
static                bit  T1OSCEN    @ ((unsigned)&T1CON*8)+3;
6
static                bit  T1CKPS0    @ ((unsigned)&T1CON*8)+4;
7
static                bit  T1CKPS1    @ ((unsigned)&T1CON*8)+5;
8
static                bit  T1RUN    @ ((unsigned)&T1CON*8)+6;

Ich habe gerade jetzt den Verdacht, dass z.B. T1CKPS0 nicht = 0x10 ist. 
Das müsste es für die nicht funktionierende Varianta ja sein.

Stattdessen ist es (Registeradresse *8)+4. Also die absolute Position im 
Speicher.

Stimmt das? Das könnte die Erklärung sein.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

David schrieb:
> static   bit  T1CKPS0    @ ((unsigned)&T1CON*8)+4;
Das ist ja mal eine wilde Herumcasterei und Rechnerei...   :-o

> die absolute Position im Speicher. Stimmt das?
Muss so sein, denn sonst würde die erste Variante nicht funktionieren.

von Klaus (Gast)


Lesenswert?

David schrieb:
> Ich habe gerade jetzt den Verdacht, dass z.B. T1CKPS0 nicht = 0x10 ist.

Das wird wohl so sein. Aus

> T1CKPS0 = 1;

würde der PräProz ja sonst

0x10 = 1;

machen

MfG Klaus

von Flo (Gast)


Lesenswert?

Ich weiß jetzt nicht welchen Compiler du verwendest.
Ich habe C18 und da geht das so, wenn man einzelne bits setzen, löschen, 
einlesen will:
Simon  V. schrieb:
> Probiers mal damit: T1CONbis. T1CKPS1=1;

von Bugs (Gast)


Lesenswert?

Wie wärs mit:

void InitTimer1(void)
{
   T1CON |= ((1<<T1CKPS1) | (1<<T1CKPS0) | (1<<TMR1ON));

}

MfG Bugs

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.