Forum: Mikrocontroller und Digitale Elektronik 16 bit timer in c 8051


von Thomas R. (freddyt)


Lesenswert?

Hallo :)
Ich muss einen 16bit Timer realisieren und zwar in C.
Er soll mit dem dem wechsel von low auf high starten und mit dem wechsel 
von high auf low stoppen.
kann mir da jemand ein Beispiel geben wie der Timer in C aussehen würde 
?
Ich kann ihn nur in Assembler .. da ich C erst am lernen bin.
in Assembler würde das initialisieren des timers so aussehen:

MOV TMOD,#01H  ; Timer 0 , Modus 1 --> 16 Bit Timer
MOV TL0,#Zahl  ; Startwert des Timers
MOV TH0,#Zahl  ; Startwert des Timers
SETB TR0       ; Timer starten


Wie würde das in C aussehen ?
Hab da auch was gefunden in einem Beitrag von Birgit
( Beitrag "Timer 0 mi ATmega8" )
Sieht so aus als ob sie hier den Timer initialisiert:

 IE = IE | 0x82; <-- was wird hier gemacht ?

 TMOD = TMOD | 0x01; //Timer0 einschalten (16Bit) <-- das ist klar

 TL0 = 0x3C;   <-- wofür ist 0x ist das wie bei Assembler die # vor der 
Zahl ? 3c ist wahrscheinlich die zahl in Hex
 TH0 = 0xB0;   <-- hier das selbe ..
 TR0 = 1;      <-- Timer run... also Timer starten

(Ich Programmiere auf einem AT 89S8253)

von Stefan E. (sternst)


Lesenswert?

Thomas Riedel wrote:

>  IE = IE | 0x82; <-- was wird hier gemacht ?

"|" ist der binäre Oder-Operator, also werden in IE die Bits 1 und 7 
gesetzt, die restlichen Bits behalten ihren alten Wert. Was das konkret 
bedeutet, muss du mal im Datenblatt nachschauen.

>  TL0 = 0x3C;   <-- wofür ist 0x ist das wie bei Assembler die # vor der
> Zahl ? 3c ist wahrscheinlich die zahl in Hex

0x ist der Prefix für Hex-Zahlen.

von Thomas R. (freddyt)


Lesenswert?

ist IE = IE | 0x82; für den Timer notwendig bzw. hat das was mit dem 
Timer zu tun ?
Und gibts sowas wi z.b. die Java.api 
(http://java.sun.com/j2se/1.4.2/docs/api/)
wo der syntax von C wie z.b. DDRB oder so erklährt sind ?

von Stefan E. (sternst)


Lesenswert?

Ich vermute, dass damit zum Timer gehörende Interrupts freigeschaltet 
werden.
Aber wie ich bereits sagte: schau einfach in das Datenblatt.

von R. W. (quakeman)


Lesenswert?

Wie Stefan schon vermutet hatte, wird mit IE = IE | 0x82 das Bit ET0 
(Enable Timer0 Interrupt) sowie EA (Enable All Interrupt) gesetzt. Das 
benötigst du also nur, wenn du eine Interruptroutine in deinem Programm 
verwenden willst mit Timer0.

Und grundsätzlich wird bei den meisten C Compilern ein Standard ANSI-C 
verwendet mit eventuell ein paar Erweiterungen. Du solltest dir also ein 
Buch zu ANSI-C zulegen, wenn du das lernen willst. Eine online API gibt 
es vielleicht irgendwo, aber da kenne ich keine Links dazu. Ich habe mir 
verschiedene Bücher speziell zu C51 gekauft die ich nur weiterempfehlen 
kann. ;)

Ciao,
     Rainer

von Thomas R. (freddyt)


Lesenswert?

Fox Mulder wrote:
> Wie Stefan schon vermutet hatte, wird mit IE = IE | 0x82 das Bit ET0
> (Enable Timer0 Interrupt) sowie EA (Enable All Interrupt) gesetzt. Das
> benötigst du also nur, wenn du eine Interruptroutine in deinem Programm
> verwenden willst mit Timer0.

Ahso :)
Also in dem Fall brauch ich kein interrupt aber danke fürs erklären.

Hmm naja lernen will ich C nicht unbedingt.. aber ich bin gezwungen C zu 
lernen weil das Programm, das ich umsetzen will in Assembler nicht 
funktioniert.

von R. W. (quakeman)


Lesenswert?

