www.mikrocontroller.net

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


Autor: Thomas Riedel (freddyt)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Riedel (freddyt)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Riedel (freddyt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Thomas Riedel (freddyt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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? :)

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Riedel (freddyt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.