; ************************************************************** ; * Projektname: IEEE488-Interface für Hitachi Oszilloskop * ; * Autor: Oliver Dahlmann * ; * Datum: 03/2003 * ; * Beschreibung: mit Atmel AT90S4433 * ; ************************************************************** .NOLIST .INCLUDE "4433def.inc" ; Import der AT90S4433 Definitions-Datei .LIST ; I/O Port ; ** verwendete Bits .EQU RTS_CTS = 2 ; Handshake RS-232, noch nicht benutzt .EQU RTS_CTS_P = PORTD .EQU IEEE_SRQ = 3 ; Service Request .EQU IEEE_SRQ_P = PORTD .EQU IEEE_SRQ_D = DDRD .EQU IEEE_ATN = 4 ; Attention .EQU IEEE_ATN_P = PORTD .EQU IEEE_ATN_D = DDRD .EQU IEEE_EOI = 5 ; End or Identify .EQU IEEE_EOI_P = PORTD .EQU IEEE_EOI_D = DDRD .EQU IEEE_REN = 6 ; Remote Enable .EQU IEEE_REN_P = PORTD .EQU IEEE_REN_D = DDRD .EQU IEEE_DAV = 4 ; Data Valid .EQU IEEE_DAV_P = PORTB .EQU IEEE_DAV_D = DDRB .EQU IEEE_NRFD = 5 ; Not Ready For Data .EQU IEEE_NRFD_P = PORTB .EQU IEEE_NRFD_D = DDRB .EQU IEEE_NDAC = 4 ; Not Data Accepted .EQU IEEE_NDAC_P = PORTC .EQU IEEE_NDAC_D = DDRC .EQU IEEE_IFC = 5 ; Interface Clear .EQU IEEE_IFC_P = PORTC .EQU IEEE_IFC_D = DDRC .MACRO OutLow ; Leitung auf Low ziehen cbi @0_P,@0 sbi @0_D,@0 .ENDMACRO .MACRO OutHigh ; Leitung auf High ziehen (bei IEEE-488 nicht nötig) sbi @0_P,@0 sbi @0_D,@0 .ENDMACRO .MACRO OutTri ; Leitung in TriState-Zustand schalten cbi @0_D,@0 cbi @0_P,@0 .ENDMACRO .ORG 0000 rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM1_CAPT ; Timer1 Capture Handler rjmp TIM1_COMP ; Timer1 Compare Handler rjmp TIM1_OVF ; Timer1 Overflow Handler rjmp TIM0_OVF ; Timer0 Overflow Handler rjmp SPI_STC ; SPI Transfer Complete Handler rjmp UART_RXC ; UART RX Complete Handler rjmp UART_DRE ; UART Empty Handler rjmp UART_TXC ; UART TX Complete Handler rjmp ADCC ; AD Conversion Complete Handler rjmp EE_RDY ; EEPROM Ready Handler rjmp ANA_COMP ; Analog Comparator Handler RESET: ldi r16, LOW(RAMEND) out SP, r16 ; Stackpointer initialisieren ldi r16,7 rcall UART8_INIT ; 57.600 Baud bei 7,38 MHz ldi r16,0b00000000 ; Alles auf TriState bzw. Eingang out DDRD,r16 ldi r16,0b00000000 out DDRC,r16 ldi r16,0b00000000 out DDRB,r16 MAIN: ; Beginn des Hauptprogramms ldi zl,LOW(TestString<<1) ldi zh,HIGH(TestString<<1) rcall UART8_SendPGMString ; Z: Zeiger auf String im ProgramMemory AufDatenWarten: OutLow IEEE_NDAC ; es wurden keine Daten-Bytes übernommen OutTri IEEE_NRFD ; bereit für das nächste Byte vom Talker WarteBisDAVLow: in r17,PINB ; DAV ist Bit 4 andi r17,0b00010000 ; alles ausser DAV ausmaskieren cpi r17,0 ; wenn Null, dann DataValid, sonst warten brne WarteBisDAVLow OutLow IEEE_NRFD ; nicht bereit für das nächste Zeichen in r16,PINB ; Zeichen übernehmen in r17,PINC swap r16 andi r16,$F0 andi r17,$0F or r17,r16 ; in r17 steht das empfangene Byte DIO8..DIO1 com r17 ; weil negative Logik -> Byte invertieren OutTri IEEE_NDAC ; Zeichen wurde übernommen WarteBisDAVHigh: in r16,PINB ; DAV ist Bit 4 andi r16,0b00010000 ; alles ausser DAV ausmaskieren cpi r16,0 ; wenn Null, dann DataValid, sonst warten breq WarteBisDAVHigh OutLow IEEE_NDAC ; Zeichen nicht übernommen rcall UART8_SendByte ; Byte in r17 seriell verschicken rjmp AufDatenWarten ; Nächstes Zeichen EXT_INT0: ; IRQ0 Handler reti EXT_INT1: ; IRQ1 Handler reti TIM1_CAPT: ; Timer1 Capture Handler reti TIM1_COMP: ; Timer1 Compare Handler reti TIM1_OVF: ; Timer1 Overflow Handler reti TIM0_OVF: ; Timer0 Overflow Handler reti SPI_STC: ; SPI Transfer Complete Handler reti UART_RXC: ; UART RX Complete Handler rcall UART8_RXC_Handler reti UART_DRE: ; UART Empty Handler reti UART_TXC: ; UART TX Complete Handler rcall UART8_TXC_Handler reti ADCC: ; AD Conversion Complete Handler reti EE_RDY: ; EEPROM Ready Handler reti ANA_COMP: ; Analog Comparator Handler reti .include "..\libraries\delay.asm" .include "..\libraries4433\UART8_lib.asm" .CSEG TestString: .db 12,"IEEE-488 Interface, (c) 2003 by Oliver Dahlmann",13,10,0