Testaufbau mit dem HT46F47E

Elektronik-Labor  Projekte   Holtek



 
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.





Elektronik-Labor  Projekte   Holtek