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)
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.
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 ?
Ich vermute, dass damit zum Timer gehörende Interrupts freigeschaltet werden. Aber wie ich bereits sagte: schau einfach in das Datenblatt.
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
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.
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. ;)
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
>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
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
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? :)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.