Home

Dokument_1

image

Contents

1. LCD_IR amp LCD_BUSY Schreibt value in das uebergebene Register des uebergebenen Controllers void lcd_write uint8_t controller uint8_t reg uint8_t value Der Controller soll auf den LCD EPROM Bus schreiben misc_set_data_direction MISC_DD_UC switch reg Schreibziel case LCD_I PORTC break Schreibziel case LCD_D PORTC break R amp R 1 lt lt RS 1 lt lt RS Befehlsregister Datenregister Ein falscher Wert wurde uebergeben default 41 106 107 108 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 126 127 128 129 130 131 132 133 134 136 137 138 139 140 141 142 143 144 145 146 147 148 149 151 152 153 154 misc_error break Den Wert auf die Datenleitung legen PORTA value switch controller Es soll in den oberen Controller geschrieben werden case LCD_CTL_TOP Oberen Controller aktivieren Stabilisierung abwarten und den Controller wieder deaktivieren PORTO 1 lt lt E1l _delay_us 10 PORTC amp 1 lt lt E1 break Es soll in den unteren Controller geschrieben werden case LCD_CTL_BOTTOM Unteren Controller aktivieren Stabilisierung abwarten und den Controller wieder deaktivieren PORTC 1 lt lt E2 _delay_us 10 PORTC amp 1 lt lt E2 break Ein falscher Wert wurde uebergeben defa
2. break Je nach Cursorposition ein Halfbyte nach rechts oder herunterscrollen und Cursor an den Anfang der nun letzten Zeile setzen case KEY_RIGHT if editor_cursor_position 47 Nicht rechts unten Cursor eins nach hinten editor_cursor_positiontt editor_update_cursor else if EDITOR_MAXMEMSIZE 24 gt editor_start Cursor ist rechts unten und es gibt noch Zeilen weiter unten Eine Zeile nach unten scrollen Cursor setzen und aktualisieren editor_start editor_start 8 editor_cursor_position 32 editor_display break Cursor eine Zeile nach oben ggf nach oben scrollen case KEY_UP if editor_cursor_position 16 gt 0 Cursor ist nicht in oberster Zeile Cursor setzen und anzeigen editor_cursor_position editor_cursor_position 16 editor_update_cursor else if editor_start gt 0 Cursor ist in oberster Zeile und es gibt noch Zeilen weiter oben Dann Hochscrollen editor_start editor_start 8 editor_display break Eine Zeile nach unten ggf nach unten scrollen case KEY_DOWN 64 156 157 158 160 161 162 163 164 166 167 168 169 170 171 172 173 174 176 177 178 179 180 181 182 183 184 185 186 187 188 189 191 192 193 194 195 196 197 198 199 201 202 203 204 if editor_cursor_position 16 lt 2 Cursor ist nicht in unterster Zeile Cursor setzen und anzeigen e
3. _delay_ms 60 usart_write_char editor_buffer i break PC will in den Editor schreiben Zustand wechseln und Bestaetigung senden case PC_WRITE pc_state PC_STATE_WRITE_SIZE usart_write_char PC_WRITE_SIZE break Das EPROM soll gebrannt werden also Bestaetigung senden das EPROM brennen und dann erneut Bestaetigung senden case PC_BURN usart_write_char PC_BURNING editor_burn usart_write_char PC_BURNED break break Die Groesse der zu empfangenen Daten wird empfangen case PC_STATE_WRITE_SIZE 80 178 180 181 182 183 184 185 187 188 190 191 192 193 194 195 196 197 198 200 201 202 203 204 206 207 208 210 211 212 213 214 216 217 218 219 220 221 222 223 224 226 if pc_write_i 0 MSB zuerst Zaehlvariable setzen Datum speichern und Bestaetigung senden pc_write_i 1 pc_write_size data lt lt 8 usart_write_char PC_WRITE_SIZE else Das naechste das LSB Zaehlvariable zuruecksetzen Datum speichern und Bestaetigung senden sowie Zustand wechseln pc_write_i 0 pc_state PC_STATE_WRITE pc_write_size data usart_write_char PC_WRITE_NEXT break Die Daten fuer den Editor werden empfangen case PC_STATE_WRITE Datum speichern Zaehler erhoehen editor_buffer pc_write_i t data if pc_write_i gt pc_write_size Alle Daten empfangen In den Zusta
4. Konstanten die fuer die Nachrichten stehen define PC_DISCONNECT Oo define PC_CONNECT 1 define PC_SIZE 2 define PC_INFO 3 define PC_NEPROM 4 define PC_EEPROM 5 define PC_EMPTY 6 define PC_NEMPTY 7 define PC_CLEAR 8 define PC_CLEARED 9 define PC_NCLEARED 10 define PC_FLUSH 11 76 32 33 34 36 37 38 39 40 EN 42 43 44 46 47 48 P N oO so a 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 define PC_FLUSHED 12 define PC_READ 13 define PC_WRITE 14 define PC_WRITE_SIZE 15 define PC_WRITE_NEXT 16 define PC_WRITTEN 17 define PC BURN 18 define PC_BURNING 19 define PC_BURNED 20 void pc_start void void pc_process void void pc_stop void endif A 1 18 pc c include pc h Speichert den aktuellen Zustand uint8_t pc_state PC_STATE_STOP Speichert die Groesse der zu empfangenen Daten uint16_t pc_write_size 0 Speichert die Anzahl der bereits empfangenen Daten uint16_t pc_write_i 0 Leert den Empfangspuffer void pc_flush void Solange noch Daten im Puffer sind auslesen while usart_has_data usart_read_char e Startet das PC Protokoll void pc_start void Falls das PC Protokoll laeuft erst stoppen if pc_state PC_STATE_STOP pc_stop TT 31 32 33 34 35 36 37 38 40 41 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 60
5. Startet die Uebertragung void twi_start void Nur starten wenn im richtigen Zustand if twi_lstate TWI_STATE_STOP twi_state TWI_STATE_START Start senden TWCR 1 lt lt TWEN 1 lt lt TWSTA Stoppt die Uebertragung unabhaengig vom Zustand void twi_stop void twi_state TWI_STATE_STOP Stop senden Uebertragung beenden TWCR 1 lt lt TWEN 1 lt lt TWINT 1 lt lt TWSTO Gibt den zuletzt empfangenen Wert zurueck uint8_t twi_get_data void Nur im richtigen Zustand Vebertragung beenden if twi_lstate TWI_STATE_READ_GET twi_stop Wert zurueckgeben return twi_data ZS x Prueft ob sich bei der Uebertragung etwas getan hat und reagiert darauf 70 ae s7 uint8_t twi_process void 88 89 Interrupt ist aufgetreten 90 if TWCR amp 1 lt lt TWINT 91 92 Status auslesen und verarbeiten 93 switch TWSR amp Oxf8 94 95 Start wurde uebertragen 96 case 0x08 97 98 if twi_state TWI_STATE_START 99 100 Aufrufer mitteilen dass Adresse gesetzt 101 werden kann und Zustand wechseln 102 twi_state TWI_STATE_ADDRESS_SET 103 return TWI_SET_ADDRESS 104 105 else if twi_state TWI_STATE_ADDRESS_SET 106 107 Derselbe Interrupt es wurde nur 108 noch nicht die Adresse gesetzt 109 Aufrufer noch einmal mitteilen 110 dass Adresse gesetzt werden kann 11
6. case KEY_SK1 Editor menu_ret menu_editor break case KEY_SK2 Auslesen menu_display MENU_WAIT editor_read_eprom menu_ret menu_editor break 60 379 380 381 382 383 384 386 387 388 389 390 391 392 393 a e Go N e O N Q 11 12 13 14 16 17 18 19 20 21 D E w N oo N Q case KEY_SK3 Info menu_ret menu_info break case KEY_SK4 PC menu_ret menu_pc break return 0 A 1 11 editor h ifndef __EDITOR_H__ def inc inc inc ine __EDITOR_H__ lude lcd hi lude menu bi lude misc h Konstante die die Speichergroesse des Editors def uint uint void void void void void void end ine EDITOR_MAXMEMSIZE EPROM_SIZE 16_t editor_end_pointer 8_t editor_buffer EDITOR_MAXMEMSIZE editor_init void editor_handle_keystroke uint8_t key editor_display void editor_clear void editor_read_eprom void editor_burn void if A 1 12 editor c include editor h angibt Addresse des ersten angezeigten Bytes links oben im Display uint 16_t editor_start 0 Zaehlt Position der Halbbytes uint8_t editor_cursor_position 0 61 10 11 12 13 14 16 Er 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 56 57 Adresse nach dem letzten bearbeiteten Byte uint16_t editor_end_pointer
7. 339 340 341 342 A 1 7 eprom h ifndef __EPROM_H__ define __EPROM_H__ e N include lt avr io h gt include lt inttypes h gt 6 include lt util delay h gt CD 46 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 36 e N Oo s Q u 11 12 13 14 16 17 include misc h Konstanten mit denen der Typ des EPROMs angegeben wird define EPROM_NOEPROM O define EPROM_NEPROM 1 define EPROM_EEPROM 2 Konstante die die Groesse des EPROMS angibt define EPROM_SIZE 2048 Konstanten mit denen angegeben wird ob das EPROM leer oder beschrieben ist define EPROM_NEMPTY O define EPROM_EMPTY 1 uint8_t eprom_get_type void uint8_t eprom_read uint16_t address void eprom_write_start void void eprom_write_stop void void eprom_write uint16_t address uintd_t data uint8_t eprom_is_empty void void eprom_clear_eeprom void endif A 1 8 eprom c include eprom h Ermittelt den EPROM Typ anhand der Schalterstellung auf der Platine uint8_t eprom_get_type void Falls eine 1 an Pin EPEEP anliegt der Schalter steht auf EPROM ist das EPROM ein normales EPROM if PIND amp 1 lt lt EPEEP return EPROM_NEPROM else return EPROM_EEPROM D 47 18 20 21 22 23 24 26 27 28 29 30 31 32 33 34 36 37 38 39 40 EN 42 43 44 46 47 48 49 50 51
8. Die beiden folgenden Pins 6 und 7 E1 und E2 aktivieren jeweils den oberen bzw unteren im Display integrierten Controller so dass dieser den anstehenden Befehl bzw die anstehenden Daten bernehmen kann 14 Zuletzt folgen auf den Pins 8 bis 15 die Datenleitungen DO bis D7 ber die Nutzdaten ans Display bertragen werden Der Displaycontroller kann sowohl mit 4 als auch mit 8 Bit breitem Datenbus arbeiten Im 4 Bit Modus werden die 8 Bit breiten Datenworte auf 2 aufeinanderfolgende 4 Bit Nachrichten die ber die Leitungen D4 bis D7 bertragen werden aufgeteilt die anderen Datenleitungen werden dabei nicht benutzt 5 3 2 Ansteuerung der 44780 kompatiblen Controller Die Ansteuerung der beiden verbauten Displaycontroller erfolgt also ber die Pins 4 bis 15 Eine bersicht ber die m glichen Befehle gibt Tabelle 4 Quelle Hit44780 auf die sich auch die im Folgenden genannten Befehlsnummern beziehen Im Folgenden soll eine typische M glichkeit zur Ansteuerung des Displays gezeigt werden In der Initialisierungsphase werden die Controller zun chst parametrisiert Das erfolgt mit Befehl 6 der verschiedene Grundeinstellungen erm glicht Bit D4 w hlt zwischen einem Betrieb mit 4 und 8 Bit breitem Bus aus wobei eine 1 den 8 Bit Betriebsmodus w hlt D3 teilt dem Controller mit ob er nur eine Displayzeile 0 oder 2 bzw 4 Display zeilen in einem Kombidisplay wie dem hier verwendeten zu verwalten hat D2 schaltet zwischen zwe
9. e N oo no a 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 define define define define define define define define uint8_t endif KEY_SK1 0x14 KEY_SK2 0x15 KEY_SK3 0x16 KEY_SK4 0x17 KEY_OK 0x18 KEY_PDOWN 0x19 KEY_PUP Oxia KEY_NONE Oxff menu_main void A 1 10 menu c include menu h Zeigt das uebergebene Menue an indem das LCD erst geleert und danach neu beschrieben wird void menu_display uint8_t menu Leert das LCD so dass spaeter nur noetige Zeichen geschrieben werden muessen lcd_clear switch menu case MENU_WAIT Warteanzeige lcd_write_string LCD_LINE1 Bitte warten lcd_write_string LCD_LINE4 20 Abbruch break case MENU_MAIN Hauptmenue lcd_write_string LCD_LINE1 Hauptmenue lcd_write_string LCD_LINEA Editor Auslesen InfoluuPC break case MENU_INFO_E_EMPTY EPROM ist leer lcd_write_string LCD_LINEl1 Info lcd_write_string LCD_LINE2 Das EPROM ist leer lcd_write_string LCD_LINEA reload lcd_write_string LCD_LINE4 20 zurueck break case MENU_INFO_E_N_EMPTY EPROM ist nicht leer lcd_write_string LCD_LINEl1 Info lcd_write_string LCD_LINE2 53 36 37 38 39 40 EN 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 66 67 68 69 70 TA 72 73 74 76 77 78 79 80 81 82 8
10. 0 Speichert ob ein nicht leeres EEPROM eingesteckt ist uint3 _t ee_n_empty 0 while menu_ret 0 menu_ret 0Oxff if menu_ret lt Oxff Warte Anzeige menu_display MENU_WAIT if eprom_is_empty Leeres E EPROM if eprom_get_type EPROM_NEPROM Leeres EPROM menu_display MENU_INFO_E_EMPTY else Leeres EEPROM menu_display MENU_INFO_EE_EMPTY else Nicht leeres E EPROM if eprom_get_type EPROM_NEPROM Nicht leeres EPROM menu_display MENU_INFO_E_N_EMPTY else Nicht leeres EEPROM menu_display MENU_INFO_EE_N_EMPTY ee_n_empty 1 menu_ret Oxff switch menu_get_keystroke case KEY_SK1 Aktualisieren menu_ret 0 break case KEY_SK2 EEPROM loeschen Nur nicht leere EEPROMs loeschen 56 183 184 185 187 188 190 191 192 193 194 195 196 197 198 200 201 202 203 204 205 206 207 208 210 211 212 213 214 216 217 218 219 220 221 222 223 224 226 227 228 229 230 231 if ee_n_empty menu_display MENU_INFO_CLEARING_EE eprom_clear_eeprom menu_ret 0 break case KEY_SKA4 Zurueck menu_ret 1 break b return menu Cet 1 Zeigt das PC Menue und startet bzw stoppt das PCG Protokoll uint8_t menu_pc void uint8_t menu_ret 0 while menu_ret 0 menu_ret 0Oxff if menu_ret lt Oxff menu_display MENU_PC Starte
11. 0 Zwischenspeicher fuer eingegebene Daten uint8_t editor_buffer EDITOR_MAXMEMSIZE Sprungziele fuer den Cursor Beginn der einzelnen Bytes const uint8_t editor_tabs 7 9 12 14 18 20 23 25 Sprungziele fuer den Cursor Beginn der einzelnen Half Bytes const uint8_t editor_real_pos 7 8 9 10 12 13 14 15 18 19 20 21 23 24 25 26 Inititalisiert den Editor mit einem leeren Puffer void editor_init void uint16_t i 0 Jedes Zeichen im Puffer auf Oxff setzen leeren for i 0 i lt EDITOR_MAXMEMSIZE i editor_bufferl i Oxff Z Setzt den Cursor des LCD an die Position auf die editor_cursor Zeigt void editor_update_cursor void Berechnet die Zeile und die Position in der Zeile und setzt den Cursor dorthin lcd_set_position editor_cursor_position 16 27 editor real posleditor cursor position 16 Zeichnet den Editorinhalt der aktuellen Stelle void editor_display void Speichert LCD Zeilen Konstanten fuer einfachen Zugriff uint8_t line LCD_LINE1 LCD_LINE2 LCD_LINE3 LCD_LINE4 uint8_t j 0 62 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 74 76 Tr 78 79 80 81 82 83 84 86 87 88 89 90 9 92 93 94 96 97 98 99 100 101 102 103 104 106 Zeichne Zeilen 1 3 in der 4 stehen die Menuepunkte for j 0 j lt 3 j Initialisiere
12. else if typed_key KEY_NONE Taste wurde noch nicht losgelassen 20 ms warten Entprellung dazwischen USI bearbeiten Fehlendes Delay passiert in usi_process if i lt 2 _delay_ms 1 itt else if check_keystroke KEY_NONE Taste wurde losgelassen typed_key pressed_key USI bearbeiten und Rueckgabe speichern usi_process_return usi_process if usi_process_return USI_NOP Nichts interessantes passiert Timeout Zaehler erhoehen bs if j gt USI_TIMEOUT Timeout erreicht Fehler annehmen USI zuruecksetzen j 0 usi_reset else Etwas interessantes passiert Timeout zuruecksetzen j 0 if usi_process_return USI_SET_DATA Taste muss an USI gegeben werden Gedrueckte Taste uebergeben usi_set_data typed_key if typed_key KEY_NONE Eine Taste war getippt worden Tastendruecke zuruecksetzen 87 204 205 206 207 208 209 210 211 212 213 214 215 216 217 e N oOo no Oo 10 11 12 13 14 16 ET 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 pressed_key KEY_NONE typed_key KEY_NONE else if usi_process_return USI_GET_DATA Ein Datum wurde empfangen Fehler annehmen da der Tastencontroller nur sendet usi_reset return 0 A 2 3 usi h ifndef __USI_H__ define __USI_H__ include lt avr io h gt include lt int
13. lcd_set_position pos Waehle Controller entsprechend Cursorposition if pos lt 54 lcd_write LCD_CTL_TOP LCD_DR ch else lcd_write LCD_CTL_BOTTOM LOCH DR ch Schreibt den uebergebenen String an die angegebene Position void lcd_write_string uint8_t pos char str uint8_t i 0 Schreibe das i te Zeichen an die pos i te Position 0x00 markiert das Ende einer Zeichenkette while str i 0 lcd_write_char pos i str i itt Leert das LCD void lcd_clear void lcd_write LCD_CTL_TOP LCD_IR 0x01 lcd_write LCD_CTL_BOTTOM LCD_IR 0x01 45 302 303 304 Aktiviert oder deaktiviert den Cursor aus void lcd_display_cursor uint8_t enable 306 307 if enable 308 Auswahl des Controllers in dem der Cursor aktiviert 309 werden soll 310 if lcd_cursor amp 0x02 311 312 unterer Controller 313 lcd_write LCD_CTL_BOTTOM LCD_IR OxOe 314 lcd_cursor 0x03 315 316 else 317 318 oberer Controller 319 lcd_write LCD_CTL_TOP LCD_IR OxOe 320 lcd_cursor 0x01 321 322 323 324 else 325 Auswahl des Controllers in dem der Cursor 326 deaktiviert werden soll 327 328 if Led cursor amp 0x02 329 330 unterer Controller 331 lcd_write LCD_CTL_BOTTOM LCD_IR Ox0c 332 lcd_cursor 0x02 333 else 334 335 oberer Controller 336 lcd_write LCD_CTL_TOP LCD_IR Ox0c 337 lced_cursor 0x00 338
14. uint16_t i 0 Schreibe in jedes Byte OxFF for i 0 i lt EPROM_SIZE i eprom_write i Oxff Beende den Brennvorgang eprom_write_stop l e N oOo s Q Oo 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 46 47 A 1 9 menu h ifndef __MENU_H__ define __MENU_H__ include lt inttypes h gt include lcd hi include twi h include eprom h include editor h include pc h Konstanten die fuer die verschiedenen Menues stehen define MENU_WAIT Oo define MENU_MAIN 1 define MENU_INFO_E_EMPTY 2 define MENU_INFO_E_N_EMPTY 3 define MENU_INFO_EE_EMPTY 4 define MENU_INFO_EE_N_EMPTY 5 define MENU_INFO_CLEARING_EE 6 define MENU_PC 7 define MENU_EDITOR 8 define MENU_BURN 9 define MENU_BURNING 10 define MENU_BURNED 11 Hier werden die vom Tastencontroller uebergebenen Codes menschenlesbaren Konstanten zugewiesen define KEY Oo 0x00 define KEY_1 0x01 define KEY_2 0x02 define KEY_3 0x03 define KEY_4 0x04 define KEY_5 0x05 define KEY_6 0x06 define KEY_7 0x07 define KEY_8 0x08 define KEY_9 0x09 define KEY_A 0x0a define KEY_B 0xOb define KEY_C 0x0c define KEY D 0x0d define KEY E Ox0e define KEY_F 0x0 f define KEY_LEFT 0x10 define KEY_RIGHT 0x11 define KEY_DOWN 0x12 define KEY_UP 0x13 52 48 49 50 51 52 53 54 56 57 58 59
15. 24 26 27 28 29 30 31 32 33 34 36 37 38 39 40 EN 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 define Port define define define define define define WIRE_ORANGE 1 B WIRE_GREEN 0 WIRE_RED 1 WIRE_BLUE 2 WIRE_BROWN 3 WIRE_YELLOW 4 WIRE_WHITE 6 Definition von Tastencodes define define define define define define define define define define define define define define define define define define define define define define define define define define define define endif KEY_O 0x00 KEY_1 0x01 KEY_2 0x02 KEY_3 0x03 KEY_4 0x04 KEY_5 0x05 KEY_6 0x06 KEY_7 0x07 KEY_8 0x08 KEY_9 0x09 KEY A O0x0a KEY D 0x0b KEY C Ox0c KEY D O0x0d KEY E Oste KEY EF 0x0 f KEY LEET 0x10 KEY_RIGHT 0x11 KEY_DOWN 0x12 KEY_UP 0x13 KEY_SK1 0x14 KEY_SK2 0x15 KEY_SK3 0x16 KEY_SKA 0x17 KEY_OK 0x18 KEY_PDOWN 0x19 KEY PUP Oxia KEY_NONE Oxff A 2 2 tastencontroller c include tastencontroller h e N na u Maske fuer die Tastenkabel die an Port A liegen const uint8_t WIRES_AT_A 1 lt lt WIRE_ORANGE 1 lt lt WIRE_PURPLE Maske fuer die Tastenkabel die an Port B liegen const uint8_t WIRES_AT_B 1 lt lt WIRE_GREEN 1 lt lt WIRE_RED 83 1 lt lt WIRE_BLUE 1 lt lt WIRE_BROWN 1 lt lt WIRE_YELLOW 1 lt lt WIRE_WHITE Maske fuer die Tastengruppen die an Port D liegen con
16. 52 53 54 56 57 58 59 60 61 62 63 64 66 Liest den Wert der an der uebergebenen Adresse im EPROM gespeichert ist aus und gibt ihn zurueck uint8_t eprom_read uint16_t address Das EPROM soll auf den LCD EPROM Bus schreiben misc_set_data_direction MISC_DD_EPROM Die Adresse wird auf die Adressleitungen gelegt PORTB address amp Oxff PORTD amp 0x70 PORTD address gt gt 4 amp 0x70 Stabilisierung abwarten _delay_us 10 Wert lesen und zurueckgeben return PINA Speichert ob der welcher EPROM Typ uint _t eprom_type Initialisiert den von eprom_write Brennvorgang initialisiert wurde und gebrannt wird EPROM_NOEPROM Brennvorgang muss vor dem ersten Aufruf aufgerufen werden void eprom_write_start void Falls eprom_write_start bereits aufgerufen wurde ohne zwischenzeitlich eprom_write_stop aufzurufen erzeuge eine Fehlermeldung if eprom_type EPROM_NOEPROM misc_error return if eprom_get_type EPROM_NEPROM Setze den Typ des EPROMs und aktiviere die Brennspannung fuer das EPROM via VPPWE eprom_type EPROM_NEPROM PORTD amp 1 lt lt VPPWE 48 67 else Setze PROM Typ auf EPROM keine Beeinflussung der Brennspannung noetig eprom_type EPROM_EEPROM Warte bis die Brennspannung korrekt anliegt _de
17. Hr P N oOo no Oo 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 P N oOo no Oo 10 14 Anhang A Quelltexte A 1 Hauptcontroller A 1 1 hauptcontroller h ifndef __HAUPTCONTROLLER_H__ define __HAUPTCONTROLLER_H__ include lt avr io h gt include menu h include usart h include twi h include lcd bi include editor h Konstante mit der die Baud Rate fuer die USART Uebertragung festgelegt wird define USART_BAUD 9600 I Konstante mit der festgelegt wird dass die interne Verdoppelung der USART Baud Rate genutzt werden soll Dies fuehrt zu einem niedrigeren Wert im UBRR fuer die gleiche Baud Rate und einer deutlichen Fehler Verringerung bei der Vebertragung 0 2 statt 7 define USART_DOUBLE 1 endif A 1 2 hauptcontroller c include hauptcontroller h I Initialisiert den Controller und die angeschlossenen Komponenten void init void Aktiviert USART und TWI usart_init USART_BAUD USART_DOUBLE twi_init 33 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 int Setzt die initialen Datenrichtungen der Pins am Controller Deaktiviert den Output am LCD EPROM Bus Port A und am EPROM EEPROM Schalter Pin D3 Aktiviert den Output fuer die EPROM Adressle
18. N oo no a 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 P N no u return hb b A 1 5 Icd h ifndef __LCD_H__ define __LCD_H__ include lt avr io h gt include lt inttypes h gt include lt util delay h gt include misc h define LCD CL OPO define LCD_CTL_BOTTOM 1 define LCD_IR O define LCD_DR 1 define LCD_BUSY 0x80 define LCD_LINEIl Oo define LCD_LINE2 27 define LCD_LINE3 54 define LCD_LINEA 81 define RS PORTC2 define E1 PORTC4A define E2 PORTC5 void lcd_init void void lcd_write_char uintd_t pos uint8_t ch void lcd_write_string uint8_t pos char str void 1lcd_clear void void lcd_set_position uint8_t pos void lcd_display_cursor uint8_t cursor endif A 1 6 Icd c include lcd bi Speichert den aktuellen Status des Cursors Ist Bit O0 gesetzt so wird der Cursor angezeigt ansonsten nicht Ist Bit 1 gesetzt so wird der Cursor im unteren Controller angezeigt sonst im oberen uint38_t lcd_cursor 0 39 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 Liest den Wert des uebergebenen Registers des uebergebenen Controllers aus und gibt ihn zurueck uint8_t lcd_read uint8_t controller uint8_t reg uint8_t value 0 Das LCD soll auf
19. als Masterger t zieht der Hauptcontroller SDA auf Massepotential w hrend die Taktleitung SCL an Vcc liegt Nach Senden der Start Condition bertr gt der Master ein Adresspaket das aus 7 Adress Bits und einem Read Write Bit besteht Dieses Paket bestimmt mit welchem anderen Ger t am Bus kommuniziert werden soll und ber das Read Write Bit ob dieses als Sender oder Empf nger auftreten soll Der Slave zu dem die bertragene Adresse geh rt bertr gt mit dem 9 Bit sein ACK er legt dabei SDA an Masse wenn er bereit f r eine bertragung ist und durch eine logische 1 im Read Write Bit als Sender konfiguriert wurde Hat der Slave sein ACK gesendet liest der Master die n chsten 8 Datenbits von SDA welches nun der Slave kontrolliert Die Taktgenerierung wird weiterhin vom Master bernommen Mit dem 9 Bit kann nun der Master ein ACK senden und so seine Bereitschaft zum Empfang eines weiteren Bytes signalisieren Im vorliegenden Fall m ssen aber keine weiteren Daten bertragen werden Nach dem Empfang eines Bytes mit dem eine eventuell gedr ckte Taste bermittelt wird sendet der Master kein ACK l sst also SDA an Vcc und beendet schlie lich die Kommunikation mit einer sog Stop Condition Dabei wird SDA von Masse auf Vcc gezogen w hrend gleichzeitig SCL ebenfalls an Vcc liegt Anschlie end kann eine neue Kommunikation gestartet werden 6 2 5 Kommunikation mit dem PC Trotz der angestrebten Unabh ngigkeit von einem PC wurde
20. else if b amp 1 lt lt WIRE_RED 0x00 60 return 2 61 else if b amp 1 lt lt WIRE_BLUE 0x00 62 return 3 63 else if b amp 1 lt lt WIRE_BROWN 0x00 64 return 4 65 else if b amp 1 lt lt WIRE_YELLOW 0x00 66 return 5 67 else if b amp 1 lt lt WIRE_WHITE 0x00 68 return 6 69 else if a amp 1 lt lt WIRE_PURPLE 0x00 70 return 7 71 else if a amp 1 lt lt WIRE_ORANGE 0x00 72 return 8 73 74 75 76 Keine Taste wurde gedrueckt 77 return 0 73 79 so 81 Prueft alle Tastengruppen auf eine gedrueckte Taste und gibt 82 diese zurueck en sa uint8_t check_keystroke void 85 Nummer des Kabels der gedrueckten Taste 86 uint8_t wire 87 Nummer der aktuellen Tastengruppe 88 uint8_t group 89 90 Alle Gruppen auf eine gedrueckte Taste ueberpruefen 91 vorzeitig abbrechen sobald eine gefunden wurde 92 for group 0 group lt 4 group t 93 wire check_group groups group 94 95 if wire 0 Eine Taste wurde gedrueckt 96 break 97 98 99 100 if wire 0 Eine Taste wurde gedrueckt Die zu der Gruppe und dem Kabel gehoerende Taste zurueckgeben return keys group 8 wire 1 else Keine Taste wurde gedrueckt 85 106 107 108 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
21. 133 134 136 137 138 139 140 141 142 143 144 145 146 147 148 149 151 152 153 154 return KEY_NONE Initialisiert den Tastencontroller Setzt Datenrichtungen und Pull Up Widerstaende der Ports und initialisiert USI void init void int Z Initialisiert USI usi_init Setzt die Datenrichtungen fuer die Zeilen und Spaltenleitungen und setzt sie auf lesend Beim Veberpruefen auf Tastendruecke wird Port D teilweise kurzzeitig auf schreibend gesetzt DDRA amp WIRES_AT_A DDRB amp WIRES_AT_B DDRD amp WIRES_AT_D Aktiviert die Pull Up Widerstaende an den Tastenkabeln und deaktiviert sie fuer die Tastengruppen PORTA WIRES_AT_A PORTB WIRES_AT_B PORTD amp WIRES_AT_D Wird beim Starten des Controllers aufgerufen Initialisiert den Controller und bearbeitet dann in einer Endlos schleife Tastendruecke und Anfragen des Hauptcontrollers main void Initialisierung init uint3_t usi_process_return uints_t i 0 uint8_t j 0 Endlosschleife while 1 if pressed_key KEY_NONE Noch keine Taste gedrueckt Auf Tastendruck ueberpruefen pressed_key check_keystroke 86 164 165 167 168 169 170 171 172 173 174 175 177 178 179 180 181 182 183 184 185 187 188 190 191 192 193 194 195 197 198 200 201 202 203 Hilfsvariable zuruecksetzen i OD
22. Platinenlayouts 33 33 33 33 33 35 35 39 39 46 47 52 53 61 61 68 69 73 74 76 77 82 82 83 88 89 94 94 94 95 95 96 98 1 Projekt berblick Das Hardwarepraktikum der Informatikstudieng nge an der Universit t Koblenz das f r den Studiengang Informatik eine Pflichtveranstaltung ist soll die theoretischen Kenntnisse aus begleitenden Vorlesungen praktisch vertiefen Neben grundlegenden Schaltungen und Schaltnetzen der Elektrotechnik sowie weiterf hrendem Programmieren von Mikrocontrollern ist der Aufbau von Schaltwerken mit Hilfe von Festwertspeichern engl Read Only Memory ROM ein Thema des Praktikums Die Programmierung der Festwertspeicher wird derzeit mit Hilfe von Einplatinencom putern des Typs Siemens ECB85 durchgef hrt Diese Experimentiercomputer verf gen mit einer hexadezimalen Tastatur und einer achtstelligen Sieben Segment Anzeige ber eine einfache wenig komfortable Benutzerschnittstelle Ein fest gespeichertes Programm erlaubt das Schreiben kleiner Programme von unter 1 KiB in EPROMs Obwohl die eingesetzten EPROMs eine Speicherkapazit t von 2KiB besitzen ist die beschr nkte Programmierf higkeit kein Problem f r den Einsatz im Hardwarepraktikum weil die zu brennenden Programme in ihrer Gr e bei weitem nicht an die Grenze von 1KiB heranreichen Das Alter der ECB85 die im Jahre 1981 eingef hrt wurden f hrt allerdings mittlerweile zu h ufigen Defekten Ersatzteile f r die Ger te s
23. beiden Controllern PORTA value switch controller case LCD_CTL_TOP PORTC 1 lt lt E1 _delay_us 10 PORTC amp 1 lt lt E1 In der Icd h wurde die Konstante E1 so definiert dass sie auf Pin 4 von Port C zeigt E2 analog auf Pin 5 Nachdem ein Datenwort an Port A angelegt wurde wird der gew nschte Displaycontroller durch Anlegen eines High Pegels an Pin 4 oberer Controller oder Pin 5 unterer Controller von Port C ausgew hlt Das Programm wartet daraufhin 10 Mikrosekunden um dem Controller gen gend Zeit f r die bernahme der Daten zu geben und deaktiviert den Controller dann wieder Nach dem Senden eines Befehls an den Controller muss zun chst gepr ft werden ob der Controller die Verarbeitung des letzten Befehls abgeschlossen hat und wieder bereit ist bevor der n chste Befehl gesendet werden kann Dazu wird aus dem Controller mittels RS 0 und R W 1 das Busy Flag das 8 Bit des Antwort Bytes und die aktuelle Adresse im DD CG RAM gelesen Ist der Controller besch ftigt so ist das Busy Flag auf 1 gesetzt ansonsten kann der n chste Befehl gesendet werden Diese berpr fung wird von der Funktion Icd_check_busy vorgenommen und muss f r jeden Controller einzeln vorgenommen werden 20 oo no a e Co N o e o o H e HM ba O 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 6 2 3 Zugriff auf die Speicherbausteine Alle Funktionen f r Zugriffe auf das PROM sind in der Quell
24. das PC Protokoll pc_start menu_ret Oxff b switch menu_get_keystroke case KEY_SKA4 Zurueck Stoppt das PC Protokoll pce_stop menu_ret 1 break 57 232 234 235 236 237 239 240 241 242 243 244 245 246 247 248 249 250 251 252 254 255 256 257 259 260 261 262 263 264 265 266 267 269 270 271 272 273 274 275 276 277 278 279 280 return menu_ret 1 fa Zeigt das Brennmenue und brennt das EPROM uint8_t menu_burning void uint8_t menu_ret 0 while menu_ret 0 menu_ret 0Oxff if menu_ret lt Oxff Zeigt die Brennmeldung an brennt das EPROM und zeigt abschliessend die Gebrannt Meldung an menu_display MENU_BURNING editor_burn menu_display MENU_BURNED menu_ret Oxff switch menu_get_keystroke case KEY_SKA4 Zurueck zum Editor menu_ret 2 break return menu_ret 1 D Z Zeigt das Brennbestaetigungsmenue uint8_t menu_burn void uint8_t menu_ret 0 while menu_ret 0 menu_ret 0Oxff if menu_ret lt Oxff menu_display MENU_BURN menu_ret Oxff 58 281 switch menu_get_keystroke 282 283 case KEY_OK Brennen 284 menu_ret menu_burning 285 break 286 287 case KEY_SKA4 Zurueck 288 menu_ret 1 289 break 290 291 292 293 294 295 return menu_ret 1 296 297 298 299 Zeigt den Editor an 300 am uint
25. eine Option entwickelt die es erlaubt das Programmierger t vom PC aus zu bedienen Dabei werden jedoch keine neuen Funktionalit ten hinzugef gt sie dient lediglich als bequemere Alternative zu der eingebauten Tastatur sowie dem Display Das im Folgenden besprochene Kommunikationsprotokoll wurde im Hauptcontroller implementiert es wurde jedoch kein Client f r den PC entwickelt Bei der Implementierung eines solchen Programms sollten die Hinweise in der Protokollbeschreibung beachtet werden um eine sichere Kommunikation zu erm glichen Die Kommunikation mit dem PC geschieht ber eine serielle RS232 Schnittstelle Als Kommunikationsparameter werden 8N1 bei einer Baudrate von 9600 genutzt also 8 Bit Daten kein Parit tsbit und zuletzt ein Stop Bit zur Synchronisation auf das bertragungsende Das Protokoll wurde bewusst einfach gehalten und ausschlie lich f r die Kommunikation zwischen PC und Programmierger t ausgelegt so dass es sehr bersichtlich ist und nur kleine Datenmengen bertragen werden m ssen Das erleichtert die Verarbeitung im Mikrocontroller Um zu verhindern dass der PC schneller sendet als der doch vergleichsweise langsame Controller die Daten verarbeiten kann wurde eine einfache Flusskontrolle im Protokoll verankert Das Ger t sendet nach dem Empfang eines Bytes immer mindestens ein Byte zur ck worauf der PC R cksicht nehmen muss Weitere Befehle d rfen erst nach dieser Best tigung abgesetzt werden Die Kommu
26. eine Zeile der Editoransicht und trage Adresse links und Daten rechts ein char str 28 juub uuuvuuvuuvouuuuuuuuuuuuu 5 str 0 misc_halfbyte_to_char editor_start j 8 gt gt 8 str 1 misc_halfbyte_to_char editor_start j 8 gt gt 4 str 2 misc_halfbyte_to_char editor_start j 8 uint8_t i 0 for i 0 i lt 8 i str editor_tabs i misc_halfbyte_to_char editor_buffer editor_start j 8 i gt gt 4 str editor_tabs i 1 misc_halfbyte_to_char editor_bufferleditor_start j 8 il Gibt den String im LCD aus lcd_write_string linelj str Setzt den Cursor editor_update_cursor Wertet Tasteneingaben aus void editor_handle_keystroke uint8_t key switch key Je nach Cursorposition Ein Halfbyte nach links oder eine Zeile nach oben und ganz nach rechts case KEY_LEFT if editor_cursor_position 0 Cursor ist noch nicht links oben also Cursor eins nach vorne und anzeigen editor_cursor_position editor_update_cursor else if editor_start 0 Cursor ist links oben und es gibt noch Zeilen weiter oben Dann Eine Zeile nach 63 107 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 147 149 150 151 152 154 oben scrollen und Cursor aktualisieren editor_start editor_start 8 editor_cursor_position 15 editor_display
27. externen Beschaltung einen step up Spannungsregler f r die Erzeugung der Brennspannung und einen Pegel wandler f r die RS232 Schnittstelle Steckerleisten stellen die Signale f r den Anschluss des EPROM Sockels und des LC Displays zur Verf gung und ber serielle Schnitt stellen ist der Anschluss des Tastaturcontrollers eines ISP Programmierger ts f r den Mikrocontroller und eines PCs m glich Neben der Hauptplatine entstand eine kleine Platine f r den abgesetzten Tastatur controller die nur eine Fassung f r einen ATtiny2313 und Anschl sse f r die Tastatur Stromversorgung den TWI Bus und zwei Datenleitungen einer RS232 Schnittstelle bietet Diese Schnittstelle ist f r die Ausgabe von Debugging Daten vorbereitet und m sste wenn sie genutzt werden soll noch mit einem MAX232 Treiber IC verbunden werden Bei den Versionen 0 31 und 0 32 ist dar ber hinaus noch eine Platine f r einen ZIF Sockel Zero Input Force Nullkraft Sockel der als Fassung f r die PROMs dient n tig Die Schaltpl ne und Platinenlayouts der jeweils letzten Platinenversion sind im Anhang wiedergegeben Sie wurden mit der Layoutsoftware Eagle von CadSoft D erstellt die Snttp wmw nongnu org avr libc user manual group__twi__demo html Snttp wwu cadsoft de Abbildung 2 Die Platinenversion 0 2 die nur EPROMs verarbeiten konnte Abbildung 3 Die Platinenversion 0 31 mit der eine Umschaltung zwischen EPROM und EEPROM Betrieb integriert
28. hrend SCL an Masse liegt F r jedes Bit wird dann SCL einen Moment lang abh ngig von der Taktrate an VCC gelegt der Slave liest dabei den Wert von SDA aus Der TWI Bus implementiert auch eine einfache Flusskontrollm glichkeit f r die ange schlossenen Ger te Ein Slave der mit der Verarbeitung der eingehenden Daten nicht schnell genug nachkommt kann ein sendendes Ger t kurzzeitig unterbrechen indem er die SCL Leitung auf Masse zieht Dadurch wird die Weitergabe des Taktsignals auf dem Bus unterbunden Diese Flusskontrolle greift regelm ig wenn ein Slave Ger t seine Adresse in einem Adresspaket s u erkennt In diesem Fall muss der Slave zum Zeichen dass er die Adresse erkannt hat und zur Kommunikation bereit ist ein acknowledge ment kurz ACK senden Er blockiert dazu zun chst das Taktsignal indem er SCL auf Massepotential zieht bringt dann SDA auf Masse und erlaubt anschlie end wieder die Taktausbreitung Diese Signalabfolge stellt sicher dass das ACK rechtzeitig beim Masterger t ankommt W rde der Slave die Kommunikation nicht unterbrechen k nnte es passieren dass der Master die Kommunikation noch vor dem Erhalt des ACK durch einen timeout abbricht In der vorgestellten Schaltung wird nur die Master Receiver Konfiguration genutzt 22 Dabei fragt der Hauptcontroller in regelm igen Abst nden den Tastaturcontroller nach einer gedr ckten Taste ab Er initiiert dazu die Kommunikation mit einer sog Start Condition
29. leicht handhabbar sind Ein UV L schger t f r das Praktikum ist bereits vorhanden so dass sich das vorgestellte Programmierger t auf das L schen von EEPROMs beschr nken kann 3 Markt bersicht 3 1 Fertigger te Im kommerziellen Bereich sind EPROM Programmer am weitesten verbreitet die nur aus der Schreibelektronik und einer IC Fassung bestehen und ber einen angeschlossenen PC bedient werden m ssen Ger te die wie gefordert ohne PC auskommen und komplett eigenst ndig arbeiten k nnen sind selten und relativ teuer Beispiele f r solche Ger te sind das STAG P301 das derzeit f r ca 750 erh ltlich ist der Shooter XP der Firma Logical Devices f r ca 500 oder der Dataman ST von Duncan Instruments der schon seit 2004 nicht mehr gebaut wird aber gebraucht noch f r ca 600 gehandelt wird Kommerzielle Ger te k nnen in der Regel eine gro e Zahl verschiedener EPROMs beschreiben F r den Einsatz im Praktikum ist das nicht erforderlich so dass selbstent wickelte Ger te relativ einfach gehalten werden k nnen Das vorgestellte Ger t l sst sich mit Komponenten im Wert von etwa 30 in wenigen Stunden aufbauen 3 2 Komponenten Das Angebot an Komponenten f r einen Selbstbau ist derzeit sehr gut Zur Steuerung des Ger ts stehen verschiedene Familien von Mikrocontrollern zur Verf gung Wegen der vor Ort bereits vorhandenen Programmiertechnik haben wir uns f r die weit verbreite ten und g nstigen Atmel Mikroco
30. sollen B 2 Daten eingeben und brennen Ein Druck auf den Softkey Editor startet den Editor 94 In der Editoransicht steht links in jeder Zeile die Anfangsadresse des ersten Bytes das in dieser Zeile angezeigt wird in hexadezimaler Schreibweise Nach einem Doppelpunkt folgen 8 Bytes Daten ebenfalls in hexadezimaler Schreibweise Der Cursor als Unterstrich dargestellt steht beim ersten Start des Editors auf Position 000h Wird der Editor verlassen z B ber die Funktion zur ck zum Hauptmen und wieder aufgerufen bleibt die letzte Cursorposition und alle eingegebenen Daten erhalten Daten lassen sich ber die Tastatur direkt eingeben der Cursor kann mit den Cursor tasten frei verschoben werden Die Tasten PgUp und PgDn bl ttern seitenweise durch den Editorpuffer Fehler k nnen durch einfaches berschreiben der falsch eingegebenen Bytes korrigiert werden die Funktion Leeren leert auf Wunsch den gesamten Editorpuffer Sind die gew nschten Daten komplett eingegeben werden sie nach Aufruf des Men punkts Brennen und anschlie ender Best tigung ins EPROM geschrieben B 3 PROMs auslesen und kopieren Die Funktion Auslesen im Hauptmen liest die Daten eines PROMs das in der Fassung des Programmierger ts steckt aus und kopiert sie in den Editor Anschlie end wird der Editor angezeigt Damit lassen sich einerseits Daten kontrollieren die in PROMs gespeichert sind andererseits kann diese Funktion a
31. von der Betriebsspannung ausgel st werden Ein solcher Reset empfiehlt sich auch bei Kom munikationsproblemen zwischen den beiden Controllern wenn also beispielsweise keine Tastendr cke mehr akzeptiert werden 30 8 2 Ersatzteilbeschaffung Die verwendeten Mikrocontroller sind derzeit so weit verbreitet dass auch nach dem Auslaufen der Serie pinkompatible Ersatztypen zur Verf gung stehen d rften Auch die brigen verwendeten Bauteile sind Standardprodukte die noch einige Zeit im Elektronik handel erh ltlich sein d rften Das Display dagegen stammt von einem Restpostenh ndler so dass es schwierig werden k nnte einen elektrisch und mechanisch passsenden Ersatztyp zu beschaffen Da das Display aber zwei der verbreiteten HD44780 Controller verwendet k nnen alle Displays mit demselben Grundkonzept ohne nderungen am Programm verwendet werden Aber auch die Speicherbausteine der Typen 2716 und 2816 sind mittlerweile schwer zu beschaffen weil die Entwicklung hin zu PROMs mit deutlich gr erem Speicherplatz geht Es gibt vereinzelt noch pinkompatible Bausteine der Typen U556 und K573RF2 sowie einen pinkompatiblen SRAM Baustein mit der Bezeichnung U 6516 FA89 aus DDR Produktion der zumindest in den Applikationsschaltungen die Aufgaben des 2716 bernehmen kann 9 Zusammenfassung und Ausblick Das Programmierger t ist in der beschriebenen Ausf hrung weitgehend an den vorge sehenen Einsatz im Hardwarepraktikum angepasst Es l s
32. wird mit dem Inhalt des Editorpuffers beschrie ben Zu Beginn des Brennvorgangs wird PC_BURNING gesendet zum Abschluss PC_BURNED Wird die PC Funktion w hrend einer Verbindung ausgeschaltet sendet das Ger t PC_DISCONNECT um den Verbindungsabbruch mitzuteilen PC_STATE_STOP pc_start pc_stop PC_STATE_START PC_DISCONNECT PC_SIZE PC_INFO PC_CLEAR PC_FLUSH PC_READ PC_BURN PC_WRITE size msb PC_STATE_WRITE_SIZE PC_STATE_WRITE Abbildung 8 Protokollgraph der PC Kommunikation 6 2 6 Benutzerschnittstelle Benutzer steuern das Programmierger t ber ein Men system das anhand von Tas teneingaben zwischen verschiedenen Ansichten wechselt Das Men system wertet die 26 oe no u e N m H H N N N o o o o o o o o o H e N e O O DD oa o ES Go Mr Tastendr cke dabei selbst aus gibt die Kontrolle aber an den Editor ab wenn diese Funktion ausgew hlt wird Der Editor ist aufgrund seiner Komplexit t in eine eigene Quelldatei die editor c ausgelagert worden A 1 12 S 61 f Das Ziel bei der Entwicklung war es die Bedienung eng an Hexeditoren f r den PC anzulehnen damit die Nutzer m glichst nicht umlernen m ssen Die M glichkeiten des Editors sind durch die kleine Displaygr e etwas eingeschr nkt Da die unterste Zeile f r die Beschriftung der Softkeys verwendet wird bleiben nur drei Zeilen mit je 27 Zeichen f r die Anzeige des eigentlichen Programms brig Jede Zeil
33. 1 SOU 99dlLOS01 1942ISO OSAAIXOL EDM LE4NOS OYd 000Y Vd L90W zvalzoav Evdleoav tYdlroay IER SAS ZA 20 O O O O LNOO E LA NI3LVO QIV NOUdS IA ONS Hr oL TE H E eaf Lol 3ss34av WO443 9 Zu 004 Leg Ju 0o0L sol Ful00l 97 Schaltplan der Hauptplat OA me Abbildung 13 D Platinenlayouts S Verskeg kskJoA r ov le1002 MOA4A3 Abbildung 15 Layout der Platine f r den abgesetzten IC Sockel 98 n HT ge 481 Sl el Iw Il IDN jw OH n Abbildung 16 Layout der Hauptplatine Version 0 32 Blaue Leiterbahnen verlaufen auf der L t rote auf der Best ckungsseite 99 Literatur SIESS FA89 Hit44780 KSWO MAXOA Tho94 T195 Siemens AG 1988 Experimentiercomputer ECB85 Bedienungsanleitung 11 81 M nchen Funkamateur Bauteileinformation U 6516 DG In Funkamateur 5 89 S 233 ff Hitachi ohne Jahr HD44780U LCD II Dot Matrix Liquid Crystal Display Controller Driver Ohne Ort Kories Ralf und Schmidt Walter Heinz 2006 Taschenbuch der Elektro technik Frankfurt Verlag Harry Deutsch Maxim Integrated Products 2004 MAX220 MAX249 5V Powered Multichannel RS 232 Drivers Receiver Rev 14 SGS Thomson Microelectronics 1994 M2716 data sheet Ohne O
34. 1 return TWI_SET_ADDRESS 112 113 else Im falschen Zustand 114 115 Vebertragung beenden 116 twi_stop 117 return TWI_ERROR 118 119 break 120 121 Bestaetigung vom Slave eingetroffen dass er 122 einen Wert senden soll 123 case 0x40 124 125 if twi_state TWI_STATE_ADDRESS 126 127 Wert empfangen dabei kein ACK senden 128 twi_state TWI_STATE_READ 129 TWCR 1 lt lt TWEN 1 lt lt TWINT 130 131 else Im falschen Zustand 132 133 Vebertragung beenden 134 twi_stop 71 135 return TWI_ERROR 136 137 break 138 139 Wert vom Slave empfangen kein ACK gesendet 140 case 0x58 141 142 if twi_state TWI_STATE_READ 143 twi_state TWI_STATE_READ_GET 144 twi_data TWDR 145 return TWI_GET_DATA 146 else if twi_state TWI_STATE_READ_GET 147 148 Derselbe Interrupt Wert noch nicht 149 gelesen Wiederholt senden dass ein 150 Wert gelesen werden kann 151 return TWI_GET_DATA 152 153 else Im falschen Zustand 154 155 Vebertragung beenden 156 twi_stop 157 return TWI_ERROR 158 159 break 160 161 Nicht erwarteter Status Fehler annehmen 162 default 163 164 Vebertragung beenden 165 twi_stop 166 return TWI_ERROR 167 break 168 169 170 171 Mitteilen dass nichts passiert ist 172 return TWI_NOP ia 174 175 176 Initiert eine Uebertragung und gibt ein
35. 3 84 Dasu EPROMuistunichtuleer lcd_write_string LCD_LINE4 reload lcd_write_string LCD_LINE4 20 zurueck break case MENU_INFO_EE_EMPTY EEPROM ist leer lcd_write_string LCD_LINE1 Info lcd_write_string LCD_LINE2 Das EEPROM ist leer lcd_write_string LCD_LINEA reload lcd_write_string LCD_LINE4 20 zurueck break case MENU_INFO_EE_N_EMPTY EEPROM ist nicht leer lcd_write_string LCD_LINE1 Info lcd_write_string LCD_LINE2 Das EEPROM ist unicht leer lcd_write_string LCD_LINEA reload uloeschen lcd_write_string LCD_LINE4 20 zurueck break case MENU_INFO_CLEARING_EE EEPROM wird geloescht lcd_write_string LCD_LINEl1 Info lcd_write_string LCD_LINE2 Das EEPROM wird geloescht break case MENU_PC PC Menue lcd_write_string LCD_LINE1l PC lcd_write_string LCD_LINE4 20 zurueck break Menuezeile des Editors den Rest schreibt der Editor selbst case MENU_EDITOR lcd_write_string LCD_LINEA4 Leeren Brennen lcd_write_string LCD_LINE4 20 zurueck break case MENU_BURN Brenn Bestaetigung lcd_write_string LCD_LINE1 Brennen lcd_write_string LCD_LINE2 ZumuBrennen OK druecken lcd_write_string LCD_LINE4 20 Abbruch break case MENU_BURNING EPROM wird gebrannt lcd_write_string LCD_LINE1 Brennen lcd_write_string LCD_LINE2 Das EPROM wird gebrannt 54 86 87 88 89 90 91 92 93 94 96 97 9
36. 61 62 63 64 66 67 68 69 70 71 72 73 74 75 76 TT 78 79 Puffer leeren und in den Start Zustand gehen pc_state PC_STATE_START pce_flush Prueft ob Daten empfangen wurden und verarbeitet diese void pc_process void Laeuft das PC Protokoll nicht oder wurden noch keine Daten empfangen abbrechen if pc_state PC_STATE_STOP usart_has_data return Empfangenes Zeichen lesen uint8_t data usart_read_char Verarbeitung abhaengig vom aktuellen Zustand switch pc_state case PC_STATE_START Start Zustand Wenn PC_CONNECT empfangen wurde Version des Protokolls senden in den Zustand Verbunden uebergehen if data PC_CONNECT DC States PC_STATE_CONNECTED usart_write_char PC_VERSION break case PC_STATE_CONNECTED Zustand Verbunden Auf empfangenes Zeichen reagieren switch data Die Verbindung wird abgebaut alle Variablen zuruecksetzen in den Start Zustand gehen case PC_DISCONNECT pc_state PC_STATE_START pc_write_size 0 pce_write_i 0 usart_write_char PC_DISCONNECT break Die maximale Groesse des Editors wird 78 80 81 82 83 84 86 87 88 89 90 g1 92 93 94 96 97 98 99 100 101 102 103 104 105 107 108 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 angefordert erst wird das MSB anschliessend das LSB gesendet cas
37. 8 99 100 101 102 103 104 105 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 break case MENU_BURNED EPROM wurde gebrannt lcd_write_string LCD_LINE1 Brennen lcd_write_string LCD_LINE2 Das EPROM wurde gebrannt lcd_write_string LCD_LINE4 20 zurueck break default Kein gueltiges Menue misc_error break Wartet auf einen Tastendruck und gibt diesen zurueck Zwischen den Tasten Abfragen wird das PC Protokoll abgearbeitet uint8_t menu_get_keystroke void uint _t key KEY_NONE uints_t i 0 Erst beenden wenn eine Taste gedrueckt wurde while key KEY_NONE Nur alle 10ms Tastendruecke abfragen in der Zwischenzeit das PC Protokoll abarbeiten for i 0 i lt 10 i pc_process _delay_ms 1 Falls ein neuer Tastendruck anliegt die Taste lesen Ist nur im Fehlerfall false da bei keiner gedrueckten Taste die Taste KEY_NONE uebertragen wird if twi_read 2 TWI_GET_DATA key twi_get_data return key 55 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 151 152 153 154 155 156 157 158 159 161 162 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 181 182 Zeigt das Info Menue an und ermoegicht ein EEPORM zu leeren uint8_t menu_info void uint8_t menu_ret
38. 8_t menu_editor void 302 uint8_t menu_ret 0 303 uint8 _t key KEY_NONE 304 305 while menu_ret 0 menu_ret Oxff 306 307 if menu_ret lt Oxff 308 menu_display MENU_EDITOR 309 310 Zeigt Cursor und Editor an 311 lcd_display_cursor 1 312 editor_display 313 314 menu_ret Oxff 315 316 317 key menu_get_keystroke 318 319 switch key 320 321 case KEY_SK1 Editor leeren 322 editor_clear 323 menu_ret 0 324 break 325 326 case KEY_SK2 Brennen 327 328 Cursor abschalten 329 lcd_display_cursor 0 59 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 menu_ret menu_burn break case KEY_SK3 Unbenutzt break case KEY_SKA4 Zurueck menu_ret 1 break default Editortaste wurde gedrueckt editor_handle_keystroke key break Cursor abschalten lcd_display_cursor 0 return menu_ret 1 Zeigt das Hauptmenue in einer Endlosschleife an und wartet auf einen Tastendruck Wird ein Softkey gedrueckt wird das entsprechende Untermenue aufgerufen S uint8_t menu_main void uint8_t menu_ret 0 while 1 if menu_ret lt Oxff menu_display MENU_MAIN menu_ret Oxff switch menu_get_keystroke
39. Bit 7 gehoert nicht zur eigentlichen Position sondern ist der Befehl zum Schreiben der Posi tion und muss 1 sein lcd_write ctl LCD_IR pos 0x80 ZZ Fall s der Cursor angezeigt wird muss geprueft werden ob der Cursor aufgrund der neuen Position den Controller wechseln muss if Led cursor amp 0x01 if lcd cursor amp 0x02 amp amp ctl LCD_CTL_TOP Der Cursor wird im unteren Controller angezeigt die neue Position befindet sich aber im oberen Dann Speichere den Status deaktiviere den Cursor im unteren und aktiviere ihn im oberen Controller lcd_cursor 0x01 lcd_write LCD_CTL_BOTTOM LCD_IR 0x0c lcd_write LCD_CTL_TOP LCD_IR OxOe else if lIcd_cursor amp 0x02 E ctl LCD_CTL_BOTTOM Der Cursor wird im oberen Controller angezeigt die neue Position befindet sich aber im unteren 44 253 254 255 257 258 260 261 262 263 264 265 266 267 268 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 290 291 292 293 294 295 296 297 298 300 301 Dann Speichere den Status deaktiviere den Cursor im oberen und aktiviere ihn im unteren f Controller lcd_cursor 0x03 lcd_write LCD_CTL_TOP LCD_IR Ox0c lcd_write LCD_CTL_BOTTOM LCD_IR Ox0e Schreibt das uebergebene Zeichen an die angegebene Position void lcd_write_char uint8_t pos uint8d_t ch
40. EPROM Programmer m glichst robust ausgef hrt werden und Besch digungen durch falsche Bedienung sollten vermieden werden Der Stromversorgungseingang des Ger ts wurde gegen Verpolung berspannung und Anschluss an Wechselspannungsquellen abgesichert Dazu dient eine Zener Diode in Sperrichtung ber den Anschl ssen f r die Betriebsspannung die bei berspannung oder Verpolung leitend wird und eine Sicherung in der Stromversorgung durchbrennen l sst Sowohl Diode als auch Sicherung k nnen im Musteraufbau ohne L tarbeiten ausgewechselt werden Die Bedienung des Ger ts ist so einfach wie m glich gestaltet Es gibt keine mehrfach belegten Tasten die Bedienung ist modeless es gibt also keine Umschalt Meta oder Funktionstasten und die R ckmeldungen des Men systems sind eindeutig Die aktuelle Funktion der vier Softkeys am oberen Rand der Tastatur wird im Display im Klartext angezeigt 6 Programmierung und Arbeitsweise 6 1 Schreiben Lesen und L schen der PROMs Um Daten in ein 2716 EPROM zu schreiben muss das gew nschte 8 Bit lange Datenwort an die Ausg nge des Chips angelegt werden w hrend diese ber eine 1 an G hochohmig gehalten werden Gleichzeitig wird an die Adresspins des Chips die gew nschte Adresse als 11 Bit langes Datenwort angelegt An den Vpp Anschluss wird die Brennspannung von 25V angelegt und durch einen kurzen High Puls an EP CE werden die Daten geschrieben Die Programmiersequenz eines 2816 EEPROM
41. Ein mikrocontrollerbasiertes Programmierger t f r EPROMs und EEPROMs Studienarbeit im Studiengang Informatik vorgelegt von Volker Klasen J rgen Starek 204110016 204110559 Betreuer Dr Merten Joost Institut f r integrierte Naturwissenschaften Abteilung Physik Fachbereich 3 Naturwissenschaften Koblenz im Juli 2008 Erkl rung Wir versichern die vorliegende Arbeit selbst ndig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet zu haben Volker Klasen J rgen Starek Inhaltsverzeichnis 1 Projekt berblick 2 EPROMs und EEPROMs 3 Markt bersicht 3 1 Eeitigger te zn operie ea ee re eh ar Dr en 3 2 Komponenten ur 2 2 004 2 a Wen pi EEN ES 4 Entwurf 5 Aufbau 5 1 Hauptplatine rasen RRE De ee en 5 1 1 Beschaltung des Hauptcontrollers 22 22 222 nn nn 5 1 2 Erzeugen der Brennspannung 5 1 3 RS232 Schnittstelle s s iriki 22 232 as De a ee 5 2 Tastatur und Tastaturcontroller e 5 3 Display u ea a ae Bu ee 5 3 1 Binbeleguns ar ses Eeer e a ee 5 3 2 Ansteuerung der 44780 kompatiblen Controller 5 4 Anpassungen an den Einsatz im Praktikum 2 22 22 20 6 Programmierung und Arbeitsweise 6 1 Schreiben Lesen und L schen der PROMs e 6 2 Das Programm des Hauptcontrollers im Detail 2 22222020 6 2 1 Hauptprogramm und allgemeine Hilfsfunktionen 6 2 2 Ansteuerung des Displays 2 22 2 En nn 6 2 3 Zugriff auf die Speicherba
42. M 9 0 1 BF A6 A5 A4 A3 A2 Al AO Busy Flag BF und RAM Adresszeiger A6 A0 ausle sen 10 1 0 D7 D6 D5 D4 D3 D2 D1 DO Schreibt Daten 11 1 1 D7 D6 D5 D4 D3 D2 D1 DO Liest Daten Tabelle 4 Befehls bersicht f r die Ansteuerung von Displays auf Basis von HD44780 Controllern Mit x markierte Bits werden ignoriert Die Nummerierung der Befehle dient nur der bersicht im Haupttext 16 verhalten soll wird durch Befehl 5 gesteuert Damit die Anzeige verschoben wird muss D3 auf 1 gesetzt werden eine 0 an dieser Stelle sorgt daf r dass der Cursor verschoben wird Die Richtung der Verschiebung wird mit D2 festgelegt eine 1 entspricht dabei einer Verschiebung nach rechts Zus tzlich zu dem automatischen Verschieben kann mit Befehl 3 der Cursor oder die Anzeige auch unabh ngig von Schreibvorg ngen nach rechts oder links verschoben werden Soll ein Zeichen angezeigt werden welches nicht im vordefinierten Zeichensatz enthalten ist k nnen im CG RAM Character Generator bis zu 8 eigene Zeichen definiert werden Pro Zeile des 7x5 bzw 8x5 Zeichens geben die 5 unteren Bits eines Bytes im CG RAM die Pixel an die angezeigt werden sollen Dabei steht das erste eigene Zeichen an den CG RAM Adressen 0 bis 7 das zweite bei 8 bis 15 usw 5 4 Anpassungen an den Einsatz im Praktikum Weil die Praktikumsteilnehmer nicht immer Erfahrung im Umgang mit Laborger ten haben sollte der
43. Men punkte die in der untersten Zeile angezeigt werden k nnen durch Dr cken des Softkeys direkt darunter aufgerufen werden Hauptmenue Auslesen reload loeschen Leeren Brennen OK Abbrechen Abbildung 11 Das Men system des Ger ts Von allen Untermen s aus kann ber den rechten Softkey dann mit zur ck beschriftet ins n chsth here Men zur ckgewechselt werden B 1 Informationen ber eingelegte PROMs abrufen Die Funktion Info im Hauptmen liefert Informationen ber den eingelegten Speicher baustein Diese Funktion erm glicht eine schnelle Pr fung ob ein PROM leer ist Es wird angezeigt ob ein EPROM oder ein EEPROM eingelegt ist Dies wird aber nur anhand der Schalterstellung des Schalters S1 erkannt so dass das erkannte PROM nicht dem eingelegten entsprechen muss Da ein EEPROM durch eine zu hohe Brennspannung kaputt gehen kann ist dringlich darauf zu achten dass Schalterstellung und eingelegtes PROM zueinander passen Ebenfalls wird angezeigt ob das eingelegte PROM leer ist oder Daten enth lt Dabei wird angenommen dass ein PROM leer ist wenn alle Bytes den Wert OxFF haben Ist ein nicht leeres EEPROM eingelegt so kann ber loeschen das EEPROM gel scht werden es werden dabei alle Bytes mit dem Wert SR beschrieben ber die Funktion reload k nnen die Informationen aktualisiert werden Dies ist n tzlich wenn mehrere PROMs auf Inhalt berpr ft werden
44. NO 1 lt lt TXENO Setze neuen stdout stdout amp usart_out Gibt zurueck ob ein Zeichen empfangen wurde uint8_t usart_has_data void if UCSROA amp 1 lt lt RXCO Zeichen empfangen return 1 else Kein Zeichen empfangen return 0 E Wartet bis ein Zeichen empfangen wurde und gibt dies zurueck Achtung wenn kein Zeichen empfangen wird wird diese Funktion nie beendet uint8_t usart_read_char void while usart_has_data return UDRO Sendet ein einzelnes Zeichen void usart_write_char uint8d_t data 75 79 80 81 82 83 84 86 87 89 90 g1 92 93 94 e HH oO s Q u 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 usart_write data NULL Sendet einen String indem es jedes Zeichen einzeln sendet void usart_write_string uint8_t str uint8_t i 0 0x00 beendet einen String also dann abbrechen while str i 0 usart_write_char str i itt A 1 17 pc h ifndef __PC_H define __PC_H__ include lt inttypes h gt include usart h include eprom h include editor h Konstanten die fuer die Zustaende stehen define PC_STATE_STOP o define PC_STATE_START 1 define PC_STATE_CONNECTED 2 define PC_STATE_WRITE_SIZE 3 define PC_STATE_WRITE 4 Konstante die die Version des Protokolls angibt define PC_VERSION 1
45. ORTC 1 lt lt EPCE _delay_ms 50 PORTC amp 1 lt lt EPCE break case EPROM_EEPROM EEPROM Brennimpuls geben und Stabilisierung abwarten PORTD amp 1 lt lt VPPWE _delay_us 10 PORTD 1 lt lt VPPWE break eprom_write wurde aufgerufen ohne dass vorher eprom_write_start aufgerufen wurde default Z misc_error break Liest das EPROM aus und gibt zurueck ob das EPROM leer ist uint8_t eprom_is_empty void uint16_t i 0 50 174 175 177 189 190 191 192 193 194 195 197 198 200 201 202 203 204 205 207 208 210 211 212 213 Pruefe jedes Byte des EPROMS for i 0 i lt EPROM_SIZE i Falls das gelesene Byte nicht OxFF ist ist das EPROM nicht leer if eprom_read i Oxff break b Die obige Schleife wird verlassen wenn eine beschriebene Speicherzelle gefunden wird oder sie das ganze PROM abgesucht hat Durch Vergleich der Ausstiegs stelle mit der Groesse erkennt man beschriebene PROMs if i lt EPROM_SIZE return EPROM_NEMPTY else Das EPROM ist leer return EPROM_EMPTY Leert das EEPROM indem in jedes Byte OxFF geschrieben wird void eprom_clear_eeprom void Falls das EPROM kein EEPROM ist erzeuge eine Fehlermeldung if eprom_get_type EPROM_EEPROM misc_error return Initialisiere den Brennvorgang eprom_write_start
46. as EEPROM an jedem Byte mit 0xFF beschreibt und best tigt mit PC_CLEARED Ist kein EEPROM eingesteckt oder ist es bereits leer sendet es PC_NCLEARED PC_FLUSH Mit diesem Befehl wird der Editorpuffer geleert und das Ger t antwortet mit PC_FLUSHED PC_READ Das Ger t liest das eingesteckte PROM in den Editorpuffer aus und sendet daraufhin mit 2 Byte MSB zuerst die Anzahl der zu bertragenden Bytes Anschlie end bertr gt es die ausgelesen Daten des PROMs Es beginnt dabei bei Adresse 0x00 und sendet jedes Byte bis die zuvor bertragene Anzahl erreicht wurde Alle nicht bertragenen Bytes bis zum Ende des Editorpuffers haben den Wert OxFF es werden also alle Bytes bis zum letzten von 0xFF verschiedenen Byte gesendet DC WRITE Startet die Eingabe von Daten vom PC in den Editorpuffer Das Ger t antwortet mit PC_WRITE_SIZE der Aufforderung an den PC die zu bertragende Bytezahl zu senden Nach dem Senden des MSB der Anzahl best tigt 25 das Ger t den Empfang mit einem weiteren PC_WRITE_SIZE woraufhin der PC das LSB sendet Nun sendet das Ger t PC_WRITE_ NEXT und der PC kann mit der Daten bertragung beginnen Diese beginnt immer bei der Adresse 0x00 und endet nach dem Senden von der angek ndigten Anzahl von Bytes Nach jedem Byte best tigt das Ger t den Empfang mit PC_WRITE_NEXT nur nach dem letzten Byte antwortet es mit PC_WRITE_WRITTEN und ist nun wieder bereit f r den n chsten Befehl e PC_BURN Das eingesetzte PROM
47. aten f r diese Bausteine komplett zwischenspeichern zu k nnen muss der verwendete Controller also ber mindestens 2KiB Speicherkapazit t verf gen Diese Speicherbausteine sind ber 11 Adressleitungen und 8 Datenleitungen ansprech bar Zum Beschreiben der Bausteine sind daneben noch drei weitere Leitungen mit Steuerfunktionen n tig vgl 5 1 1 S 10 so dass allein f r die Ansteuerung der PROMs 22 1 O Leitungen belegt werden Die Eingabe von Daten f r PROMs erfolgt blicherweise in hexadezimaler Schreibwei se Entsprechend ist mindestens eine Eingabetastatur mit 16 Tasten notwendig Beim RS232 TWI mW RS232 Abbildung 1 Konzept des Programmierger ts vorliegenden Bedienkonzept mit Men steuerung kommen dazu noch vier Cursortasten vier Softkeys die je nach ausgef hrtem Programm unterschiedlich belegt sind sowie je eine Bild auf Bild ab und Best tigungstaste Die Tastatur ist beim aufgebauten Prototyp so angeordnet dass die Softkeys unmittelbar unter der Unterseite des Displays liegen Auf diese Anordnung ist auch die Software abgestimmt die die Beschriftung der Softkeys in der untersten Displayzeile anzeigt Auf den oberen drei Zeilen werden Statusinformationen oder die Daten des PROMs in einer Editoransicht angezeigt Die eingesetzten LC Displays basieren auf zwei HD44780 Controllern und werden ber 8 Datenleitungen und 4 Steuerleitungen angesprochen Zusammen mit den 22 Leitungen zum EPROM und zwei Leit
48. d 4KiB internen Speicher so dass neben einem Editorpuffer der s mtliche im EPROM abgelegten Daten aufnehmen kann noch gen gend Platz f r Programmvariablen bleibt Da der ATmega644 anfangs noch nicht in kleinen St ckzahlen erh ltlich war musste die Entwicklung der Schaltung mit dem pinkompatiblen ATmegal6 erfolgen der ebenso wie die erforderliche Programmiertechnik bereits im Labor vorhanden war aber mit 1KiB RAM ber zu wenig Arbeitsspeicher verf gt um einen hinreichend gro en Editorpuffer anlegen zu k nnen bergangsweise wurde bei diesem Controller ein Editorpuffer von nur 512 Byte Gr e verwendet Die Verarbeitung der Tastatureingaben bernimmt ein ATtiny2313 Dieser Controller liest st ndig den Zustand der Tastatur aus und meldet ihn ber den TWI Bus an den Hauptcontroller Diese Schnittstelle ist im Wesentlichen identisch zum bekannten I C Bus von Philips dessen Name aus lizenzrechtlichen Gr nden von Atmel nicht bernommen wurde Ein Vorteil der Ausf hrung mit zwei Controllern ist dass Tastendr cke in jedem Betriebszustand zuverl ssig aufgezeichnet werden Selbst wenn der Hauptcontroller besch ftigt ist kann der Tastaturcontroller Tastendr cke puffern und zur Verarbeitung an den Hauptcontroller weitergeben sobald dieser wieder bereit ist 5 Aufbau Die Hardware des Programmierger ts ist auf drei Platinen verteilt dazu kommen die Tastatur und das Display Die Hauptplatine integriert den Hauptcontroller mit seiner
49. datei eprom c zusam mengefasst Diese Datei stellt Funktionen zum Auslesen Beschreiben und Leeren des Speicherbausteins bereit ebenso auch Funktionen zur Abfrage ob das PROM leer ist und ob die Schaltung im EPROM oder EEPROM Betrieb arbeitet Das Beschreiben der PROMs folgt dabei sowohl bei EPROMs als auch bei EEPROMs dem gleichen Schema Das zu schreibende Datenwort wird vom Hauptcontroller an den mit dem Display gemeinsam genutzten Datenbus angelegt die Zieladresse auf den Adressbus gelegt und daraufhin der Schreibbefehl an das PROM gegeben Bei EPROMs wird der Schreibimpuls an den EP CE Pin gelegt bei EEPROMs an Vpp An einigen Stellen ist es notwendig bestimmte Verz gerungen etwa vor dem Anlegen der n chsten Adresse oder vor dem Absenden des n chsten Schreibimpulses einzuhalten Diese zumeist experimentell bestimmten Verz gerungszeiten sind ebenfalls in die eprom c eingeflossen Listing 3 Die Brennroutine aus der eprom c Brennt den uebergebenen Wert an die uebergebene Adresse eprom_write_start muss vor dem ersten Aufruf aufgerufen werden void eprom_write uint16_t address uintd_t data Der Controller soll auf den LCD EPROM Bus schreiben misc_set_data_direction MISC_DD_UC Die Adresse wird auf die Adress und der Wert auf die Datenleitungen gelegt PORTB address amp Oxff PORTD amp 0x70 PORTD address gt gt 4 E 0x70 PORTA data Stabilisierung abwarten _dela
50. den LCD EPROM Bus schreiben misc_set_data_direction MISC_DD_LCD switch reg Aus dem Befehlsregister soll gelesen werden case LCD_IR PORTC amp 1 lt lt RS break Aus dem Datenregister soll gelesen werden case LCD_DR PORTC 1 lt lt RS break Ein falscher Wert wurde uebergeben default misc_error break switch controller Aus dem oberen Controller soll gelesen werden case LCD_CTL_TOP Oberen Controller aktivieren Stabilisierung abwarten den gelesenen Wert speichern und den Controller wieder deaktivieren PORTC 1 lt lt E1 _delay_us 10 value PINA PORTC amp 1 lt lt E1 break Aus dem unteren Controller soll gelesen werden case LCD_CTL_BOTTOM Unteren Controller aktivieren Stabilisierung abwarten den gelesenen Wert speichern und den 40 57 58 59 60 61 62 63 64 66 67 68 69 70 TA 72 73 74 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 102 104 105 Controller wieder deaktivieren PORTO 1 lt lt E2 _delay_us 10 value PINA PORTC amp 1 lt lt E2 break Ein falscher Wert wurde uebergeben misc_error default break return value Z Blockt bis das Busy Flag des uebergebenen Controllers nicht mehr gesetzt is t void lcd_check_busy uint8_t controller while lcd_read controller
51. ditor_cursor_position editor_cursor_position 16 editor_update_cursor else if EDITOR_MAXMEMSIZE 24 gt editor_start Cursor ist in unterster Zeile und es gibt noch Zeilen weiter unten Dann Herunterscrollen editor_start editor_start 8 editor_display break Zeichen in LCD und den Puffer schreiben und Cursor weiterruecken case case case case case case case case case case case case case case case case KEY_O KEY_1 KEY_2 KEY_3 KEY A KEY_5 KEY_6 KEY_7 KEY_8 KEY_9 KEY_A KEY_B KEY_C KEY_D KEY_E KEY_F Aktuelle Position im Puffer uint16_t pos editor_start editor_cursor_position 2 if editor_cursor_position 2 0 Linkes Half Byte speichern editor_buffer pos key lt lt 4 editor_buffer pos E O0x0f else Rechtes Half Byte speichern editor_buffer pos key editor_buffer pos E Oxf0 65 214 217 224 227 237 247 Endpointer neu setzen wenn ein anderes Zeichen als Oxff hinter dem aktuellen Endpointer geschrieben wurde if key KEY_F amp amp pos 1 gt editor_end_pointer editor_end_pointer pos 1 Zeichen auf LCD schreiben lcd_write_char editor_cursor_position 16 27 editor real posleditor cursor position 16 misc_halfbyte_to_char key Eine Position weiterruecken editor_handle_keystroke KEY_RIGHT break Eine Editorseite drei Zeilen nac
52. e PC_SIZE usart_write_char EDITOR_MAXMEMSIZE gt gt 8 usart_write_char uint8_t EDITOR_MAXMEMSIZE break Information ueber das EPROM wird angefordert erst wird der Typ gesendet dann ob es leer ist case PC_INFO if eprom_get_type EPROM_NEPROM usart_write_char PC_NEPROM else usart_write_char PC_EEPROM if eprom_is_empty usart_write_char PC_EMPTY else usart_write_char PC_NEMPTY D break Das nicht leere EEPROM soll geloescht werden Ist ein nicht leeres EPROM eingesteckt so wird es geloescht und es wird CLEARED gesendet ansonsten wird NCLEARED gesendet case PC_CLEAR if eprom_get_type EPROM_EEPROM E Ieprom_is_empty eprom_clear_eeprom usart_write_char PC_CLEARED else usart_write_char PC_NCLEARED break Der Editor soll geleert werden also wird er geleert und FLUSHED gesendet case PC_FLUSH editor_clear usart_write_char PC_FLUSHED 79 137 147 157 174 177 break Der PC fordert die Daten aus dem EPROM an case PC_READ Das EPROM auslesen editor_read_eprom Groesse der EPROM Daten senden MSB zuerst usart_write_char editor_end_pointer gt gt 8 Stabilisierung abwarten _delay_ms 60 LSB uebertragen usart_write_char editor_end_pointer uint16_t i 0 Daten uebertragen dabei jeweils warten for i 0 i lt editor_end_pointer i
53. e Statusmeldung 177 zurueck 178 179 uint8_t twi_read uint8_t address 180 uint16_t i 0 181 182 Uebertragung beginnen 183 twi_start 72 185 Solange kein Timeout vorliegt weiter arbeiten 186 while i lt TWI_TIMEOUT 187 188 L 189 switch twi_process 190 191 Adresse kann gesetzt werden 192 case TWI_SET_ADDRESS 193 194 Timeout Zaehler zuruecksetzen 195 i 0 196 197 Adresse setzen und uebertragen 198 twi_set_address address 199 break 200 201 Wert wurde empfangen kann abgefragt werden 202 case TWI_GET_DATA 203 204 Dem Aufrufer mitteilen dass ein Wert 205 angekommen ist 206 return TWI_GET_DATA 207 break 208 209 Noch nichts passiert 210 case TWI_NOP 211 212 Timeout Zaehler erhoehen 213 itt 214 break 215 216 Fehler oder falscher Wert wurde zurueckgegeben 217 default 218 219 Uebertragung stoppen Fehler zurueckgeben 220 twi_stop 221 return TWI_ERROR 222 break 223 F 224 225 226 Timeout wurde erreicht Uebertragung beenden Fehler 227 zurueckgeben 228 twi_stop 229 return TWI_ERROR 230 A 1 15 usart h 73 CD Bw N ka D oo N Q 10 11 12 13 14 16 17 18 CD e Co N ka O N Q 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 ifndef __USART_H__ define __USART_H__ include lt avr io h gt include lt inttypes h gt include
54. e enth lt daher nur die Adresse des ersten angezeigten Halbbytes ein Trennzeichen und danach die eingegebenen Halbbytes in Hexadezimalschreibweise Auf Erl uterungen des Bildschirminhalts etwa in Form einer Kopfzeile wurde aus Platzgr nden ebenso verzichtet wie auf Funktionen f r die ein gr erer Ausschnitt des Programms sichtbar sein m sste wie etwa Kopieren und Einf gen von Programmausschnitten Listing 4 In der Funktion editor_display werden f r jede der drei angezeigten Zeilen zuerst die Startadresse und danach die Daten in hexadezimaler Schreibweise ausgegeben for j 0 j lt 3 j Initialisiere eine Zeile der Editoransicht und trage Adresse links und Daten rechts ein char str 28 uuh vuuuuuuuuuuUuLLLLLLLDUU str 0 misc_halfbyte_to_char editor_start j 8 gt gt 8 str 1 misc_halfbyte_to_char editor_start j 8 gt gt 4 str 2 misc_halfbyte_to_char editor_start j 8 uint8_t i 0 for i 0 i lt 8 i str editor_tabs i misc_halfbyte_to_char editor_buffer editor_start j 8 i gt gt 4 str editor_tabs i 1 misc_halfbyte_to_char editor_bufferleditor_start j 8 il Gibt den String im LCD aus lcd_write_string linelj str 6 3 Das Programm des Tastaturcontrollers im Detail Der Tastaturcontroller wurde ebenfalls in C programmiert wof r die gleiche Toolchain wie bei der Programmierung des Hauptcontrollers verwendet
55. eilenl nge darstellen k nnen kosten aber zwischen 30 und 50 was selbst f r eine Kleinstserie zu teuer schien Andere Technologien wie OLEDs oder TFTs sind noch wesentlich teurer Beschafft wurden schlie lich einige vierzeilige Displays die mit einer Zeilenl nge von 27 Zeichen genug Platz f r die geplante Bedienoberfl che boten und als Restposten g nstig erh ltlich waren Passende Tastaturen es werden 16 Tasten f r die Eingabe der im Hexadezimalsystem geschriebenen Programme ben tigt dazu kommen noch mindestens neun Steuertasten waren nicht kommerziell erh ltlich so dass hier der aufw ndige aber preisg nstige Aufbau aus Einzeltasten gew hlt wurde Leider l sst die Ergonomie einer solchen Tastatur deutlich zu w nschen brig was aber zumindest beim Prototyp in Kauf genommen wurde In aller Regel wird man auf der Tastatur keine allzu langen Programme eingeben m ssen 4 Entwurf Vor dem Entwurf der Schaltung musste ein geeigneter Mikrocontroller gefunden wer den der ber f r das Projekt ausreichende Rechenleistung Speicherkapazit t und I O Anschl sse verf gen musste Es zeigte sich dass aktuelle Controller durchweg ber gen gend Rechenleistung verf gen und dieses Kriterium f r die Auswahl eines Controllers nicht entscheidend sein w rde F r die Versuche im Hardwarepraktikum sollten EPROMs des Typs 2716 mit 2048 Byte Speicherkapazit t bzw voll pinkompatible EEPROMs der Serie 2816 verwendet werden Um die D
56. en Controller im Display den Vorgang abwickeln soll Die Entscheidung dar ber kann einfach auf Basis der Zieladresse getroffen werden Der Controller der oberen Displayh lfte verwaltet die Zeichen 0 bis 54 der der unteren Displayh lfte die brigen Diese Zuordnung wird in der Funktion lcd_set_position getroffen Listing 1 Auszug aus der Icd c Auswahl des f r einen Schreibzugriff zust ndigen Con trollers Setzt die Adresse und damit die Position des Cursors auf die webergebene Position un anschliessend dort schreiben zu koennen Die Position muss zwischen O und 107 4 27 1 liegen und wird umgerechnet auf die richtige Positi n in oberen bzw unteren Controller ER SS 2 19 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 oo no a Bow N void lcd_set_position uint8_t pos uint8_t ctl 0 if pos lt 27 Position ist in Zeile 1 Der richtige Controller ist der obere Umrechnung der Position nicht noetig ctl LCD_CTL_TOP else if pos lt 54 Position ist in Zeile 2 Der richtige Controller ist der obere Position muss umgerechnet werden pos 27 entspricht der Position in der Zeile 64 ist der Offset fuer die 2 Zeile ctl LCD_CTL_TOP pos pos 27 64 Die in dieser Funktion bestimmten Konstanten werden dann an die Funktion Icd_write bergeben die die Ansteuerung der Hardware bernimmt Listing 2 Ausschnitt aus der Icd h Umschaltung zwischen den
57. en f r die Ansteuerung des Displays zusammen von denen 12 I O Ports am Hauptcontroller belegen Pin Funktion 1 GND GND 2 Vpp 5V 3 Vo 0 4 V 4 RS Register Select 5 R W Read Write 6 El Controller f r obere Zeilen 7 E2 Controller f r untere Zeilen 8 DO Datenleitung 9 Di Datenleitung 10 D2 Datenleitung 11 D3 Datenleitung 12 D4 Datenleitung 13 D5 Datenleitung 14 D6 Datenleitung 15 D7 Datenleitung Tabelle 3 Pinbelegung des C2704M Diese Belegung ist bei Displays mit zwei HD44780 kompatiblen Controllern sehr weit verbreitet Die Stromversorgung des Displays erfolgt ber seine Anschluss Pins 1 und 2 An Pin 3 liegt eine ber das Potentiometer R7 einstellbare Spannung von 0 bis 4 V die den Kontrast der Zeichen auf dem Display bestimmt HD44780 Controller unterscheiden auf dem Datenbus zwischen Befehlen zur Steuerung des Displays Bildschirm l schen Cursor ein bzw ausschalten usw und anzuzeigenden Daten Ob ein am Bus anstehendes Datenwort als Befehl interpretiert werden soll oder nicht wird ber Pin 4 Register Select kurz RS bestimmt liegt hier ein Low Pegel wird das anstehende Datum ins Befehlsregister des aktiven Controllers s u bernommen und entsprechend als Befehl interpretiert Mit Hilfe von Pin 5 R W k nnen die Daten die in den Registern des Controllers stehen wieder ausgelesen werden Er schaltet den Controller in den Auslese Modus wenn hier ein High Pegel ansteht
58. enue loeschen reload Brennen OK Abbrechen Abbildung 9 Das Men system des Ger ts Von allen Untermen s aus kann ber den rechten Softkey dann mit zur ck beschriftet ins n chsth here Men zur ckgewechselt werden Aus dem Hauptmen heraus kann ber den Men punkt Editor in eine Editoransicht gewechselt werden daneben k nnen Informationen ber ein eingesetztes EPROM oder EEPROM abgerufen und das Ger t auf PC Steuerung umgeschaltet werden Zus tzlich gibt es eine Funktion Auslesen bei der zuerst das eingesteckte PROM ausgelesen und anschlie end in die Editoransicht gewechselt wird Der Editor dient zur Eingabe eines neuen Programms Hier gemachte Eingaben bleiben erhalten auch wenn in ein anderes Men gewechselt wird Um mit der Eingabe eines neuen Programms zu beginnen kann mit dem Softkey Leeren der komplette Inhalt des Editors gel scht werden Der Softkey Brennen brennt nach einer Sicherheitsabfrage das geschriebene Programm ins eingelegte PROM wobei abh ngig von der Stellung des EPROM EEPROM Umschalters auf der Hauptplatine automatisch der richtige Schreib modus gew hlt wird ber den Softkey zurueck gelangt man wieder ins Hauptmen 29 der Inhalt des Editors wird dabei wie erw hnt nicht gel scht Der Auslesen Modus ruft wie erw hnt den Editor auf nachdem der Inhalt des PROMs in den Editorpuffer gelesen wurde Er ist f r die Kontrolle des gebrannten Pro
59. ezeichnet die der anderen Ports entsprechend Die brigen 8 Pins wer den durch die externe Beschaltung belegt und stehen nicht f r Ein und Ausgabeleitungen zur Verf gung je nach Betriebszustand von den eingebauten Controllern des Displays ausgelesen in ein PROM geschrieben oder dienen zur bertragung der aus einem PROM ausgelesenen Daten Dabei wird der Bus nicht zwischen PROM Sockel und Display umgeschaltet sondern die Werte stehen immer am gesamten Bus an Ob und wo sie ausgelesen werden h ngt von der Ansteuerung des Displays bzw des PROMs ab ber die Funktion misc_set_data_direction aus der misc c wird bestimmt welcher der drei Bus Teilnehmer Hauptcontroller Display oder PROM auf den Bus schreiben darf Beim Hauptcontroller wird dazu das Register DDRA entsprechend gesetzt Damit das Display auf den Bus schreiben kann muss die Leitung R W auf 1 gesetzt werden andernfalls liest es vom Bus Wird beim PROM eine 1 auf die Leitung G gelegt so wird der Ausgang des PROMs gesperrt sonst liegen die Daten des PROMs auf dem Bus Die Funktion misc_set_data_direction die als Argument den Teilnehmer erh lt der auf den Bus schreiben soll stellt dabei zun chst sicher dass keiner der anderen Teilnehmer mehr darauf schreiben darf Anschlie end erlaubt sie Ersterem auf den Bus zu schreiben vgl misc c S 35 ff Aufgerufen wird diese Funktion von anderen Funktionen die anschlie end auf den Bus schreiben wollen wie z B der Funkt
60. f den Bus schreiben case MISC_DD_UC misc_set_dd_eprom 0 misc_set_dd_1cd 0 misc_set_dd_uc 1 break Das EPROM soll auf den Bus schreiben case MISC_DD_EPROM misc_set_dd_uc 0 37 115 116 117 118 119 120 121 122 123 124 125 127 143 145 146 147 148 149 150 151 152 153 154 155 157 158 160 161 162 163 misc_set_dd_l1cd 0 misc_set_dd_eprom 1 break Das LCD soll auf den Bus schreiben case MISC_DD_LCD misc_set_dd_uc 0 misc_set_dd_eprom 0 misc_set_dd_lcd 1 break Der Parameter dd hat einen falschen Wert default misc_error break Speichere den neuen Zustand misc_data_direction dd t ASCII Format un Wandelt das uebergebene halbe Byte die 4 hoechstwertigen Bits werden ignoriert in das zugehoerige Hex Zeichen im welches dann am LCD angezeigt werden kann uint8_t misc_halfbyte_to_char uint8_t hb Ignoriere die 4 hoechstwertigen Bits hb hat also einen Wert zwischen 0 und 16 hb amp 0Ox0f Falls das halbe Byte kleiner als 10 ist ist es eine Ziffer in der Hex Darstellung if hb EI hb else Lei hb lt 10 Addiere den Offset 0x30 um ASCII Code zu erhalten der 0x30 Das halbe Byte ist ein Addiere den Offset 0x37 um Buchstaben A F zu erhalten 0x37 38 aus der Zahl hb den hb darstellt Buchstabe den entsprechenden 164 165 e
61. fangen wurde uint8_t usi_is_start void return USISR amp 1 lt lt USISIF Gibt zurueck ob Overflow passiert ist Es wurden also 8 Bit empfangen uint8_t usi_is_overflow void return USISR amp 1 lt lt USIOIF b Gibt zurueck ob Stopcondition empfangen wurde uint8_t usi_is_stop void 89 40 41 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 74 76 77 78 79 80 81 82 83 84 86 87 88 return USISR amp 1 lt lt USIPF Gibt zurueck ob eine Kollision bemerkt wurde uint8_t usi_is_collision void return USISR amp 1 lt lt USIDC Setzt den zu uebertragenen Wert und sendet diesen void usi_set_data uint8d_t data Nur senden wenn im richtigen Zustand if usi_state USI_STATE_READ_SET usi_state USI_STATE_READ USIDR data l USISR 1 lt lt USIOIF Gibt den zuletzt empfangenen Wert zurueck uint8_t usi_get_data void Nur bestaetigen wenn im richtigen Zustand if usi_state USI_STATE_WRITE_GET usi_state USI_STATE_WRITE_ACK USISR 1 lt lt USIOIF return usi_data Z Prueft ob sich bei der Uebertragung etwas getan hat und reagiert darauf uint8_t usi_process void Warten um doppelte Abarbeitung desselben Events zu verhindern _delay_ms 8 if usi_is_start Sta
62. gangskondensator bertragen der sich so auf immer h here Spannungen aufl dt Betreibt man eine solche Schaltung ohne weitere Regelung ist sie weder kurzschlussfest da keine Bauteile zwischen Ein und Ausgang liegen die f r Gleichspannungen einen nennenswerten Widerstand aufweisen noch leerlauffest Die Spannung im Ausgangskon densator steigt an bis er durchschl gt Um das zu verhindern wird beim TL497C eine Regelungsschaltung verwendet Die beiden Widerst nde R5 und R6 wirken zwischen Ausgangsspannung und Masse geschaltet als Spannungsteiler Der IC berwacht die ISP In System Programming ISP erm glicht es Software in Controller zu laden ohne sie daf r aus der Schaltung ausbauen zu m ssen F r die Atmel Controller existieren Programmieradapter die an SV1 angeschlossen werden k nnen und die Verbindung zwischen Schaltung und dem PC mit der Programmiersoftware herstellen 10 Spannung an Pin 1 der zwischen den beiden Widerst nden liegt Ist sie kleiner als 1 2 V wird der interne Oszillator eingeschaltet und damit Energie von der Spule auf den Ausgangskondensator umgeladen die Ausgangsspannung also erh ht Wird diese Feed backspannung daraufhin gr er als 1 2 V wird der Oszillator dann wieder abgeschaltet was das Erzeugen einer zu hohen Spannung am Ausgangskondensator verhindert Im Dauerbetrieb mit einer Last am Ausgang ist die Ausgangsspannung nur von der zeit lichen Abfolge der Umladevorg nge zwischen Spule u
63. gramms aber auch zum bequemen Kopieren gedacht Legt man ein beschriebenes PROM ein und dr ckt auf Auslesen werden die im PROM abgelegten Daten in den Editor bernommen Sie k nnen dann in ein neues noch leeres PROM gebrannt und ggf vorher noch editiert werden In der Editoransicht lehnt sich die Bedienung an PC basierte Texteditoren an Die Pfeiltasten bewegen den Cursor die Tasten Page Up und Page Down scrollen die Ansicht um eine Bildschirmh he gagh B123 4567 3346 CLEF me FFF FFFF FFFF FEEF E EEE FFFF FFFF FFFF Seren Brennen Abbildung 10 Die Editoransicht In der linken Spalte wird die Adresse des jeweils ersten Bytes der Zeile hexadezimal angezeigt es folgen 8 Byte Daten Der Cursor steht im Bild an der Adresse 008h In der untersten Zeile sind die aktuellen Belegungen der Softkeys 1 2 und 4 angegeben Der Men punkt Info pr ft ob das eingesetzte PROM leer also nicht beschrieben ist und gibt eine kurze Meldung aus Dabei ist ein PROM leer wenn kein Byte einen anderen Wert als OxFF hat Zus tzlich k nnen hier nicht leere EEPROMs gel scht werden also komplett mit OxFF beschrieben werden Eine Bedienungsanleitung f r den Einsatz im Praktikum ist im Anhang enthalten Anhang B S 94 8 Fehlerbehebung und Reparaturen 8 1 Fehler im Betrieb Sollte das Ger t im Betrieb einmal in den Fehlerzustand geraten die Fehlerkontroll LED auf der Platine blinkt kann ein Reset einfach durch kurzes Trennen
64. h unten scrollen case KEY_PDOWN Je nach Anzahl der noch vorhandenen Zeilen im Puffer versuchen drei oder die max noch vorhandene Zeilenzahl herunterzuscrollen if EDITOR_MAXMEMSIZE 40 gt editor_start editor_start editor_start 24 editor_display else if EDITOR_MAXMEMSIZE 32 gt editor_start editor_start editor_start 16 editor_display else if EDITOR_MAXMEMSIZE 24 gt editor_start editor_start editor_start 8 editor_display break Eine Editorseite drei Zeilen nach unten scrollen case KEY_PUP Je nach Anzahl der noch vorhandenen Zeilen im Puffer versuchen drei oder die max noch vorhandene Zeilenzahl hinaufzuscrollen if editor_start gt 16 editor_start editor_start 24 editor_display else if editor_start gt 8 editor_start editor_start 16 editor_display 66 254 257 264 267 274 277 284 287 294 297 else if editor_start gt 0 editor_start editor_start 8 editor_display break Unbekannte Taste nichts tun default break Editor leeren und alle Variablen zuruecksetzen void editor_clear void uinti16_t i 0 Puffer bis zum End Pointer nach dem nur noch OxFF folgt wieder mit OxFF fuellen for i 0 i lt editor_end_pointer i editor_bufferl i Oxff d Alles zuruecksetzen editor_end_pointer 0 editor_start 0 editor_curso
65. i Zeichengr en um Wird hier eine 0 geschickt wird der Controller f r den Betrieb mit 5 x 7 Pixeln konfiguriert bei einer 1 f r 5 x 10 Das letzte beachtete Bit D1 schaltet bei einer gesetzten 1 einen bei manchen Displays notwendigen Spannungsinverter ein F r den 8 Bit Betrieb bei unserem mehrzeiligem LC Display wird also das Datum 0x38 bei RS 0 und R W 0 in den Controller geschrieben Danach wird der Cursor durch Schreiben von 0x02 auf die Startposition gesetzt Um Zeichen auf dem Display darzustellen m ssen die ASCII Codes der darzustellen den Zeichen in den Speicher des Displaycontrollers geschrieben werden Die HD44780 Controller unterscheiden zwischen zwei Speicherbereichen dem sog CG RAM in dem benutzerdefinierte Glyphen abgelegt werden und dem sog DD RAM in dem die anzu zeigenden Texte gespeichert werden Zum Schreiben von Daten in diesen Speicher muss also zun chst der DD RAM als Ziel des folgenden Datentransfers eingestellt werden Dies geschieht ber Befehl 8 es werden die Leitungen RS Register Select und R W Read Write auf 0 gesetzt so dass die folgenden Daten als Befehl interpretiert werden und ins Steuerregister eingelesen werden und die 7 bitige DD RAM Adresse zusammen mit einer 1 f r DD RAM am h chstwertigen Bit an die Datenleitungen gelegt Anschlie Bend wird der 8 Bit Code f r das darzustellende Zeichen mit RS 1 und R W 0 in das DD RAM geschrieben Nach dem Schreibzugriff wird die DD RAM Adresse automat
66. ind teils nur noch schwer verf gbar Als Ersatz f r die betagten Einplatinencomputer wurde jetzt ein benutzerfreundlicheres Programmierger t gesucht das ohne einen angeschlossenen PC verwendbar sein sollte Das Ger t musste also eine M glichkeit bieten Daten in die PROMs zu schreiben und wieder auszulesen aber auch die blicherweise in PC Software realisierten Funktionen f r Eingabe und Bearbeitung der Daten anbieten Daneben sollte es in der Lage sein die gesamte Kapazit t der EPROMs von 2KiB ohne Einschr nkungen zu nutzen Um eine kosteng nstige und flexible L sung zu erhalten sollte eine Eigenentwicklung verwendet werden Da in den Koblenzer Hardwarepraktika nur EPROMs der Serie 2716 und EEPROMs der Serie 2816 verwendet werden konnte eine verh ltnism ig einfache Schaltung verwendet werden so dass ein Aufbau mit den vorhandenen Hilfsmitteln denkbar schien Mit Hilfe der freien Version der Layoutsoftware EAGLE von CadSoft lassen sich zweilagige Platinen im halben Europakartenformat entwickeln die sich mit der vorhandenen tzanlage und blichen Werkzeugen gut fertigen und best cken lassen Im Rahmen dieser Studienarbeit wurden die Hardware und Software eines solchen Programmierger ts entwickelt 2 EPROMs und EEPROMs Unter der Bezeichnung Programmable Read Only Memories kurz PROM werden elek tronische Speicherbausteine zusammengefasst die sich mit beliebigen Daten beschreiben und danach immer wieder auslesen lassen Da
67. ingabe erwartet ein begonnener Nutz Datentransfer muss also vorher abgeschlossen werden Ist die Verbindung aktiv erwartet das Ger t den n chsten Befehl Nun k nnen die verschiedenen Funktionen in beliebiger Reihenfolge genutzt werden anschlie end kehrt das Ger t wieder in den Wartezustand zur ck und der n chste Befehl kann gegeben werden Es sind die folgenden Befehle definiert PC_DISCONNECT Beendet die Kommunikation zwischen PC und Ger t Das Ger t antwortet mit PC_DISCONNECT PC_SIZE Dieser Befehl fragt die Gr e des Editorpuffers ab also die nutzbare Gr e des PROMs Das Ger t antwortet mit 2 Byte die die Gr e repr sentieren Dabei ist das erste Byte das most significant byte MSB der Puffergr e das zweite das least significant byte LSB Bei Nutzung des ATmega644 ist dieser Wert typischerweise 2048 was auch der Gr e des PROMs mit 2KiB entspricht PC_INFO Das Ger t antwortet mit Informationen ber das eingesteckte PROM Das erste Byte ist PC_NEPROM f r ein normales EPROM bzw PC_EEPROM f r ein EEPROM Das zweite Byte teilt mit ob das PROM leer PC_EMPTY oder nicht leer PC_NEMPTY ist Da diese Funktion zur Abfrage des PROM Typs die Methode eprom_get_type a H 47 verwendet wird nicht erkannt ob tats chlich ein PROM eingesteckt ist sondern genau genommen nur die Stellung des Wahlschalters S1 abgefragt PC_CLEAR Das Ger t leert das eingesteckte EEPROM falls es nicht leer ist indem es d
68. ion Icd_write aus der Icd c s S 39 ff oder der hnlich aufgebauten Funktion eprom_write aus der Datei eprom c s S 47 ff Port B dient im Normalbetrieb als Anschluss f r einen 8 Bit breiten Bus an dem die niederwertigen Bits der 11 Bit breiten im PROM anzusprechenden Adresse anliegen die h herwertigen Bits liegen auf den Pins 4 bis 6 von Port D Die drei Pins PB5 bis PB7 dienen gleichzeitig zur Verbindung mit der auf einen zehnpoligen Wannenstecker herausgef hrten ISP Schnittstelle Den Port C teilen sich einige Steuerleitungen ber PCO und PC1 l uft der TWI Bus der den Hauptcontroller mit dem Tastaturcontroller verbindet Diese beiden Pins sind ber Pull Up Widerst nde von 10 kQ an die Versorgungsspannung gelegt so dass an ihnen immer ein definiertes Potential anliegt Die folgenden vier Pins sind mit Kontrollfunktionen f r das Display belegt PC6 schaltet die Ausg nge des EPROMs zwischen hoch und niederohmig um sie sind hochohmig wenn an PC6 ein High Pegel liegt PC7 steuert den eigentlichen Brennvorgang Liegt hier ein High Pegel wird auf das PROM geschrieben Port D stellt mit den Pins PDO und PD1 eine serielle Schnittstelle als Anschlussm g lichkeit f r Computer bereit Der n chste Pin von Port D PD2 dient als Anschluss f r eine LED Diese LED wird von unserem Programm zur Anzeige von Fehlerzust nden benutzt und kann in Fehlerf llen hilfreich sein in denen das LC Display nicht mehr angesprochen werden ka
69. isch inkrementiert bzw dekrementiert so dass fortlaufende Schreibzugriffe m glich sind Aber nicht alle Zeichen die im DD RAM liegen werden auch dargestellt denn die Controller unterst tzen intern zwei Zeilen mit je 40 Zeichen L nge Somit bietet das DD RAM beim hier verwendeten Display mit vier Zeilen zu je 27 Zeichen Platz f r mehr Zeichen als angezeigt werden k nnen Um Hardwareherstellern zu erm glichen Displays mit k rzeren Zeilenl ngen an diesen Controllern zu betreiben bieten die Controller eine Funktion zum Verschieben des dargestellten Inhalts hnlich einem virtuellen Anzeigefens ter das ber die Daten geschoben werden kann Wie sich das Display in dieser Hinsicht 15 Nr RS RW D7 D6 D5 D4 D3 D2 D1 DO Beschreibung 1 0 0 0 0 0 0 0 0 0 1 Display l schen 2 0 0 0 0 0 0 0 0 1 x Setzt Cursor an Position 0 3 0 0 0 0 0 0 0 1 R L D C Eingabemodus DO w hlt zwi schen Verschieben der Anzei ge 1 oder des Cursors 0 D1 w hlt Richtung 1 rechts 0 links 4 0 0 0 0 0 0 1 D C B Schaltet Display D2 Cursor D1 und Blinkfunktion D0 ein bzw aus 5 0 0 0 0 0 1 D C R L x x Verschiebt Display D3 1 oder Cursor D3 0 eine Stel le nach rechts D2 1 oder links D2 0 6 0 0 0 0 1 4 8 Z F I X Setzt div Einstellungen s Haupttext 7 0 0 0 1 A5 A4 A3 A2 Al AO Setzt Schreibadresse im CG RAM 8 0 0 1 A6 A5 A4 A3 A2 Al AO Setzt Schreibadresse im DD RA
70. itungen Port B und Pins D4 D6 fuer die LCD und EPROM Steuerleitungen Pins C2 C7 und D7 und fuer die LED Pin D2 DDRA 0x00 DDRB Oxff DDRC Oxfc DDRD amp 1 lt lt DDD3 DDRD Oxf4 Setzt die initialen Daten bzw Pull Up Widerstaende Deaktiviert die Pull Up Widerstaende am LCD EPROM Bus Port A und am EPROM EEPROM Schalter Pin D3 Setzt die EPROM Adressleitungen Port B und Pins D4 D6 die LCD Steuerleitungen Pins C2 C5 und die Brennleitung des EPROMs Pin C7 auf O0 Setzt die Output Leitung des EPROMs Pin C6 die Brennspannungsleitung Pin D7 und die LED Leitung Pin D2 auf 1 PORTA 0x00 PORTB 0x00 PORTC amp 0x03 PORTC 0x40 PORTD amp 0x03 PORTD 0x84 Initialisiert das LCD und den Editor lcd_init editor _ init Wird beim Starten des Controllers aufgerufen Initialisiert den Controller und uebergibt die Kontrolle an das Hauptmenue main void init menu_main return 0 34 P N O N Q Oo 14 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 29 P N oOo s Q a 11 12 13 14 16 A 1 3 misc h ifndef __MISC_H__ define __MISC_H__ include lt avr io h gt include lt inttypes h gt include lt util delay h gt Konstanten fuer die Datenrichtung am LCD EPROM Bus define MISC_DD_OFF 0 define MISC_DD_UC 1 define MISC_DD_EPROM 2 define MISC_DD_LCD 3 Konsta
71. kann empfangen werden case USI_STATE_READ usi_state USI_STATE_READ_ACK DDRB amp 1 lt lt SDA USISR Ox0Oe USISR 1 lt lt USIOIF break ACK wurde gesendet Wert kann empfangen werden case USI_STATE_WRITE_ACK usi_state USI_STATE_WRITE DDRB amp 1 lt lt SDA USISR 1 lt lt USIOIF break Wert wurde empfangen ACK vorbereiten Wert muss erst abgeholt werden case USI_STATE_WRITE usi_state USI_STATE_WRITE_GET usi_data USIDR DDRB 1 lt lt SDA USIDR 0x01 USISR Ox0e return USI_GET_DATA break Wert muss immer noch abgeholt werden case USI_STATE_WRITE_GET return USI_GET_DATA break default Unbehandelter Fall Fehler annehmen usi_reset break else if usi_is_stop Stopcondition Zuruecksetzen usi_reset else if usi_is_collision Kollision Zuruecksetzen usi_reset Nichts interessantes passiert return USI_NOP 92 187 188 USI zuruecksetzen en 1990 void usi_reset void 191 usi_state USI_STATE_START 192 DDRB amp 1 lt lt SDA 193 USISR 1 lt lt USISIF 1 lt lt USIOIF 1 lt lt USIPF 14 lt lt USIDC 194 93 B Bedienungsanleitung Der EPROM Programmer wird ber die beiden Laborbuchsen auf der R ckseite mit Spannung versorgt Nach dem Anlegen von 5 V Gleichspannung ist das Ger t sofort betriebsbereit und im Display wird das Hauptmen angezeigt Die
72. ktiviert oder deaktiviert den Output des EPROMs am LCD EPROM Bus void misc_set_dd_eprom uint8d_t enable Falls enable nicht 0 ist soll der Output aktiviert werden if enable PORTC amp 1 lt lt GOE else Der Output soll deaktiviert werden PORTO 1 lt lt GOE Aktiviert oder deaktiviert den Output des LCDs am LCD EPROM Bus void misc_set_dd_lcd uint8_t enable 36 66 67 68 69 70 ke 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 101 102 103 104 105 106 107 108 109 110 111 112 113 114 Falls enable nicht 0O ist soll der Output aktiviert werden if enable PORTC 1 lt lt RW else Der Output soll deaktiviert werden PORTC amp 1 lt lt RW Speichert aktuellen Zustand des LCD EPROM Busses uint8_t misc_data_direction Oxff Setzt die Datenrichtungen der Pins des Controllers des LCDs und des EPROMs am LCD EPROM Bus so dass nur einer der drei Teilnehmer darauf schreiben kann void misc_set_data_direction uintd_t dd Ist die neue Datenrichtung bereits gesetzt tue nichts if misc_data_direction dd return switch dd Niemand soll auf den Bus schreiben case MISC_DD_OFF Deaktiviere alle Outputs auf dem Bus misc_set_dd_uc 0 misc_set_dd_eprom 0 misc_set_dd_l1cd 0 break Der Controller soll au
73. lay_ms 250 I Beendet den Brennvorgang sollte nach dem letzten Aufruf von eprom_write aufgerufen werden void eprom_write_stop void switch eprom_type case EPROM_NEPROM EPROM Deaktiviere Brennspannung und setze den Typ des PROMs zurueck PORTD 1 lt lt VPPWE eprom_type EPROM_NOEPROM break case EPROM_EEPROM EEPROM Setze den Typ des PROMs zurueck eprom_type EPROM_NDEPROM break eprom_write_stop wurde aufgerufen ohne dass vorher eprom_write_start aufgerufen wurde default misc_error break Brennt den uebergebenen Wert an die uebergebene Adresse eprom_write_start muss vor dem ersten Aufruf aufgerufen werden 49 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 151 152 153 154 155 156 157 158 159 161 162 163 164 void eprom_write uint16_t address uintd_t data Der Controller soll auf den LCD EPROM Bus schreiben misc_set_data_direction MISC_DD_UC Die Adresse wird auf die Adress und der Wert auf die Datenleitungen gelegt PORTB PORTD PORTD PORTA I amp H address amp Oxff 0x70 address gt gt 4 amp 0x70 data Stabilisierung abwarten _delay_us 10 switch eprom_type case EPROM_NEPROM EPROM Brennimpuls fuer 50ms anlegen P
74. ller verbunden sind l sst sich die Anpassung an Typen die nicht pinkompatibel zum 2716 sind nur teilweise in Software vornehmen Die Pins 12 Uss 18 PGM 20 OE 21 Upp und 24 U sind mit Hilfs und Versorgungsspannungen belegt so dass EPROMs die auf einem dieser Pins eine Datenleitung haben nur nach einer entsprechenden berarbeitung der Platine verwendet werden k nnen Viele 16k EPROMs sind aber pinkompatibel zum 2716 so dass bei ihnen nur auf die Brennspannung geachtet werden muss Der Programmer stellt 25 V und 5 V bereit zwischen den beiden Spannungen wird ber den Schalter S1 umgeschaltet Der Software wird die Schalterstellung ber Port D3 mitgeteilt Er liegt an V wenn die Ladungspumpe zugeschaltet ist sonst an GND Prinzipiell w re auch eine Kaskadierung mehrerer Programmer vorstellbar so dass man ein Ger t f r die Eingabe des Programms verwendet und dieses Ger t dann das Programm und die Schreibbefehle an andere ber RS232 angeschlossene Ger te weitergibt die das Programm dann parallel in mehrere EPROMs schreiben k nnten 9 3 PC Steuerung Der Programmer ist in Hard und Software f r die Fernsteuerung durch ein PC Programm vorbereitet so dass er wie die weit verbreiteten Programmierger te ohne eigene Tastatur eingesetzt werden kann Dazu ist auf PC Seite ein Programm n tig das das in der pc c beschriebene Protokoll beherrscht und mit dem Controller ber die serielle Schnittstelle kommuniziert 32
75. lt stdio h gt void usart_init uint16_t baud uintd_t u2x uint8_t usart_has_data void uint8_t usart_read_char void void usart_write_char uint3d_t data void usart_write_string uint8_t str endif A 1 16 usart c include usart h Sendet ein Zeichen 1 Byte ueber RS232 int usart_write char data FILE stream Warte bis das letzte Byte komplett versendet wurde while UCSROA amp 1 lt lt UDREO Setze das zu sendende Zeichen UDRO data return 0 Datei Deskriptor der als stdout benutzt wird und ueber RS232 sendet FILE usart_out FDEV_SETUP_STREAM usart_write NULL _FDEV_SETUP_WRITE Initialisiert RSR232 und setzt stdout zum Senden ueber RS232 void usart_init uint16_t baud uintd_t u2x Divisor bei der Berechnung des Wertes des Baud Rate Registers uint16_t divisor 16 74 30 31 32 33 34 36 37 38 39 40 EN 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 74 76 77 78 Wenn die doppelte Baud Rate benutzt wird muss der Divisor halbiert werden if u2x 1 divisor 8 UCSROA l 1 lt lt UV2X0 Berechnen des Wertes des Baud Rate Registers uint16_t ubrr F_CPU divisor baud 1 Baud Rate Register setzen UBRROH ubrr amp 0x0f00 gt gt 8 UBRROL ubrr amp Ox00ff USART aktivieren UCSROB 1 lt lt RXE
76. n veranlasst Die I O Pins der Atmel Mikrocontroller werden in vier Ports die je 8 Bit breit sind unterteilt Diese Ports k nnen mit Hilfe der sogenannten DDR Register data direction register f r Port A etwa DDRA zwischen Ein und Ausgabe umgeschaltet werden Dazu wird dem entsprechenden DDR Register f r jeden Pin des Ports der als Ausgabe konfiguriert werden soll ein 1 Bit zugewiesen Die Umschaltung der Datenflussrichtung ist mit einigen Hilfsfunktionen in misc c zusammengefasst 6 2 2 Ansteuerung des Displays Nach der Initialisierung von USART TWI und dem Setzen einiger Kommunikations parameter wird beim Start des Hauptcontrollers aus der Methode init heraus auch das LC Display initialisiert Dazu wird die Funktion Icd_init aufgerufen die die Initialisierung und Parametrisierung des Displays bernimmt s S 39 W hrend die Dokumentation des Controllers vorschreibt den Controller durch drei maliges Senden von 0x30 mit kurzen Pausen zu initialisieren hat sich im Praxistest gezeigt dass dies nicht notwendig ist Die Initialisierung wird daher im vorliegenden Quelltext durch einmaliges Senden von 0x30 gefolgt von 0x38 zur Auswahl des 8 Bit Modus erledigt Dabei wird jeder der beiden Controller die das Display steuern getrennt initialisiert Nach erfolgter Initialisierung kann das Display zur Anzeige von Daten benutzt werden Beim Schreiben von Daten auf das Display muss programmintern bestimmt werden welcher der beid
77. nd Kondensator abh ngig KSWO06 S 496 weder von der Last noch von der Induktivit t der Spule Das Tastverh ltnis wird in der vorliegenden Schaltung durch den Kondensator C11 festgelegt Er wird durch eine Konstantstromquelle geladen So lange eine bestimmte Spannungsschwelle noch nicht erreicht ist schaltet der interne Oszillator die Spule an die Versorgungsspannung Beim Frreichen der Spannungsschwelle wird der Timerkondensator entladen und die Spule an den Ausgangskondensator geschaltet an den sie ihre Energie abgibt Das Tastverh ltnis ist dabei nur von der Kapazit t des Timerkondensators abh ngig aber nicht von der Eingangsspannung Zus tzlich zu diesem Schaltungsteil der den Ausgangskondensator vor berspannungen sch tzt enth lt der IC noch eine Schutzschaltung gegen zu hohe Umladestr me Wenn ber einen zwischen Pin 13 und 14 geschalteten Widerstand hier R4 eine h here Spannung als 0 7 V abf llt wird eine interne Strombegrenzung aktiviert die verhindert dass die Spule durch zu hohe Str me besch digt wird Diese Schaltung entspricht der Konfiguration die schon bei den ECB Ger ten verwendet wurde 5 1 3 RS232 Schnittstelle Die RS232 Schnittstelle codiert logische Zust nde bin r als Spannungspegel von 25 V bis 3 V sowie 3 V bis 25 V Der negative Spannungsbereich steht dabei f r eine logische 1 der positive f r eine logische 0 Zur Erzeugung dieser Spannungen laufen die Signale der Pins DO und D1 des Hauptc
78. nd Verbunden wechseln Zaehler zuruecksetzen und Bestaetigung schicken pc_state PC_STATE_CONNECTED pc_write_i 0 usart_write_char PC_WRITTEN else Daten stehen noch aus Bestaetigung senden weitere Daten erwarten usart_write_char PC_WRITE_NEXT break Unbekanntes Zeichen verwerfen default break 81 227 228 229 230 231 232 233 Stoppt das PC Protokoll und setzt alle Variablen zurueck 234 233 void pc_stop void 236 237 Nur zuruecksetzen wenn nicht bereits gestoppt 238 if pc_state PC_STATE_STOP 239 240 Falls noch verbunden trennen 241 if pc_state PC_STATE_START 242 usart_write_char PC_DISCONNECT 243 244 245 Zuruecksetzen 246 pc_state PC_STATE_STOP 247 pc_write_size 0 248 pc_write_i 0 249 250 251 252 A 2 Tastaturcontroller A 2 1 tastencontroller h ifndef __TASTENCONTROLLER_H__ define __TASTENCONTROLLER_H__ P N include lt avr io h gt include lt inttypes h gt include lt util delay h gt include usi h o s Q u Konstanten fuer die Zuordnung von Gruppenleitungen der w Tastatur zu Pins an Port D define WIRE_GROUP1 2 2 define WIRE_GROUP2 3 13 define WIRE_GROUP3 4 14 define WIRE_GROUPA 5 16 Konstanten fuer die Zuordnung von Gruppenleitungen der e Tastatur zu Pins an Port A bzw B s Port A 19 define WIRE_PURPLE O 82 20 21 22 23
79. nikation beginnt wenn die PC Funktion am Programmierger t ber den entsprechenden Eintrag des Hauptmen s aktiviert wird Nun kann der PC das Signal 23 PreYu AR chi 1 00v WM 100v MH4 00ms A Chi 1 434V 7 400 Abbildung 7 Dieses Oszillogramm zeigt die bertragung eines Tastendrucks auf dem TWI Bus Das SDA Signal ist auf Kanal 1 gelb das SCL Signal auf Kanal 2 t rkis aufgetragen Um die Signale deutlicher erkennen zu k nnen sind ihre Nullpegel leicht gegeneinander verschoben Links im Bild erkennt man wie der Hauptcontroller SDA auf Massepegel zieht und damit die bertragung einleitet Es schlie t sich der Austausch der Adressen und die bertragung des Datenworts 00011010 der Code der Taste BildAuf an Danach wird die Kommunikation per Stop Condition beendet PC_CONNECT senden Daraufhin antwortet das Ger t mit PC_VERSION also der Version des PC Protokolls die das Ger t benutzt Der PC sollte die Protokollversion auswerten und falls er die Version des Ger tes nicht unterst tzt eine entsprechende 12 Alle Konstanten die f r das PC Protokoll gebraucht werden sind in der Datei pc h des Hauptcontrollers zu finden vgl Listing A 1 17 S 76 24 Fehlermeldung ausgeben und die Verbindung trennen Dies geschieht durch Senden von PC_DISCONNECT und wird mit dem gleichen Wert vom Ger t best tigt Die Funktion zur Verbindungstrennung steht allerdings nur zur Verf gung wenn das Ger t gerade keine andere E
80. nn PD3 ist f r die Umschaltung zwischen dem EPROM und dem EEPROM Modus zust ndig die Software wertet aus ob ber den Schalter S1 an diesen Pin Masse oder Voc Pegel gelegt wurde Auf den folgenden drei Pins PD4 bis PD6 liegen die h herwertigen Bits der 11 Bit breiten PROM Adresse s o PD7 schlie lich kontrolliert die Brennspannung Im EEPROM Modus wird er ber S1 an Pin 8 des Prom Sockels gelegt so dass dort der Brennimpuls mit 0 V direkt angelegt werden kann Im EPROM Modus wird er als Steuerleitung f r den step up Regler verwendet der 5V oder 25 V Brennspannung an das EPROM liefert 5 1 2 Erzeugen der Brennspannung Da die Schaltung mit 5 V Betriebsspannung arbeitet muss f r die Erzeugung der Brenn spannung von 25V ein gewisser Aufwand getrieben werden Grundlage daf r ist ein Schaltregler IC vom Typ TL 497 von Texas Instruments TI95 Dieser IC enth lt die Grundschaltung eines Aufw rts Spannungswandlers Bei diesen Wandlern wird ein Aus gangskondensator relativ hoher Kapazit t in unserer Schaltung C6 mit 100 uF auf eine Spannung aufgeladen die deutlich ber der Betriebsspannung der Schaltung liegt Dazu wird eine Induktivit t hier L2 wechselweise an die Betriebsspannung gelegt und dann mit dem Ausgangskondensator verbunden In der Spule wird also ein Magnetfeld aufgebaut Beim Umschalten bricht es zusammen und induziert dabei eine Spannung in der Spule Die zuvor im Magnetfeld gespeicherte Energie wird dabei in den Aus
81. nten die den Pins am Controller Namen geben die ihre Funktion widerspiegeln define GOE PORTC6 define RW PORTC3 define LED PORTD2 define EPCE PORTC7 define EPEEP PD define VPPWE PD void misc_error void void misc_set_data_direction uintd_t dd uint8_t misc_halfbyte_to_char uint8d_t hb endif A 1 4 misc c include misc h I Erzeugt eine Fehlermeldung indem das Programm in eine Endlosschleife gefuehrt wird in der die LED immer wieder an und ausgeschaltet wird Eine Rueckkehr aus diesem Zustand ist nur durch einen Reset des Controllers moeglich void misc_error void Erzeugen einer Endlosschleife damit die normale Programmausfuehrung verhindert wird while 1 Schalte die LED ein und warte 0 5 Sekunden PORTD amp 1 lt lt LED 35 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 _delay_ms 250 _delay_ms 250 Schalte die LED aus und warte 0 5 Sekunden PORTD 1 lt lt LED _delay_ms 250 _delay_ms 250 Aktiviert oder deaktiviert den Output des Controllers am LCD EPROM Bus void misc_set_dd_uc uint8_t enable Falls enable nicht 0 ist soll der Output aktiviert werden if enable DDRA Oxff else Der Output soll deaktiviert werden DDRA 0 PORTA 0 A
82. ntroller der Serien ATmega und ATtiny entschieden Nachdem die Kontrollaufgaben nicht zeitkritisch und das eigentliche Programm relativ nttp www stag co uk products_p301 html nttp www logicaldevices com Products chipkopier htm http www duncaninstr com datamns4 htm einfach sind w ren auch leistungsschw chere energieeffizientere Controller wie die der MSP430 Serie von Texas Instruments eine Alternative gewesen Es war aber f r einen wartungsfreundlichen Aufbau auch gew nscht Controller im klassischen DIL Geh use zu nutzen die f r einen leichten Austausch in IC Sockeln montiert werden Controller anderer Serien sind in dieser Bauform meist nicht mehr erh ltlich was ein weiterer Grund f r die Nutzung der Atmel Controller war Die zuvor verwendeten Siemens Einplatinencomputer verf gten nur ber ein einzei liges LED Display mit 8 Stellen Verschiedene Men ebenen oder Befehle wurden mit Kennziffern angezeigt die optisch nicht von den einzugebenden Daten abgesetzt wa ren Um den Bedienkomfort zu verbessern sollte im Nachfolgeger t auf jeden Fall ein mehrzeiliges Display genutzt werden um eine Men f hrung mit Klartextbezeichnern und eine bersichtliche mehrzeilige Programmdarstellung zu erm glichen Hier werden derzeit sehr viele Bauformen angeboten Sowohl grafikf hige als auch textorientierte LC Displays die vier oder mehr Zeilen von mehr als 20 Zeichen der f r die Darstellung im Stil eines Hexeditors notwendigen Z
83. ontrollers ber ein Pegelwandler IC vom Typ Maxim MAX232 Der MAX232 verwendet intern eine Ladungspumpe die die Betriebsspannung von 5 V verdoppelt und einen Inverter der zu den 10 V noch 10 V bereitstellt MAX04 Durch diese transparente Pegelwandlung kann der Hauptcontroller das Protokoll das f r die Kommunikation mit dem PC ber diese Schnittstelle verwendet wird unmittelbar ber DO und D1 abwickeln Die Erzeugung und Verarbeitung des Protokolls wird von den Funktionen in der pc c s S 77 erledigt 5 2 Tastatur und Tastaturcontroller Die Tasten der hexadezimalen Tastatur sind mit Zeilen und Spaltenleitungen zu einer Matrix verkabelt so dass jede Taste ber den Schnittpunkt von Zeilen und Spaltenleitung an dem sie liegt eindeutig identifizierbar ist Diese Leitungen liegen direkt an den 1 O Pins des Controllers Wegen der Funktion der Zeilenleitungen im Programm des Tastaturcontrollers s u werden wir sie in der Regel als Gruppenleitungen bezeichnen 11 5 6 7 8 gelb wei violett orange Gruppe 3 Gruppe 4 Gruppe 2 Gruppe 1 gr n rot blau braun Abbildung 5 Skizze der Tastatur Jede Taste ist mit einer der vier schwarzen Grup penleitungen und einer der farbcodierten Spaltenleitungen verbunden Die drei unbeschrifteten Bohrungen zwischen Pfeiltasten und Softkeys sind f r Kontroll LEDs vorgesehen 12 Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4 1 gr n 0 8 Links OK 2 rot 1 9 Recht
84. r Platine verschoben worden Da es bei der manuellen Best ckung der zweiseitigen Platinen nicht immer einfach ist Durchf hrungspins auf beiden Seiten der Platine zu verl ten wurde in der neuesten Version 0 32 noch eine zus tzliche Verbindung zweier Massefl chen eingef gt 5 1 Hauptplatine 5 1 1 Beschaltung des Hauptcontrollers Der ATmega644 ben tigt nur eine sehr einfache externe Beschaltung 32 der 40 Pins des DIL Geh uses stehen als I O Pins zur Verf gung Der Mikrocontroller wird wie im Datenblatt vorgeschlagen ber die Pins 9 bis 11 und 30 bis 32 mit Versorgungs und Referenzspannung versorgt Der Reset Anschluss Pin 9 liegt ber den Pull Up Widerstand R1 an der Versorgungsspannung und kann bei Bedarf ber JP3 auf Masse gelegt werden was einen Reset des Controllers ausl st Nachdem wir f r unsere Anwendungen keine besonderen Anforderungen an die Konstanz der Taktfrequenz stellen bleiben die Anschl sse f r einen externen Quarz Pin 12 und 13 unbeschaltet Damit wird der interne Taktgenerator des Controllers mit einer Frequenz von 1 MHz benutzt Die I O Pins des Controllers werden zu vier Ports bezeichnet mit A bis D zusammen gefasst Unsere Schaltung nutzt Port A also die Pins PAQ bis DAY als kombinierten Datenbus f r das PROM und das LC Display Die hier angelegten 8 Bit breiten Datenworte werden 1 2 3 4 5 6 7 8 Abbildung 4 Pinbelegung des ATmega644 Die Pins von Port A sind mit PAO bis PA7 b
85. r_position 0 EPROM in den Puffer lesen void editor_read_eprom void editor_end_pointer 0 uint16_t i 0 EPROM auslesen und Endpointer neu setzen for i 0 i lt EDITOR_MAXMEMSIZE i editor_buffer i eprom_read i if editor_buffer i Oxff editor_end_pointer i 1 67 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 e N rz oOo so u 10 11 12 13 14 16 dg 18 19 20 Anzeige auf Anfang setzen editor_start 0 editor_cursor_position 0 is Brennt den Inhalt des Puffers in das EPROM void editor_burn void Brennvorgang initialisieren eprom_write_start uinti16_t i 0 EPROM brennen dabei Oxff auslassen for i 0 i lt editor_end_pointer i if editor_buffer i Oxff eprom_write i editor_buffer li F Brennvorgang beenden eprom_write_stop b A 1 13 twi h ifndef __TWI_H__ define __TWI_H__ include lt avr io h gt include lt inttypes h gt Konstanten die die eigene Adresse und das Timeout define TWI_ADDRESS 1 define TWI_TIMEOUT 2000 Konstanten die fuer die Zustaende stehen define TWI_STATE_STOP o define TWI_STATE_START 1 define TWI_STATE_ADDRESS_SET 2 define TWI_STATE_ADDRESS 3 define TWI_STATE_READ 4 define TWI_STATE_READ_GET 5 Konstanten die fuer Statusmeldunden
86. rde das Programm des Hauptcontrollers in C geschrieben Es umfasst kommentiert ca 2000 Zeilen in 9 Dateien Als Entwicklungsumgebung diente AVRStudio mit WinAVR Sp ter wurde unter Linux der AVR Compiler gcc avr mit der Biblio thek avr libce und einer angepassten Makefile von WinAVR genutzt Das kompilierte Programm wurde mittels des Tools avrdude und eines ISP Programmierger ts mit USB Anschluss auf den Controller geschrieben der damit beim Programmieren in der Schaltung verbleiben konnte http atmel com dyn products tools_card asp tool_id 2725 1Onttp winavr sourceforge net Hnttp wwiw nongnu org avrdude das entsprechende grafische Frontend avrdude gui ist unter der Adresse http sourceforge net projects avrdude gui verf gbar 18 no vr o H HH Als Konvention wurde festgelegt dass die Namen von Funktionen mit dem Namen ihrer Quelldatei beginnen Die Funktion error aus der Datei misc c hei t also misc_error 6 2 1 Hauptprogramm und allgemeine Hilfsfunktionen Legt man eine Versorgungsspannung an den Controller startet er das geladene Programm automatisch Wie bei C blich ist der Einsprungpunkt ins Programm die main Funktion Sie liegt in der Datei hauptcontroller c A 1 2 s S 33 Dort werden einige hardwarespezifische Konstanten gesetzt die das Ansprechen der Ports im Programm vereinfachen und schlie lich die Funktion meng maint aufgerufen die das Men im Display anzeigt und die Abfrage von Tastendr cke
87. rt Texas Instruments Inc 1995 TL497AC TL497 AI TL497AC Switching Voltage Regulators Dallas Die im Text angegebenen URLs wurden am 17 Juli 2007 abgerufen 100
88. rtcondition usi_state USI_STATE_ADDRESS USISR 1 lt lt USISIF 90 89 else if usi_is_overflow Overflow 90 91 Abhaengig vom Zustand reagieren 92 switch usi_state 93 94 Adresse wurde uebertragen 05 case USI_STATE_ADDRESS 96 97 if USIDR gt gt 1 USI_ADDRESS 98 Eigene Adresse wurde angesprochen 99 100 if USIDR amp 0x01 101 Wert soll geschrieben werden 102 usi_state USI_STATE_READ_ACK 103 else 104 Wert soll gelesen werden 105 usi_state USI_STATE_WRITE_ACK 106 107 108 ACK senden 109 DDRB 1 lt lt SDA 110 USIDR 0x00 111 USISR O0Ox0e 1 lt lt USIOIF 112 else Im falschen Zustand 113 usi_reset 114 115 116 break 117 118 ACK wurde gesendet Wert soll nun gesetzt werden 119 case USI_STATE_READ_ACK 120 121 if USIDR amp 0x01 Kein ACK 122 usi_reset 123 else ACK 124 125 Wert muss nun gesetzt werden 126 usi_state USI_STATE_READ_SET 127 DDRB 1 lt lt SDA 128 return USI_SET_DATA 129 F 130 131 break 132 133 Wert muss immer noch gesetzt werden 134 case USI_STATE_READ_SET 135 return USI_SET_DATA 136 break 137 91 138 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 ACK
89. s Beschreiben wird dabei blicherweise als brennen bezeichnet PROMs sind frei addressierbar Sie werden h ufig als Speicher f r Steuerprogramme genutzt die sich zur Laufzeit nicht ver ndern Inttp www cadsoft de Im Rahmen des Hardwarepraktikums werden PROMs als Ersatz f r gr ere Schalt netze verwendet die sonst f r die in den Experimenten aufzubauenden Schaltwerke vonn ten w ren Die Festwertspeicher sind l schbar um eine Korrektur der gespeicherten Daten zu erleichtern und zu verhindern dass f r jede Veranstaltung neue Speicherchips bereitgestellt werden m ssen Nach der zum L schen verwendeten Technik unterscheidet man dabei Erasable PROMs EPROMs und Electrically Erasable PROMs EEPROMs selten auch E PPROMs abgek rzt Zum L schen des Speicherinhalts werden EPROMs in geeigneten L schger ten mit UV Licht bestrahlt EEPROMs werden einfach durch erneu tes Beschreiben mit einem konstanten Wert etwa OxFF gel scht Bei EEPROMs ist ein L schvorgang eigentlich nicht n tig da bestehende Programme einfach berschrieben werden k nnen es ist jedoch bei der manuellen Fehlersuche bersichtlicher wenn in den Speicherzellen hinter dem letzten Byte des Programms nur noch konstante Werte folgen Derzeit werden Speicher mit einer Kapazit t von 2KiB verwendet genauer EPROMs vom Typ 2716 und EEPROMs des Typs 2816 die pinkompatibel zum Typ 2716 sind Die Speicherchips haben ein 24 poliges DIL Geh use so dass sie
90. s PD 3 blau 2 A Unten PU 4 braun 3 B Oben 5 gelb 4 C SK 1 6 wei 5 D SK 2 7 violett 6 E SK 3 8 orange 7 F SK 4 Tabelle 2 Verdrahtung der Tastaturmatrix Die Tasten liegen am Kreuzungspunkt einer Gruppenleitung schwarz und einer der durchnummerierten Spaltenleitungen Der Schaltung der Platine des ATtiny2313 der f r die Auswertung der Tastatureingaben zust ndig ist ist noch einmal deutlich einfacher als die der Hauptplatine Der Controller ist ber die Pins 10 und 20 unmittelbar an die Versorgungsspannung angeschlossen Pin 1 kann ber einen Jumper an Masse gelegt werden und l st damit einen Reset aus Die Pins 2 und 3 sind f r Diagnosezwecke als TX und RX Leitung einer RS232 Verbindung nutzbar diese Funktion wird im Normalbetrieb aber nicht ben tigt und ist daher im Programm des Controllers nicht implementiert Dennoch ist die Nutzung dieser Schnittstelle auf der Platine vorbereitet Beide Pins werden ber eine Steckerleiste zug nglich gemacht Um diese Diagnoseschnittstelle zu nutzen m ssten ihre Signale wie beim Hauptcontroller mit Hilfe eines Pegelwandler Bausteins an die korrekten RS232 Pegel angepasst werden An den beiden folgenden Pins 4 und 5 k nnte ein externer Quarzoszillator angeschlossen werden Da wir aber wie beim Hauptcontroller auch hier keine besonderen Anspr che an die Qualit t der Taktfrequenz stellen und mit dem internen Taktgenerator arbeiten dienen diese beiden Pins als Anschl s
91. s weicht davon etwas ab An Noe liegt hier grunds tzlich ein TTL High Pegel also ca 5V Nach dem Anlegen des Daten 5Das Datenblatt schreibt eine Zeit von 50 ms vor 17 M2716 Abbildung 6 Pinbelegung von EPROMs des Typs 2716 nach Tho94 Die mit AO bis A10 bezeichneten Anschl sse sind Adresspins Q0 bis Q7 Datenpins und Adressworts muss Noe f r 1 us auf Low Pegel gebracht werden um ein Datum zu schreiben Um die gespeicherten Inhalte auszulesen muss die gew nschte Adresse wiederum als 11 Bit langes Datenwort an den Adressport des Chips gelegt werden Liegt dann ein Low Pegel an G Output Enable und EP Chip Enable an kann das ausgew hlte Datum am Ausgang ausgelesen werden Zwischen dem Betrieb mit EPROMs und EEPROMs wird ber den Schalter S1 umgeschaltet Dieser Schalter wird vom Hauptcontroller abgefragt indem der Pegel an Pin 17 berpr ft wird In der Schalterstellung EPROM liegt dort ein High Pegel an sonst liegt der Pin an GND Gleichzeitig legt der Schalter Pin 8 der IC Fassung an die EPROM Brennspannung von 25 V bzw verbindet ihn zum Programmieren von EEPROMs mit Pin 21 des Hauptcontrollers 6 2 Das Programm des Hauptcontrollers im Detail Auf dem Hauptcontroller also dem zentralen ATmega644 laufen alle Routinen zur Steue rung des Displays des Brennvorgangs und der Kommunikation ber RS232 bzw TWI Um diese relativ umfangreichen Funktionen einfach und leicht wartbar programmieren zu k nnen wu
92. se f r Datenleitungen Auf den Pins 4 und 5 liegen zwei der Spaltenleitungen Die folgenden vier Pins werden von den Gruppenleitungen belegt die Pins 12 bis 16 und 18 von den brigen Spaltenleitungen Die beiden Leitungen des Zweidrahtbusses der die Daten vom Tastatur zum Hauptcontroller bertr gt belegen schlie lich die Pins 17 und 19 Die nicht ganz regelm ige Verteilung der Datenleitungen auf die Anschl sse wird zum Teil durch das dadurch einfachere Platinenlayout zum Teil aber auch durch die Belegung der Pins des Mikrocontrollers erzwungen 5 3 Display Das verwendete LC Display vom Typ C2704M kann 108 Zeichen in vier Zeilen zu je 27 Stellen darstellen Jedes Zeichen ist als Punktmatrix aus 8 Zeilen mit je 5 Pixeln die 8 Zeile ist normalerweise f r den Cursor reserviert ausgef hrt so dass neben alphanumerischen Zeichen auch viele Sonderzeichen dargestellt werden k nnen Der EPROM Programmer nutzt allerdings nur den blichen ASCII Zeichensatz Gesteuert wird das Display von zwei Controllern von denen einer den oberen beiden der andere den unteren beiden Zeilen zugeordnet ist Die Controller sind zum Befehlssatz 13 der verbreiteten HD44780 Controller kompatibel 5 3 1 Pinbelegung Bei den verwendeten Displays kommt eine h ufig verwendete externe Beschaltung mit 8 Datenleitungen sowie verschiedenen Leitungen zur Spannungsversorgung und zur Ansteuerung der Controller zum Einsatz Insgesamt kommen hier damit 15 Leitung
93. sobald eine gefunden wurde for group 0 group lt 4 group t wire check_group groups group if wire 0 Eine Taste wurde gedrueckt break b b if wire 0 Eine Taste wurde gedrueckt Die zu der Gruppe und dem Kabel gehoerende Taste zurueckgeben return keys group 8 wire 1 else Keine Taste wurde gedrueckt return KEY_NONE 6 3 2 Kommunikation mit dem Hauptcontroller Erkennt der Tastaturcontroller einen Tastendruck wird der Code der gedr ckten Taste ber eine TWI Verbindung an den Hauptcontroller gemeldet Der ATtiny2313 unter 28 st tzt allerdings das auf dem ATmega644 bereits implementierte TWI nicht direkt Statt dessen ist ein vereinfachtes Bussystem das sogenannte USI Universal Serial Interface implementiert Dieses befindet sich auf einer etwas niedrigeren hardware n heren Ab straktionsebene Die bertragenden Daten werden vom Controller nicht vorverarbeitet sondern m ssen vom laufenden Programm interpretiert werden Der Controller kann da mit nur mit Hilfe zus tzlicher Software mit TWI Ger ten kommunizieren Die Funktionen der usi c implementieren das TWI Protokoll auf dem USI und stellen die Schnittstelle f r die Daten bertragung dar 7 Bedienung Nach dem Einschalten des Ger ts wird in der untersten Displayzeile das Hauptmen angezeigt Die einzelnen Men punkte k nnen mit den zugeordneten Softkeys direkt unter dem Display angew hlt werden Hauptm
94. st sich allerdings in gewissen Grenzen an andere Einsatzsituationen anpassen 9 1 Aufbau ohne Geh use Geeignete Pultgeh use mit Platz f r eine Tastatur und das Display sind realtiv teuer Eigenbaugeh use mit viel Arbeitsaufwand verbunden Ein Aufbau der oben beschriebenen Platinen ohne Geh use ist aber schwierig da die Tastaturcontroller Platine und die Fassung des EPROM Sockels relativ klein und unhandlich sind Au erdem ist f r die Tastatur keine Platine vorgesehen Auf einer ganzen Europlatine sollte wenn man kleine Tasten mit kleinen Abst nden in Kauf nimmt die komplette Schaltung Platz finden Da die verwendete Version des Platinenlayoutprogramms EAGLE nur die halbe Europlatinengr e unterst tzt wurde f r diese Version kein Layout erstellt Alternativ k nnte die Schaltung auch auf zwei halbe Europlatinen verteilt werden die auf die verbreiteten Laborgeh use montiert werden k nnen und neben der Stromversor gung nur durch die zwei Dr hte des I C Busses verbunden sein m ssten Durch den RS232 Anschluss kann der Brenner wie die meisten kommerziell angebote nen Ger te aber auch ganz ohne Tastatur und Display verwendet werden Damit l sst sich das gesamte Ger t in ein kompaktes Geh use von etwa 9 x 12 x 3cm einbauen ben tigt allerdings einen PC mit entsprechender Software f r die Ansteuerung 31 9 2 Erweiterungen Die Anpassung an andere PROM Typen ist schwieriger Da nicht alle Pins des PROMs mit dem Contro
95. st uint8_t WIRES_AT_D 1 lt lt WIRE_GROUP1 1 lt lt WIRE_GROUP2 1 lt lt WIRE_GROUP3 1 lt lt WIRE_GROUPA I Array der Gruppenleitungen um besser ueber diese iterieren zu koennen const uint8_t groups WIRE_GROUP1 WIRE_GROUP2 WIRE_GROUP3 WIRE_GROUP4A Z Array der Tasten um besser ablesen zu koennen welche gedrueckt wurde const uint8_t keys KEY_O KEY_1 KEY_2 KEY_3 KEY_4 KEY_5 KEY_6 KEY_7 KEY_8 KEY_9 KEY_A KEY_B KEY_C KEY_D KEY_E KEY_F KEY_LEFT KEY_RIGHT KEY_DOWN KEY_UP KEY DEI KEY_SK2 KEY_SK3 KEY_SK4 KEY_OK KEY_PDOWN KEY_PUP KEY_NONE KEY_NONE KEY_NONE KEY_NONE KEY_NONE Diese Taste wurde gedrueckt uint8_t pressed_key KEY_NONE Diese Taste wurde auch wieder losgelassen uint8 _t typed_key KEY_NONE Prueft die uebergebene Gruppe auf eine gedrueckte Taste und gibt die Nummer der Gruppenleitung zurueck uint8_t check_group uint8_t wire_group O an die gegebene Gruppe legen DDRD 1 lt lt wire_group Stabilisierung abwarten _delay_us 10 Speichern an welchen Gruppenleitungen die 0 ankommt uint8_t b PINB WIRES_AT_B uint8_t a PINA WIRES_AT_A O wieder wegnehmen DDRD amp WIRES_AT_D if b lt Oxff a lt Oxff An einer der Gruppenleitungen kam die O an Rueckgabewerte entsprechend der Gruppenleitung 84 57 if b amp 1 lt lt WIRE_GREEN 0x00 58 return 1 59
96. stehen define TWI_NOP O 68 angeben 21 22 23 24 26 27 28 29 30 31 e N ra oo no u 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 30 31 32 33 34 36 define TWI_SET_ADDRESS 1 define TWI_GET_DATA 2 define TWI_ERROR 3 void twi_init void uint8_t twi_get_data void uint8d_t twi_read uint8_t address endif A 1 14 twi c include twi h Speichert den aktuellen Zustand uint8_t twi_state TWI_STATE_STOP Speichert den zuletzt uebertragenen Wert uint8_t twi_data Oxff Initialisiert TWI Setzt die eigene Adresse sowie die Uebertragungsgeschwindigkeit und aktiviert TWI vd void twi_init void Setze die eigene Adresse TWAR TWI_ADDRESS lt lt 1 Setze die Vebertragungsgeschwindigkeit TWBR 32 TWSR 2 Aktiviere TWI TWCR 1 lt lt TWEN Z Setzt die Slave Adresse und sendet diese void twi_set_address uint8d_t address Nur senden wenn im richtigen Zustand if twi_state TWI_STATE_ADDRESS_SET In neuen Zustand gehen twi_state TWI_STATE_ADDRESS 69 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 66 67 68 69 70 T4 72 73 74 76 TE 78 79 80 81 82 83 84 Adresse setzen und ReceiverMode aktivieren TWDR address lt lt 1 0x01 Uebertragen TWCR 1 lt lt TWEN 1 lt lt TWINT
97. tig ctl LCD_CTL_TOP else if pos lt 54 Position G Der richtige Controller ist umgerechnet werden pos 2 in der Zeile 64 ist der Of ctl LCD_CTL_TOP pos pos 27 64 43 nbreite setzen dabei zmei zeilig setzen 0 0x30 8 0x38 1 0x01 2 0x02 en Cursor nach rechts zeige 6 0x06 c 0x0c sition des Cursors auf jiessend dort schreiben zu 0O und 107 4 x 27 1 richtige Position im Zeile 1 der obere Umrechnung ist in Zeile 2 der obere Position muss 7 entspricht der Position fset fuer die 2 Zeile 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 227 244 245 246 247 248 249 251 252 else L Jy ctl pos else Lei ctl pos else if pos lt 81 Position ist in Zeile 3 Der richtige Controller ist der untere Position muss umgerechnet werden pos 54 entspricht der Position in der Zeile kein Offset fuer die 1 Zeile LCD_CTL_BOTTOM pos 54 if pos lt 108 Position ist in Zeile 4 Der richtige Controller ist der untere Position muss umgerechnet werden pos 81 entspricht der Position in der Zeile 64 ist der Offset fuer die 2 Zeile LCD_CTL_BOTTOM pos 81 64 keine gueltige Position misc_error Schreibe die umgerechnete Position in den richtigen Controller
98. types h gt include lt util delay h gt Konstanten die fuer die Pins von SDA und SCL stehen define SDA DDB5 define SCL DDB7 Konstanten die die eigene Adresse und das Timeout angeben define USI_ADDRESS 2 define USI_TIMEOUT 100 Konstanten die fuer die Zustaende stehen define USI_STATE_START 0 define USI_STATE_ADDRESS 1 define USI_STATE_READ_ACK 2 define USI_STATE_READ_SET 3 define USI_STATE_READ 4 define USI_STATE_WRITE_ACK 5 define USI_STATE_WRITE 6 define USI_STATE_WRITE_GET 7 Konstanten die fuer Statusmeldunden stehen define USI_NOP O define USI_SET_DATA 1 define USI_GET_DATA 2 void usi_init void void usi_set_data uint8d_t data 88 34 36 37 38 39 40 41 P N oO s Q Oo 10 11 12 13 14 16 Le 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 36 37 38 39 uint8_t usi_get_data void uint8_t usi_process void void usi_reset void endif A 2 4 usi c include usi h Speichert den aktuellen Zustand uint8_t usi_state USI_STATE_START Speichert den zuletzt uebertragenen Wert uint3d_t usi_data Initialisiert USI Aktiviert USI und konfiguriert SDA und SCL void usi_init void USICR 1 lt lt USIWM1 1 lt lt USIWMO 1 lt lt USICS1 PORTB 1 lt lt SDA 1 lt lt SCL DDRB amp 1 lt lt SDA DDRB 1 lt lt SCL Gibt zurueck ob Startcondition emp
99. uch zum einfachen Kopieren von PROMs genutzt werden Nachdem ein PROM mit den gew nschten Daten ausgelesen wurde k nnen diese aus dem Editor in beliebig viele weitere PROMs gebrannt werden B 4 PC Steuerung ber die Funktion PC wird das Ger t f r die PC Steuerung vorbereitet Nach dem Auf ruf dieser Funktion kann vom PC Programm aus die Verbindung zum Programmierger t hergestellt werden Es kann so vom PC aus gesteuert werden 95 C Schaltpl ne VC gt VC EE MISO PB6 MOSI PB5 XTAL2 PB4 OCI PB3 PB2 A AIN1 PB1 T PERS JP1 ICP PD6 T1 PD5 Stromversorgung T0 PD4 UNT1 PD3 INTO PD2 TXDJPD RXD PDO AT90S2313P GND GND Abbildung 12 Schaltplan des Tastaturcontrollers An SV1 sind die Zeilen und Spalten leitungen der Tastaturmatrix angeschlossen 96 ONS AND A O Wee Uod WOH AND LI lt Q BunBaossoaufdns 0 ZEZXYN NIZH LIOeH NILH 1NnOtH Diech NIZL LOL NILL Z9 Lol 38S34aV NOUd43 IA LAS l o o 7 lecken Hodel z o NaLVa a9V NOUd43 SY AITMU AITzZ3 09T 13 091 ssniyosuy Aeldsiq IDA 195 921 VAS 2zl Zaf sng zl DDA AOt TOOL Aor o oE lt oO O oL s 3SS34AV WOH4Z z 0 N31LYa aOT NOU43 dal 0aa aXH Dee 20 ZQOLNI EQCHLNI taala toO SadlY t20 ES EKEN LQd 290 094198 l alvas ZOO SMS t300
100. ult misc_error break Warten bis der Controller fertig ist lcd_check_busy controller Initialisiert das LCD mit keinem Text und keinem Cursor void Led nit Warten bis das LCD nach dem Einschalten bereit ist _delay_ms 20 42 155 161 165 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 187 188 190 191 192 193 194 195 197 198 200 201 202 203 Beide Controller auf 8 Bit Date zuerst auf ein zeilig dann auf lcd_write LCD_CTL_TOP LCD_IR 0x3 lcd_write LCD_CTL_BOTTOM LCD_IR lcd_write LCD_CTL_TOP LCD_IR 0x3 lcd_write LCD_CTL_BOTTOM LCD_IR Die Anzeige leeren lcd_write LCD_CTL_TOP LCD_IR 0x0 lcd_write LCD_CTL_BOTTOM LCD_IR Den Cursor an den Anfang setzen lcd_write LCD_CTL_TOP LCD_IR 0x0 lcd_write LCD_CTL_BOTTOM LCD_IR Beim Schreiben eines Zeichens d verschieben statt der ganzen An lcd_write LCD_CTL_TOP LCD_IR 0x0 lcd_write LCD_CTL_BOTTOM LCD_IR Den Cursor abschalten lcd_write LCD_CTL_TOP LCD_IR 0x0 lcd_write LCD_CTL_BOTTOM LCD_IR Setzt die Adresse und damit die Po die uebergebene Position um anschl koennen Die Position muss zwischen liegen und wird umgerechnet auf die oberen bzw unteren Controller EEE void lcd_set_position uint8_t pos uints_t ctl 0 if pos lt 27 Position ist in Der richtige Controller ist der Position nicht noe
101. ungen f r eine RS232 PC Schnittstelle sowie einer Leitung f r die Abfrage des EPROM EEPROM Umschalters musste der Mikrocontroller also ber mindestens 37 I O Leitungen verf gen F r eine Hexadezimaltastatur mit den ben tigten Sondertasten die in Form einer Matrix verkabelt wird sind zus tzlich 4 Gruppen und 8 Zeilenleitungen notwendig insgesamt w ren das also 49 Anschl sse Controller mit mehr als 32 I O Pins 4 Ports sind jedoch nur in SMD Bauform erh ltlich Um beim Aufbau auf Controller im wartungs freundlicheren DIL Geh use zur ckgreifen zu k nnen mussten M glichkeiten gesucht werden I O Leitungen einzusparen Die Verwendung eines zweiten Controllers der nur f r die Vorverarbeitung von Tasten dr cken zust ndig sein sollte machte es m glich die Tastendr cke ber ein Zweidraht bussystem zu bertragen und so 10 Leitungen einzusparen Um weitere Leitungen einzusparen wurden die Datenleitungen von EPROM und Display zu einem Bus zusammengelegt Dadurch kann nicht gleichzeitig auf EPROM und Display zugegriffen werden was aber durch den Zwischenspeicher in den Displaycontrol lern und die Art des Schreibprozesses der PROMS bei dem das zu schreibende Datum nicht permanent am Bus anstehen muss auch nicht n tig ist Somit werden nur noch 31 1 O Pins ben tigt Unter den Atmel Controllern die diese Anforderungen erf llen war der ATmega644 der einzige der im DIL Geh use erh ltlich war Er bietet 32 I O Leitungen un
102. usteine Cad TWEBIE Gtp k u fe use ae er a 6 2 5 Kommunikation mit dm PC 6 2 6 Benutzerschnittstelle oaa 6 3 Das Programm des Tastaturcontrollers im Detail 6 3 1 Tastenabfrage cer e 24 222 228 2 aee Kanals 6 3 2 Kommunikation mit dem Haupteontroller 2 2 2222 2 20 7 Bedienung 8 Fehlerbehebung und Reparaturen 8 1 Fehler im Betrieb u 2 52 Ener Dr el erh 8 2 Ersatzteilbesch ffung c Serge Be 9 Zusammenfassung und Ausblick 9 1 Aufbau ohne Geh use e 9 2 Erweiterungen 10 11 11 13 14 15 17 17 17 18 19 19 21 22 23 26 27 28 28 29 30 30 3l 9 3 PC Steuerung Anhang A Quelltexte A L H upteontr ller 3 pune eer EN Bee Ken lee TL haupteontroller h posso r 2a E ie nee e ch Kauptceontroller Ges nares Arie Zeta e Eer er ck aer A 13 misc h A 1 4 misc c A 15 Icd h A 1 6 led c AET eprom a ri sr we ae E E ee a Sec CT EBTOM C us ee DE De A 1 9 menu h A 1 10 menu c A 1 11 editor h A 1 12 editor c A 1 13 twi h A 1 14 twi c A 1 15 usart h A 1 16 usart c A 117pch A 1 18 pc c A 2 Tastaturcontroller oo s es so soo pa dodi sisp oi no epo A 2 1 tastencontroller h 2 2 on nn A 2 2 tastencontroller e soriana i r a ia a r o a a Aap a eie aal A 2 3 usih A 2 4 usi c B Bedienungsanleitung B 1 Informationen ber eingelegte PROMs abrufen e B 2 Daten eingeben und brennen B 3 PROMs auslesen und kopieren e B 4 PC Steuerung C Schaltpl ne D
103. werden konnte Sein Pro 27 oO no a e Co N e N N N N N o o o o o o o o o rr e N e O O DD N QA o ES OU NEBO N oa grammcode umfasst nur vier Dateien die im Anhang wiedergegeben sind A 2 S 82 6 3 1 Tastenabfrage Die einzelnen Tasten der Tastatur sind in Form einer Matrix aus Zeilen und Spalten leitungen verdrahtet vgl 5 2 S 11 Der Tastaturcontroller legt nacheinander eine Spannung an die Gruppenleitungen an und pr ft den Zustand der Spaltenleitungen Wird die Taste am Kreuzungspunkt der Zeilen und Spaltenleitung gedr ckt verbindet sie die beiden Leitungen es wird also ein High Pegel an der Spaltenleitung gemessen F r die Bedienung des Programmierger ts ist es nie notwendig mehrere Tasten gleich zeitig gedr ckt zu halten Da es nicht m glich ist im Falle zweier gleichzeitig gedr ckter Tasten zu entscheiden welche vom Benutzer eigentlich gemeint war wertet das Programm die Taste aus die an der Gruppenleitung mit der niedrigeren Nummer liegt Sollten beide Tasten an derselben Gruppenleitung liegen wertet die Funktion check_group analog die Taste aus die an der Zeilenleitung mit der niedrigsten Nummer liegt Listing 5 Pr fung auf Tastendr cke aus der tastencontroller c uint8_t check_keystroke void Nummer des Kabels der gedrueckten Taste uint3d_t wire Nummer der aktuellen Tastengruppe uint8_t group Alle Gruppen auf eine gedrueckte Taste ueberpruefen vorzeitig abbrechen
104. wurde und die f r einen abgesetzten PROM Sockel ausgelegt ist Version Beschreibung 0 1 Erster Entwurf nicht umgesetzt 0 2 Erster aufgebauter Protoyp nur f r EPROM Betrieb geeignet 0 3 EPROM EEPROM Umschaltung hinzugef gt 0 31 Zweiter aufgebauter Prototyp mit kleinen Korrekturen 0 32 Vereinfachte Masseverbindung f r leichtere Best ckung Tabelle 1 Entwurfsversionen der Hauptplatine Platinen wurden selbst ge tzt Insgesamt entstanden f nf Versionen der Hauptplatine Alle Platinenlayouts sind f r die manuelle Best ckung mit bedrahteten Bauelementen ausgelegt um die Montage m glichst einfach zu gestalten F r alle ICs sind DIL Geh use vorgesehen sie sollten beim Aufbau grunds tzlich mit Sockeln montiert werden um so einen Wechsel zu erleichtern Auf SMD Technik wurde komplett verzichtet Da es schwer ist im Handel Nullkraftanschl sse f r die an den Displays angebrachten Folienleiter in kleinen St ckzahlen zu bekommen wurden diese abgel tet und durch handels bliche Flachbandkabel mit 1 27 mm Raster ersetzt Die Anschl sse auf der Platine sind f r entsprechende Pfostenstecker ausgelegt Die ltere Version 0 2 war f r eine offene Montage vorgesehen so dass der PROM Sockel direkt auf der Platine integriert war Die Versionen 0 31 und 0 32 sind darauf ausgelegt in einem Geh use mit abgesetztem PROM Sockel montiert zu werden Um diese Art der Montage zu erleichtern sind alle Steckverbinder an den Rand de
105. y_us 10 switch eprom_type case EPROM_NEPROM EPROM Brennimpuls fuer 50ms anlegen PORTC 1 lt lt EPCE _delay_ms 50 PORTC amp 1 lt lt EPCE break case EPROM_EEPROM EEPROM 21 32 33 34 35 Brennimpuls geben und Stabilisierung abwarten PORTD amp 1 lt lt VPPWE _delay_us 10 PORTD 1 lt lt VPPWE break eprom_write wurde aufgerufen ohne dass vorher eprom_write_start aufgerufen wurde default misc_error break 6 2 4 TWI Bus F r die Kommunikation der beiden Controller untereinander wird das Two Wire Serial Interface TWI benutzt Die Ger te die ber diesen Bus kommunizieren sind in einer logischen Master Slave Topologie angeordnet der Bus ist multi Master f hig Die Daten bertragung zwischen ihnen kann in beliebiger Richtung erfolgen sowohl Master als auch Slaveger te k nnen jeweils als Sender und Empf nger arbeiten Das Masterger t ist dabei immer f r die Initialisierung der Kommunikation und die Erzeugung des Taktsignals zust ndig Der Bus ist zwei Leitungen breit SCL bermittelt das Taktsignal w hrend SDA f r die Daten zust ndig ist Beide liegen ber einen Pull Up Widerstand an V um definierte Pegelverh ltnisse auf dem Bus zu garantieren Die angeschlossenen Ger te erzeugen auf dem Bus Signale indem sie Leitungen von diesem Pegel auf Masse ziehen Dabei wird SDA in den entsprechenden Zustand logisch 1 oder 0 gebracht w

Download Pdf Manuals

image

Related Search

Dokument_1 dokument 1 dokument 1 word dokument 13 dokument 11 dokument 10 dokument 12 dokument 17 dokument 1 microsoft word dokument_1 document_1 dokument1 - word dokument 123 dokument 14 dokument_020925 dokument_2025 dokument_2024 dokument_2024_04_07_125018 eur 1 dokument dokument hfb 13 euro 1 dokument dokument 1880 himmler dokument o kretanju otpada obrazac 1 was ist ein eur 1 dokument

Related Contents

Taylor AM-1700-BL User's Manual  InLine 74010Z  Miele 7254030  Weil-McLain 550-141-827/1201 Boiler User Manual  Method of operating a portable terminal and portable terminal  補足説明書 5 仮想火災通報装置の使用法  取扱説明書  altimeter_beacon.  HP 72SR User's Manual  ordina web • www.giorgiobormac.com  

Copyright © All rights reserved.
Failed to retrieve file