;+------------------------------------------------------------------------------------------ ;| Title : Counter für OK301 ;+------------------------------------------------------------------------------------------ ;| Funktion : Zählimpuls wird überwacht, Counter plus eins ;| Schaltung : ... ;+------------------------------------------------------------------------------------------ ;| Prozessor : ATmega8 ;| Takt : 3,6864 MHz ;| Sprache : Assembler ;| Datum : 22.10.2008 ;| Version : 0.2 ;| Autor : Thomas Herrlich ;+------------------------------------------------------------------------------------------ .include "m8def.inc" .def temp = r16 ; ;------------------------------------------------------------------------------------------- rjmp main ;1 POWER ON RESET reti ;2 Int0-Interrupt reti ;3 Int1-Interrupt reti ;4 TC2 Compare Match reti ;5 TC2 Overflow reti ;6 TC1 Capture reti ;7 TC1 Compare Match A reti ;8 TC1 Compare Match B reti ;9 TC1 Overflow rjmp Takt ;10 TC0 Overflow reti ;11 SPI, STC Serial Transfer Complete reti ;12 UART Rx Complete reti ;13 UART Data Register Empty reti ;14 UART Tx Complete reti ;15 ADC Conversion Complete reti ;16 EEPROM Ready reti ;17 Analog Comparator reti ;18 TWI (I²C) Serial Interface reti ;19 Store Program Memory Ready ; ;******************************************************************************************* ;************************* Konfiguration ************************* ;******************************************************************************************* ; main: ldi temp,LOW(RAMEND) out SPL,temp ldi temp,HIGH(RAMEND) out SPH,temp ;Stack Initialisierung ; clr temp ldi ZH,HIGH(0x60) ldi ZL,LOW(0x60) ;clrSRAM: st Z+,temp ; cpi Zh,HIGH(RAMEND) ; brne clrSRAM ;SRAM löschen ; ldi temp,0b11111111 out DDRD,temp ;Port D Ausgang für Multiplex cbi DDRB,0 ;B0 Eingang Zählimpuls sbi PORTB,0 ;Pull UP an sbi DDRC,0 ;Ausgang Digit4 sbi DDRC,1 ;Ausgang Digit3 sbi DDRC,2 ;Ausgang Digit2 sbi DDRC,3 ;Ausgang Digit1 out PORTC,temp ;alle Digits aus ; ;Init Timer 0 ; ldi temp,0b00000101 ;Vorteiler 1024 out TCCR0,temp ldi temp,0b00000001 ;Timer 0 überlauf out TIMSK,temp ; ;Init Watchdog ; ;rcall WD_init ; ; ;Register vereinbaren ; ldi r17,0b00000000 ;Grundwert Digit 4 1er ldi r18,0b00000000 ;Grundwert Digit 3 10er ldi r19,0b00000000 ;Grundwert Digit 2 100er ldi r20,0b00000000 ;Grundwert Digit 1 1000er ldi r25,0b11111110 ;Laufbit Digits für npn Transistoren ldi temp,0b00000000 mov r0,temp ldi ZH,HIGH(0x60) ldi ZL,LOW(0x60) sei ;Interrupts erlauben (Start Timerinterrupt) ; ; ;******************************************************************************************* ;************************ Hauptschleife ************************** ;******************************************************************************************* ; mainloop: nop wdr rcall taster ldi ZL,LOW (codes*2) ldi ZH,HIGH (codes*2) ;;;;;add ZL, temp ;bei Aktivierung flimmern ;;;;;adc ZH, r0 ;bei Aktivierung flimmern lpm ;laden von Wert auf Z-Adresse in r0 ;;;;;;;;;;;;;;;;;;;;;;;mov r17,r0 mov r17,temp ;Übergabe der Ausgabe an r17 (Wert für Einerstelle) ; rjmp mainloop ; ;******************************************************************************************* ;************************ Unterprogramme ************************** ;******************************************************************************************* ; ; ;******************************************************************************************* ; UP Wait_ms, Warteroutine im Millisekundenbereich ; wait: push r21 ;r16 retten push r22 ;r17 retten push r23 ;r18 retten ldi r21,0x02 ;Laufvariable ca x ms bei 3,6MHz loop1: ldi r22,0xFF ;Laufvariable loop1 loop2: ldi r23,13 ;Laufvariable loop3 loop3: dec r23 ;Zähler 3 -1, hier Kalibrierung auf MCU Takt brne loop3 ;Solange nicht NULL dec r22 ;Zähler 2 -1 brne loop2 ;Solange nicht NULL dec r21 ;Zähler1 -1 brne loop1 ;Solange nicht NULL pop r23 ;r18 wiederherstellen pop r22 ;r17 wiederherstellen pop r21 ;r16 wiederherstellen ret ;Rücksprung ; ;******************************************************************************************* ;UP Tasterabfrage entprellt und verriegelt ; taster: nop push r21 push r22 in r21,PINB ;Schleife kein signal rcall wait in r22,PINB and r22,r21 sbrc r22,0 rjmp ende ;weiter wenn Signal mind. 10ms auf hi in r21,PINB rcall wait in r22,PINB and r22,r21 sbrc r22,0 inc temp ;weiter wenn Signal mind. 10ms auf low cpi temp,10 ;Zähler auf 0-9 begrenzen brne ende ldi temp,0 ende: pop r22 pop r21 ret ; ;******************************************************************************************* ;Watchdog einschalten ; WD_init: push temp wdr ldi temp,0b00011000 out WDTCR,temp ldi temp,0b00001110 out WDTCR,temp pop temp ret ; ;******************************************************************************************* ; ; ;******************************************************************************************* ;UP Takt --> Multiplex mit Ausgabe ; Takt: cli ;Interrupts unterbinden push temp push r21 push r22 push r23 push r24 ; ; ;Digits ausschalten ; ldi temp,0b00000000 out PORTC,temp ; ; ;Digit anwählen ; ;com r25 ;Laufbit spiegeln rol r25 ;Aktives Digit umschalten ;com r25 ;Laufbit spiegeln ; ;Digitwert laden ; sbrs r25,5 ldi r25,0b11111110 ;Anzeige auf 4 Digits begrenzen ; sbrs r25,0 mov temp,r17 ;Bitmuster für Digit 4 sbrs r25,1 ldi temp,0b00001100 ;Bitmuster für Digit 3 sbrs r25,2 ldi temp,0b00110000 ;Bitmuster für Digit 2 sbrs r25,3 ldi temp,0b11000000 ;Bitmuster für Digit 1 out PORTD,temp ; ; ; ldi r21,250 ;Startwert für Zähler out TCNT0,r21 ;Startwert für Zähler schreiben ;out PORTC,r19 ;Digit aktivieren ;out PORTD,temp ;Digit anschalten ; out PORTC,r25 pop r24 pop r23 pop r22 pop r21 pop temp sei ;Interrupts freigeben reti ;return ; ;******************************************************************************************* ;************************ Daten in SRAM laden ************************** ;******************************************************************************************* ; ; ; codes: ; ; .db 0b01000000, 0b01111001 ;0 1 .db 0b00100100, 0b00110000 ;2 3 .db 0b00011001, 0b00010010 ;4 5 .db 0b00000010, 0b01111000 ;6 7 .db 0b00000000, 0b00010000 ;8 9