004
24.04.2022, 21:38 Uhr
Bert
|
Zitat: | P.S. schrieb Das Standard-Werk ist Kieser/Bankel: Einchipmikrorechner,
|
Ja, aber so richtig schön ist Kieser/Bankel nicht. Die Kollegen haben für meinen Geschmack zu viele Begriffe ins Deutsche übersetzt, was das Verständnis eher erschwert.
Ich habe auch das UM001604-0108 von Zilog. Das ist o.k. enthält aber auch neuere Features, die die alten Chips noch nicht haben.
Zitat: | Bormann/Rentzsch: Einchip-Mikrorechner.
|
Das kannte ich noch nicht, werde ich mir bei Gelegenheit anschauen (Danke Holger!).
Das ist so in der Form nicht hilfreich.
Zitat: | Du programmierst nicht in Assembler?
|
Nein. Ich nehme den C-Compiler von Zilog (z8cc.exe). KEEPASM und KEEPLST funktionieren zwar nicht, aber mit dem Debugger vom JTCEMU kann man sich prima durchsteppen (Danke Jens!).
Zitat: | volkerp schrieb Ein Nop reicht, die Pipeline hat nur einen Befehl im Prefetch. |
Ja, hier leider nicht. Der Zählerstand von T1 wird erst aktualisiert, nachdem der Vorteiler weitergezählt hat.
Aber: Ich habe im obigen Code noch einige Fehler gefunden.
1. Bevor man das Bit TMR.2 setzt, müssen PRE1 und T1 befüllt werden:
Quellcode: | // Initialisierung
// single-run, interne Quelle, Vorteiler PRE1 = ( 1 << 1) + (T1_PRESCALER << 2); T1 = T1_TIME; // jetzt PRE1 und T1 einladen set_bit( TMR, 2);
|
2. Das Polling macht man am Besten nicht auf den Zählerstand, sondern auf das Bit IRQ.5:
Quellcode: | // geht, nennt sich 'polled processing' while( bit_is_clear( IRQ, 5)) {}; clear_bit( IRQ, 5);
|
Ein IRQ-Routine geht natürlich auch. Aber wenn die auch nur ein Flag setzt, wäre das hier overkill.
3. Im single-pass-Modus, muss der Timer nicht nur neu gestartet werden, sondern auch vor jeder Nutzung ein 'reload' erhalten. Dafür werden die Bit 2 und 3 im TMR-Register gleichzeitig gesetzt:
Quellcode: | // T1, laden + starten TMR |= 0x0C;
|
Wenn man nur T1 startet (Bit 3), läuft der Timer bei 256 los. Und ich habe mich die ganze Zeit gewundert, warum meine Zeiten nicht stimmen...
Grüße, Bert |