;************************************************************************************************** ; ; Einlesen eines Analog-Wertes und Umrechnen in eine 8-Bit Zahl ; -------> Ausgeben als 8-Bit PWM ; -------> Ausgeben als 10-Bit PWM ; -------> Ausgabe über RS-232 ; ;************************************************************************************************** .device AT90S8535 .NOLIST .include "8535def.inc" .LIST ;************************************************************************************************** ; Variablen Deklaration ;************************************************************************************************** .def zeichen = r0 ;aktuellen Zeichen aus Tabelle .def counter = r1 ;Zeichenzähler .def hexl = r6 .def hexh = r7 .def int_serv = r16 .def temp = r19 ;Schmierregister 1 .def temp2 = r20 ;Schmierregister 2 .def ADCLow = r21 ;LSB ADC .def ADCHigh = r22 ;MSB ADC .def ADCLow2 = r23 ;LSB ADC2 .def ADCHigh2 = r24 ;MSB ADC2 .def buffer = r25 ;Sende-/ Empfangsbuffer für RS-232 .equ CLOCK = 8000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 .cseg ;************************************************************************************************** ; Stackpointer initialiseren ;************************************************************************************************** init: ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;************************************************************************************************** ; UART initialisieren ;************************************************************************************************** ldi temp, LOW(UBRRVAL) ;Baudrate einstellen out UBRR, temp ldi temp, 0x01 ;UART konfig out UCR, temp ;************************************************************************************************** ; Port C + D auf Ausgang schalten ;************************************************************************************************** ldi temp, 0x00 out DDRA, temp ldi temp, 0xFF out DDRC, temp out DDRD, temp ;************************************************************************************************** ; ADC initialisieren ;************************************************************************************************** ldi temp, 0x06 ;Prescaler auf 64 out ADCSR, temp ;---> 50-200kHz !WICHTIG! sbi ADCSR, ADEN ;sonst keine AD-Wandlung! ;************************************************************************************************** ; PWM initialisieren ;************************************************************************************************** ldi temp, 0xA3 ;PWM als 10-Bit konfigurieren out TCCR1A, temp ldi temp, 0 ;verstehe ich noch nicht out OCR1AH, temp ldi temp, 1 out OCR1AL, temp ldi temp, 0 out OCR1BH, temp ldi temp, 1 out OCR1BL, temp ldi temp, 0x01 ;Seite 37 vom Datenblatt out TCCR1b, temp ;sei ;Globale Interrupts zulassen main: sbis PINA, 0 rjmp main rcall adc lds ADCHigh, $68 lds ADCLow, $60 out OCR1AH, ADCHigh ;erst das ADCH-Byte schreiben. dann out OCR1AL, ADCLow ;das Low Byte. Sonst funktioniert ;es nicht lds ADCHigh2, $78 lds ADCLow2, $70 out OCR1BH, ADCHigh2 ;erst das ADCH-Byte schreiben. dann out OCR1BL, ADCLow2 ;das Low Byte. Sonst funktioniert ;es nicht sbi UCR, TXEN ;Senden freigeben rcall t2 ;Senderoutinen ldi buffer, 10 rcall serout ldi buffer, 13 rcall serout rcall t1 cbi UCR, TXEN ;Senden beendet rjmp main ;**************************************************************************************** ; ; 2 Kanal ADC Wandlung ; ;**************************************************************************************** ;----------------------- ;ADC aktivieren, In 1 ;----------------------- adc: ldi temp,0x00 out ADMUX,temp ;Kanal 0 vom ADC auswählen sbi ADCSR,ADSC ;Singlemode ein rcall fertig ;Warten bis Wandlung beendet in hexl,ADCL ;lowbyte auslesen in hexh,ADCH ;hibyte auslesen sts $60,hexl ;low byte speichern sts $68,hexh ;high byte speichern ;----------------------- ;ADC aktivieren, In 2 ;----------------------- ldi temp,0x01 out ADMUX,temp ;Kanal 1 vom ADC auswählen sbi ADCSR,ADSC ;Singlemode ein rcall fertig ;Warten bis Wandlung beendet in hexl,ADCL ;lowbyte auslesen in hexh,ADCH ;hibyte auslesen sts $70,hexl ;low byte speichern sts $78,hexh ;high byte speichern ret ;zurück ins Hauptprogramm fertig: sbis ADCSR,ADIF ;Warten bis Wandlung rjmp fertig ;beendet ret ;************************************************************************************************** ; ; Senden über Serielle Schnittstelle ; ;************************************************************************************************** t1: ldi temp2, 3 ;Zeichenzähler ldi ZL,LOW(Text1*2) ;LOW-Zeiger auf Tabellenanfang ldi ZH,HIGH(Text1*2) ;HIGH-Zeiger auf Tabellenanfang loop_msg1: lpm ;hole Zeichen aus Tabelle mov buffer, zeichen ;Zeichen übergeben rcall serout ;Senderoutine für RS-232 inc ZL ;LOW-Zeiger um 1 erhöhen brcc no_carry1 ;kein Übertrag von ZL inc ZH ;HIGH-Zeiger um 1 erhöhen, da Übertrag von ZL no_carry1: dec temp2 ;alle Zeichen gesendet? brne loop_msg1 ;NEIN! Sende nächstes Zeichen ret t2: ldi temp2, 5 ;Zeichenzähler ldi ZL,LOW(Text2*2) ;LOW-Zeiger auf Tabellenanfang ldi ZH,HIGH(Text2*2) ;HIGH-Zeiger auf Tabellenanfang loop_msg2: lpm ;hole Zeichen aus Tabelle mov buffer, zeichen ;Zeichen übergeben rcall serout ;Senderoutine für RS-232 adiw ZL,1 ;LOW-Zeiger um 1 erhöhen no_carry2: dec temp2 ;alle Zeichen gesendet? brne loop_msg2 ;NEIN! Sende nächstes Zeichen ret serout: sbis USR, UDRE ;Warten bis UDR für das nächte Byte bereit rjmp serout out UDR, buffer ;Übergeben an UART I/O-Register ret ;************************************************************************************************** ; ; Texttabellen ; ;************************************************************************************************** Text1: .DB 27,68,76 Text2: .DB "12345"