;********************************* ;* Nur zum testen der RS232-Verbindung ;* An Portd,7 ist nur zur Kontrolle eine LED angeschlossen die von einer Blinkerroutine angesteuert wird ;* Mit jedem Blinktakt werden 2 verschiedene Werte (h55 & hAA) über RS232 ausgegeben. ;* Mit 2 Tastern an Port B,0+1 kann während des Betriebs der "UBRRL"-Wert verändert werden. ;********************************* .include "m16def.inc" ;AT-Mega 16 ;Quartz = 4 MHz extern .def temp =r16 ;Temporäres register .def temp1 =r17 ;Temporäres register .def flags =r18 ;diverse Flags .equ blk_s =0x02 .equ blk_h =0x0060 .equ blk_m =0x0061 .equ blk_l =0x0062 ;&&&&&----------------------------------------------------------------------------------------------- ;&&&&& Initialisierung ;&&&&&----------------------------------------------------------------------------------------------- .cseg ;Interrupttabelle rjmp start ;h00- Power-on Reset reti ;h01- External Interrupt Request 0 reti ;h02- External Interrupt Request 1 reti ;h03- Timer/Counter2 Compare Match reti ;h04- Timer/Counter2 Overflow reti ;h05- Timer/Counter1 Capture Event reti ;h06- Timer/Counter1 Compare Match A reti ;h07- Timer/Counter1 Compare Match B reti ;h08- Timer/Counter1 Overflow reti ;h09- Timer/Counter0 Overflow reti ;h0A- Serial Transfer Complete reti ;h0A- USART, Rx Complete reti ;h0A- USART Data Register Empty reti ;h0A- USART, Tx Complete reti ;h0A- ADC Conversion Complete reti ;h0A- EEPROM Ready reti ;h0A- Analog Comparator reti ;h0A- Two-wire Serial Interface reti ;h0A- External Interrupt Request 2 reti ;h0A- Timer/Counter0 Compare Match reti ;h0A- Store Program Memory Ready ;&&&&&----------------------------------------------------------------------------------------------- start: cli ldi temp,low(ramend) ; Stapel einrichten ldi temp1,high(ramend) out spl,temp out sph,temp1 ; Ports einstellen ser temp ;$ff in register out ddra,temp ;Port A auf Ausgang out ddrc,temp ;Port C auf Ausgang out ddrd,temp ;Port D auf Ausgang clr temp out ddrb,temp ;Port B auf Eingang ldi temp,3 out portb,temp ;für Bit 0+1 PullUps einschalten ; RS232 Baudrate einstellen ; ldi temp,25 ;Baudrate 9600Bd bei 4 MHz ldi temp,12 ;Baudrate 19200Bd bei 4 MHz ; ldi temp,51 ;Baudrate 9600Bd bei 8 MHz funzt nicht ; ldi temp,207 ;Baudrate 2400Bd bei 8 MHz auch nicht ldi temp1,0 out UBRRL,temp out UBRRH,temp1 out UCSRA, temp1 ldi temp,0b00001000 ;Enable receiver out UCSRB,temp ldi temp,0b10000110 ;Frame-Format: 8 Bit,1,N out UCSRC,temp clr temp ;Zähler für Blink-LED sts blk_h,temp sts blk_m,temp sts blk_l,temp clr flags ;Flags löschen ;&&&&&----------------------------------------------------------------------------------------------- main: rcall blinker rcall tasten rjmp main ;**************************************************************** ;* 2 Tasten auswerten * ;* * ;**************************************************************** ; tasten: sbis pinb,0 ;Taste an Port B0 gedrückt ? rjmp tas_jp1 ; ja ! sbis pinb,1 ;Nein. Taste an Port B1 gedrückt ? rjmp tas_jp2 ; ja ! andi flags,0xfc ; Nein. Flags für gedr. Tasten löschen ret ;keine Taste gedrückt. Zurück zur main-Schleife tas_jp1: sbrc flags,0 ;Flag für Taste 1 gesetzt ? ret ; Ja ! Taste ignorieren ori flags,1 ; Nein. Flag setzen ldi temp1,1 ;und Befehl 1 mal ausführen rcall serout in temp1,UBRRL inc temp1 out UBRRL,temp1 rcall serout ret ; Fertig. Zurück zur main-Schleife tas_jp2: sbrc flags,1 ;Flag für Taste 2 gesetzt ? ret ; Ja ! Taste ignorieren ori flags,2 ; Nein. Flag setzen ldi temp1,2 ;und Befehl 1 mal ausführen rcall serout in temp1,UBRRL dec temp1 out UBRRL,temp1 rcall serout ret ; Fertig. Zurück zur main-Schleife ;**************************************************************** ;* 1 Byte über RS232 ausgeben * ;* * ;**************************************************************** ; serout: sbis ucsra,udre ; Warten bis UDR für das nächste rjmp serout ; Byte bereit ist out udr,temp1 ret ; zurück zum Hauptprogramm ;**************************************************************** ;* Blinker an PD7 * ;* * ;**************************************************************** ; blinker: lds temp,blk_l ;Zählschleife inc temp sts blk_l,temp brne bli_jp1 lds temp,blk_m inc temp sts blk_m,temp brne bli_jp1 lds temp,blk_h inc temp sts blk_h,temp cpi temp,blk_s breq bli_jp2 ;------- bli_jp1:ret bli_jp2: clr temp ; High Byte der Zählschleife löschen sts blk_h,temp sbis portd,7 ; Ist Port D,7 = 1 ? rjmp blink1 ; Nein rjmp blink2 ; ja blink1: sbi portd,7 ; Port d,7 auf "0" ldi temp1,0x55 ; Nur zum Testen mal einen Wert per RS232 ausgeben rcall serout ret blink2: cbi portd,7 ; Port d,7 auf "1" ldi temp1,0xAA ; Nur zum Testen mal einen Wert per RS232 ausgeben rcall serout ret