Thomas Riedel wrote:
> Hmm naja lernen will ich C nicht unbedingt.. aber ich bin gezwungen C zu
> lernen weil das Programm, das ich umsetzen will in Assembler nicht
> funktioniert.

Das bezweifel ich stark, daß das Programm in Assembler nicht 
funktionieren würde. Je nach Umfang wird es in Assembler aber weit aus 
komplexer als es in C wäre. ;)

von Thomas R. (freddyt)


Lesenswert?

hmm ^^
auf jedenfall will ich nicht extra C lernen ^^
das einzige Problem das ich in assembler habe ist eben dass ich auf 
kleiner gleich prüfen muss

von Helmut L. (helmi1)


Lesenswert?

>das einzige Problem das ich in assembler habe ist eben dass ich auf
>kleiner gleich prüfen muss

Dann schreib dir doch ein paar Macros dazu

Gruss Helmi

von Peter D. (peda)


Lesenswert?

Thomas Riedel wrote:

> das einzige Problem das ich in assembler habe ist eben dass ich auf
> kleiner gleich prüfen muss

Dann schau Dir mal die Befehle SUBB oder CJNE an, die können sowas.


Peter

von R. W. (quakeman)


Lesenswert?

Thomas Riedel wrote:
> das einzige Problem das ich in assembler habe ist eben dass ich auf
> kleiner gleich prüfen muss

Du weißt schon, daß du stattdessen auch auf ein negiertes > prüfen 
könntest? :)

von Pieter (Gast)


Lesenswert?

moin moin,

in meinem Macroassembler sieht das so aus:
;--------------------------------------
;Compare And Jump Less Or Equal
CJLE    MACRO  Register, Value, Target
    CJNE  Register, Value, @@1
    SETB  C
@@1:    JC  Target
    ENDM
;--------------------------------------


Mit Gruß
Pieter

von Thomas R. (freddyt)


Lesenswert?

Was ist Macroassembler ? ^^ ist das ein Programm ?
CJNE is ja Sprung wenn akku und konstante ungleich ^^ .. damit kann ich 
doch nix anfangen oder ?
Ich weiss net ob des mit den Macros kürzer ist ^^


hab mir C jetzt mal angeschaut und und muss sagen C ist garnicht mal so 
schwer... wer java kann hat mit C auch kaum Probleme denk ich.. hab auch 
das programm zu meinem Projekt geschrieben.
Was das Programm tun soll:
Wenn ein schalter gedrückt wird soll eine Pumpe gestartet werden.
Von Tp1 erhalte ich ein Signal dessen länge ich "messen" muss (von 0 auf 
1 start des Timers .. von 1 auf 0 stopp )und mit ner Zahl vergleichen. 
Wenn kleiner gleich die Zahl ist soll das Programm die Pumpe stoppen.

So hab ich es in C umgesetzt.
Wie gesagt mein erstes Programm in C ^^

#include <reg51.h>
sbit at P1_0 TP1;
sbit at P1_1 Schalter;
sbit at P1_2 Pumpe;

void Ultraschall(){
TMOD = TMOD | 0x01;
TL0 = 0xB8;
TH = 0xC0;

while (1){

if(TP1==1){
TR0 = 1;
while(1){

if(TP1==0){
TR0 = 0;
break;

}
break;

}
}
}


}

void Zeit_auswerten (){
if(TH >=0xC1 & TL0 >= 0x80){
Pumpe = 0;
}

}
void main (void){

while(1){
if(Schalter==1){
Pumpe=1;
Ultraschall();
Zeit_auswerten();
}
}
}

hoffe es stimmt so und ist nachvollziehbar ^^
Ach ja ich bin erst wieder am Montag da :) bin an nem Festival

von R. W. (quakeman)


Lesenswert?

Wenn du schon ursprünglich ein Assembler Programm hier präsentierst, 
dann solltest du dich erst mal über die Assembler Befehle genau 
informieren.

Der CJNE Befehl vergleicht zwar auf ungleich, hat aber die Besonderheit, 
daß er ebenfalls auch einen Vergleich auf Akku kleiner Vergleichswert 
macht. Falls der Inhalt des Akku kleiner ist als der Vergleichswert wird 
das Carry Flag gesetzt, andernfalls nicht. Somit kannst du mit dem CJNE 
Befehl nicht nur ein ungleich, sondern auch ein kleiner-gleich 
realisieren.

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.