;Programm passend zu der Hardware:DDS7 ;DDS- arbeitet nur mit MSB des 24-Bit Phasenakku, ohne AD-Wandler mit lookup. dadurch nur 6 Takte loop-Dauer ;PD7 liefert Rechteckspannung als Oszillatorsignal ;zwei Ausgänge des Oszillators, zur Entkopplung, später mit TP wegen Oberwellen ;PD3/INT1 Taste zur Feinverstellung der Frequenz ;r30,r29,r28 Phasenakku, r30 ist MSB ;r27,r26,r25 Frequenzwort, r27 ist MSB ;r18,r17, Übergaberegister für EEPROM-Routinen ;r16 allgemeines ldi-register ;r1,r2,r3 Zählregister für Tasten-Wartezeiten ;r4 "Flag" up/down ;PD7 ist Ausgang für Osz.-Signal ;PD3,INT1 ist Eingang für Taste .equ portc = 0x15 ;Festlegung der In/OUT-Adressen .equ portd = 0x12 ;ersetzt include-file für den .equ ddrd = 0x11 ;Prozessor-Typ .equ pind = 0x10 .equ sph = 0x3e .equ eecr = 0x1c .equ eere = 0 .equ eewe = 1 .equ eemwe = 2 .equ eearh = 0x1f .equ eearl = 0x1e .equ eedr = 0x1d .equ gifr = 0x3a .org 0x00 rjmp init ;Sprungvektoen für Reset und Int nop rjmp int1 init: sbi ddrd,7 ;nur portd,7 als Ausgang sbi portd,2 ;pullup für Taste ldi r16,0x01;stackpointer setzen out sph,r16 ;auf 0x100 ;extint vorbereiten ldi r16,0x08 ;Wert für mcucr bestimmen out 0x35,r16 ;an reg übergeben ldi r16,0x80 ;Wert für gicr out 0x3b,r16 ;an reg übergeben ;int's generell erst später freigeben ;Im EEPROM stehendes Frequenzwort in r25 bis r27 lesen ldi r17,00 ;adresse 8 bit rcall eeread mov r25,r18 ;erstes Byte Frequenzwort ldi r17,01 rcall eeread mov r26,r18 ldi r17,02 rcall eeread mov r27,r18 clr r28 ;phasenakku nullen clr r29 clr r30 sei ;ints generell freigeben loop: add r28,r25 ;Phasenakku hochaddieren adc r29,r26 ;mit Frequenzwort adc r30,r27 out portd,r30;msb auf Ausgang PD7 geben rjmp loop ;diese Grundschleife dauert 6 Takte ;folgendes bei int1 dient zur Funktion der Taste int1: ldi r16,0xc0 ;Wartezähler auf einige sec stellen mov r3,r16 ;mit langem Tastendruck wird von clr r2 ;inc auf dec umgestellt, oder umgekehrt clr r1 warten: inc r1 brne weiter inc r2 brne weiter inc r3 brne weiter rjmp lange ;wenn Taste lange gedrückt war, zur Umstellung inc-dec weiter: ;das ist Tastenabfrage sbis pind,3 ;wenn Taste wieder losgelassen,weiter rjmp warten ;sonst zurück in r1,r2,r3-Warteschleife clr r1 ;zusätzliche Wartezeit, wegen Tastenprellens clr r2 prell: inc r1 brne prell inc r2 brne prell entscheid: ;je nach "Richtumngsflag" r4, inc oder dec clr r16 or r16,r4 brne decfword rjmp incfword decfword: ldi r16,1 sub r25,r16 clr r16 sbc r26,r16 sbc r27,r16 rjmp verarbeiten incfword: ldi r16,1 add r25,r16 clr r16 adc r26,r16 adc r27,r16 rjmp verarbeiten verarbeiten: ;neuen Wert des fword in eeprom speichern ldi r17,0 mov r18,r25 rcall eewrite ldi r17,1 mov r18,r26 rcall eewrite ldi r17,2 mov r18,r27 rcall eewrite reti lange: ;Taste war lange gedrückt, Wechsel von inc auf dec oder umgekehrt ser r16 ;r16 auf ff and r16,r4 ;r4 auf Null abfragen breq setzen ;wenn Null, r4 auf ff stellen clr r4 ;wenn nicht Null, r4 auf Null stellen rjmp lange1 setzen: ser r16 mov r4,r16 ;r4 setzen lange1: reti eewrite: ;Übergaberegister: r18 : 8 bit Daten, r17, 8 bit Adresse. hibyte Adresse bleibt Null sbic eecr,eewe ;Warten, wenn eventuelles Schreiben läuft rjmp eewrite out eearl,r17 ;low byte Adresse (0,1,2) ausgeben out eedr,r18 ;Daten ausgeben in eeregister sbi eecr,eemwe ;startbit setzen sbi eecr,eewe ;starten ret eeread: ;Übergaberegister: r18: 8bit Daten r17: 8 bit Adresse sbic eecr,eewe ;Warten, wenn eventuelles Schreiben läuft rjmp eeread out eearl,r17 ;Adresse, lobyte ausgeben sbi eecr,eere ;Lesen starten in r18,eedr ;Ergebnis in r18 ret .eseg ;mit .eseg entsteht zusätzlich ein .eep-file. Dieses muss beim Programmieren extra ;ins EEPROM übertragen werden, da beim seriellen ISP-Verfahren ein chip erase startet ;und dieses auch das Daten-EEPROM löscht. ;.db 0x80, 0x35, 0x00 ;(frequenzwort für 1 kHz) Formel: N = faus * 6 * (2exp24) / fquarz .db 0x8e, 0xac, 0x04 ;(frequenzwort für 44732 Hz) bei fquarz = 14,7 MHz