
Testaufbau mit dem HT46F47E
Jetzt kommt der spannende Moment: Tut der programmierte Chip
genau das, was er soll? Also Quarz dran, Reset-Widerstand, Spannung anlegen. Am Oszi
sieht man, ob der Quarz schwingt. Ohne den Reset-Widerstand geht nichts, anders
als beim AVR ist er intern nicht enthalten. Aber sobald man Reset hochzieht,
schwingt der 4-MHz-Quarz an. Im Datenblatt gibt es ein Schaltbild für die
minimale Beschaltung. Und laut Datenblatt braucht der Quarz im Normalfall
keinen zusätzlichen Kondensatoren.
Zusätzlich habe ich noch die sechs Ampel-LEDs mit
Vorwiderständen am Port A eingefügt, wie es das C-Programm nahelegt. Und es
funktioniert! Jetzt weiß ich endlich auch, was ich mich noch nie gefragt
habe, nämlich wie die Ampeln in Taiwan schalten. Am Ende der Grün-Phase blinkt
die grüne Lampe. Erst dann kommt Gelb, danach Rot. Dafür geht es dann wieder
direkt und ganz ohne Gelb von Rot auf Grün. Nicht schlecht, ich könnte mir
vorstellen, dass das hier auch sinnvoll wäre. Und noch etwas wird sichtbar: Das
Programm läuft mit 4 MHz zu schnell, da müsste man noch etwas an den Wartezeiten
ändern.
#include "HT46F47E.h"
//Traffic Light
//Body: HT48C10-1
//Mask option
//All the mask options use the default value.
const unsigned char table[16]={
0x14, 0x4, 0x14, 0x4, 0x14, 0x4, 0x14, 0x24,
0x41, 0x40, 0x41, 0x40,0x41, 0x40, 0x41, 0x42 };
#pragma vector isr_4 @ 0x4
#pragma vector isr_8 @ 0x8
#pragma vector isr_c @ 0xc
//ISR for safequard
void isr_4(){} // external ISR
void isr_8(){} // timer/event 0
void isr_c(){} // timer/event 1
//initialize registers for safeguard
void safeguard_init(){
_intc = 0;
_tmrc = 0;
_tmr = 0;
_pac = 0xff; //input mode
_pbc = 0xff;
}
//a long time delay
void mydelay(unsigned int times){
while(times--) _delay(65000);
}
void main(){
unsigned char i, j, idx;
safeguard_init();
_pac = 0; //set port A to output port
_pa = 0; //zero port A (all light on)
while(1) {
idx = 0;
for(i=0; i!=2; i++) {
_pa = table[idx];
idx++;
mydelay(8);
for(j=0; j!=6; j++) {
_pa = table[idx];
idx++;
mydelay(1);
}
_pa = table[idx];
idx++;
mydelay(4);
}
}
}
Beim ersten Test gab es noch ein seltsames Phänomen. Bei
jedem zweiten Durchlauf blinkte die rote Ampel einmal kurz, was aber so nicht
im Programm steht. Offensichtlich hat hier der Watchdog zugeschlagen! Im
Programm gibt es jedenfalls keinen Watchdog-Reset, und der aktive Watchdog
gehört zu den Default-Einstellungen. Also nochmal ins C-Projekt, zu den
Options, WDT abschalten. Damit habe ich gegenüber den Default-Einstellungen
genau ein Bit geändert.
Aber wie bekomme ich die Options in den Brenner geladen?
Zuerst habe ich nach der passenden Datei gesucht. Aber dann wurde schließlich
klar: Man gibt nur die MTP-Datei an. Das Brenner-Programm holt sich dann
automatisch die weiteren zugehörigen Daten aus dem Projekt. Nicht schlecht, so
ist es praktisch gar nicht möglich, die „Fuses“ zu vergessen oder falsch zu
programmieren. Das eine geänderte Bit habe ich dann auch in den Otion-Daten
wiedergefunden. Und nach dem Brennen lief die Ampel rund.