;| Title : Grundgerüst für SiSy-AVR-Board | ;+--------------------------------------------------------------------------+ ;| Funktion : wandelt analogwert in 8Bit Zahl und variiert mit ergebnis eine ; frequenz. | ;| Schaltung : PC.0->Poti,PB.0->Ausgang,PB.1->an LED zur optischen Kontrolle | ;+--------------------------------------------------------------------------+ ;| Prozessor : ATmega8 3,6864 MHz | ;| Sprache : Assembler | ;| Datum : ... | ;| Version : ... | ;| Autor : ... | ;+--------------------------------------------------------------------------+ .include "AVR.H" ;--------------------------------------------------------------------------- ;Register r16 - r25 verwenden!!! ;Register können noch minimiert werden, habe nur zur übersicht erstmal so viele genommen ;ADCSRA - r25 ;Startwert reint - r24 ;abwechseld HI LO frequenz - r23 ;ADCL - r21 ;ADCH - r22 ;Wert zur ausgabe - r17 ;für initialisiertungen - r16 ; Reset and Interrupt vector Beschreibung rjmp main ;POWER ON RESET reti ;Int0-Interrupt reti ;Int1-Interrupt reti ;TC2 Compare Match reti ;TC2 Overflow reti ;TC1 Capture reti ;TC1 Compare Match A reti ;TC1 Compare Match B reti ;TC1 Overflow rjmp onTC0 ;TC0 Overflow reti ;SPI, STC Serial Transfer Complete reti ;UART Rx Complete reti ;UART Data Register Empty reti ;UART Tx complete rjmp onADC ;ADC Conversion Complete reti ;EEPROM Ready reti ;Analog Comparator reti ;TWI (I²C) Serial Interface reti ;Strore Program Memory Redy ;--------------------------------------------------------------------------- ; Start, Power ON, Reset main: ldi r16,lo8(RAMEND) out SPL,r16 ldi r16,hi8(RAMEND) out SPH,r16 ; Hier Init-Code eintragen. sei ;Globale Interrupts erlauben ;UART einstellen mit Baudrate 9600 sbi UCSRB,3 ;UART TX enable ldi r16,23 ;Baudrate generieren out UBRRL,r16 ;Baudrate 9600 ;--------------------------------------------------------------------------- ;ADC Channel Einstellen und eingangsport auf PC.0 legen ldi r16,0 ;ADC Channel 0 out ADMUX,r16 ;PC.0 ADC Channel 0 ldi r16,0b11011010 ;ADC ein und 115Khz Taktrate out ADCSRA,r16 ;Single Staep und Interrupt, erste Konvertierung mov r25,r16 ;--------------------------------------------------------------------------- ;8Bit Timer einstellung für Frequenzausgabe ldi r16,0b00000011 ;Vorteiler Timer0 64 245 für 15000Hz ; ldi r16,0b00000100 out TCCR0,r16 ;einstellungen aus r16 in Timer 0 leden ldi r16,0b00000001 ;Timer Overflow out TIMSK,r16 ;Interrupt Timer 0 sbi DDRB,0 ;Port B.0 out und LOW sbi DDRB,1 ;Port B.1 out und LOW ldi r24,0x20 ;Startwert für Reinitialisierung ;--------------------------------------------------------------------------- ;16Bit Timer einstellung für Frequenzausgabe muss über TC1 gehen!! ;--------------------------------------------------------------------------- mainloop: wdr mov r17,r23 ;aktuellen Frequenzwert in r17 Kopieren der später ausgegeben wird rcall put ;sendeProg aufrufen rjmp mainloop ;wieder zur mainloop ;--------------------------------------------------------------------------- ;Unterprogramme onTC0: com r23 ;Frequenz durch HI/LO Wechsel out PORTB,r23 ;Frequenz Ausgabe out TCNT0,r24 ;Reinitialisierung Timer0 reti ;--------------------------------------------------------------------------- onADC: cli ;Interrupts Sperren in r21,ADCL ;LowTeil auslesen in r22,ADCH ;HighTeil auslesen ;10Bit zu 8Bit auflösen, alle Bit´s 2 nach rechts asr r22 ;Schiebe Bit 0 des High Teils ins C-Flag Bit1->Bit0 ror r21 ;Schiebe alle Bits nach rechts, C-Fag in Bit 7 asr r22 ;Schiebe nächtes Bit des High Teils in C-Flag ror r21 ;Schiebe alle Bits nach rechts, C-Flag in Bit7 mov r24,r21 ;Reintwert für Timer sbi ADCSRA,6 ;starte nächste Konvertierung sei ;interrrupts wieder freigeben reti ;--------------------------------------------------------------------------- put: ;Unterprogramm zur ausgabe sbis UCSRA,5 ; USR=UCSRA=0x0B UDRE=Bit5 rjmp put ; warten, bis UDR bereit out UDR,r17 ;inhalt von r17 ausgeben ret ;---------------------------------------------------------------------------