/* * minilcd.asm * * Author: zigein * * CPU-CLK : 8Mhz * * Disp.Sel: ; Mit diesem schaltet mich Zentrale ein / Nach Timer1-ablauf schaltet sich die Selbsthaltung PD7 wieder aus * Chipsel: Portd_4 ; Button gedrückt (Interrupt) -> Chipsel-Leittung hochziehen -> 500ms warten -> Chipsel-Leittung wieder tiefziehen -> * ; -> Usart Button-Byte senden -> reti * ** Usart RX = Port-D-0 / TX = Port-D-1 * * Baudrate: 19200 * StartBit: 1 * DataBit: 8 * StopBit: 1 * Parity: none * * ** Usart Eingang: * * ButtonByte Sym_1 Sym_2 N_D2 N_D1 A_D * Byte_0 = usart0 Byte_1 = usart1 Byte_2 = usart2 Byte_3 = usart3 Byte_4 = usart4 Byte_5 = usart5 * |_ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _| * R T R B B S S S C S S S S S S * Muss 0xff sein X X E A A 1 5 3 O 1 9 8 2 1 0 Rechtes Digit Mittleres Digit Linkes Digit * bei Empfang P T T 1 + D 0 0 - 9 0 - 9 0 - 9 * siehe: "usart_rx:" I O S E A + L + C + H A + L + C + H A - Z * N U 4 * T * ** USART-eingaben werden in "usart1"-"usart5" gespeichert, * ausgewertet und das Ergebnis in "com1seg1" bis "com4seg2" für die Ausgabe LCD-gerecht verpackt ** Im Ersten Byte (ButttonByte) muss eine 0xFF stehen. Erst wenn dieses Byte empfangen wurde, * werden die restlichen 5 Byte auch eingelesen und ausgewertet. ** Wenn weniger als 6 Bytes empfangen werden oder die Zeit zwischen 2 Bytes zu lange ist, * werden alle Eingaben ignoriert und für neue UsartEingabe vorbereiter. ** Während USART-Ein und -Ausgabe und "Verpackung" wird das Display nicht angesteuert (flackert eventuell). * Eine LCD-Ausgabe während Usart eingelesen wird, ist sinnlos, da die neuen Daten für Display noch nicht fertig ausgewertet wurden. * Tatsächliche Usart-Eingabe- und Auswerte-Zeit = ungefär 30ms * * ** Display Ansteuerung: * Im 1. Takt wird Com1 als Ausgang geschalten und auf 1 gezogen. * Alle Segmente die nicht angezeigt werden gehen mit auf 1. Alle die angezeigt werden auf 0 gezogen. * Im 2. Takt werden einfach alle Ausgänge Invertiert. * Im 3. Takt ist Com2 an der Reihe: * Aber: Zuerst Com1 wieder als als Eingang geschalten. Erst jetzt wie in Takt 1 mit Com2 weitermachen: * Com2 zuerst als Ausgang geschalten und auf 1 gezogen usw..... * * com?seg1 (0-7) ist direkt die Ausgabe an PortB * com?seg2 (0-5) ist direkt die Ausgabe an PortC * Bit6 ist für PortD5 (letztes Segment) * ** Tasten schalten die Versorgungsspannung ein und lösen Interrupt aus. * Linke Taste = INT0 = Pin_D_2 * Rechte Taste = INT1 = Pin_D_3 * Tatsen mit Timer2 entprellt. (Kein flackern des Displays mehr) * * Tastenbyte: Wird für die Tastenerkennung und mehrere Timer2-Durchläufe für längere laufzeit benutzt. * Bit7: zeigt gedrückte Taste (Linke Taste = INT0 = Pin_D_2) bei Interrupt an. Steigende Flanke * Bit6: zeigt gedrückte Taste (Rechte Taste = INT1 = Pin_D_3) bei Interrupt an. Steigende Flanke * Bit5: zeigt losgelassene Taste (Linke Taste = INT0 = Pin_D_2) bei Interrupt an. Fallende Flanke * Bit4: zeigt losgelassene Taste (Rechte Taste = INT1 = Pin_D_3) bei Interrupt an. Fallende Flanke * Bit3: wird in INT?-Routine gesetzt und in Timer2 gelöscht bevor 2ter TimerDurchlauf (doppelte entprellzeit) startet. * * BIT0: wird gesetzt für den ersten Timerdurchlauf bei Tastenentprellung * ** * */ .include "m48Adef.inc" ; .def com1seg1 = r1 ;Hier werden nach usart-eingang die SegmentBits .def com1seg2 = r2 ;LCD-gercht aktualisiert und ausgegeben .def com2seg1 = r3 ;Bei Auswertung werden aktive Segmentbits mit 0 angegeben .def com2seg2 = r4 ;Aktive Combits sind 1 .def com3seg1 = r5 ;Zb.:com1seg1 ohne Ausgabe 0b11110001 -> Segmente gehen mit COMPort mit .def com3seg2 = r6 ; :com1seg2 alle Segmente 0b00000001 .def com4seg1 = r7 ; 7-4Segmente | 0-3ComPorts .def com4seg2 = r8 ; ; .def ausschreg1 = r9 ; .def ausschreg2 = r10 ; ; .def comsel = r20 ;Zählt bei Timer0-OVF ComPorts von 1-4 weiter ; .def usart0 = r21 ;BYTE1: USART Empfangsspeicher .def usart1 = r22 ;BYTE2: USART Empfangsspeicher .def usart2 = r23 ;BYTE3: USART Empfangsspeicher .def usart3 = r24 ;BYTE4: USART Empfangsspeicher .def usart4 = r25 ;BYTE5: USART Empfangsspeicher .def usart5 = r26 ;BYTE5: USART Empfangsspeicher .def usartsel = r27 ;Auswahlregister für Bytereihenfolge .def tastenbyte = r28 ;SpeicherByte für Tastenauswerung (siehe oben) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKROS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .macro resettimer0;;;;;;;;;;;;2ms Strobe ldi r16, 232 ; Timer-Counter setzen 255-255=0=>20ms / out tcnt0, r16 ; / 255-190=65=>15ms / 255-95=160=>8ms / 255-23=232=>2ms ldi r16, (1< 350ms Strobe sts tcnt2, r16 ; / Bei tcnt2-Wert = 50 => 250ms Strobe ldi r16, (1< 350ms Strobe sts tcnt2, r16 ; ldi r16, (1<