'***************************************************************************************************************** ' BASCOM AVR Compiler 1.11.8.1 ' ATMega8 Applikation ' ' Manfred Look ' webmaster@malo-web.de ' http://www.malo-web.de ' ' Dieses Programm ist Freeware in Uebereinstimmung mit der General Public License (GPL). ' ' Steuerung eines Eigenbau DDS Generators mit AD9835 ' 01/2006 ' V1.00 ' ' - LCD Ansteuerung ' - Inkrementalgeber Auswertung ' - Taster Auswertung ' - Schnittstelle zum DDS Generator ' - Berechnung der 4Bytes fuer die Frequenzeinstellung ' ' Fuses: CKOPT EXT-CRYSTAL-HIGH-FREQUENZ-16K-CK+4ms ' '***************************************************************************************************************** ' '--compiler directives-------------------------------------------------------------------------------------------- ' $regfile = "m8def.dat" 'Chip auswaehlen: ATMega8 $crystal = 7372800 'Taktfrequenz (Hz) festlegen $hwstack = 32 'Hardware Stack $swstack = 8 'Software Stack $framesize = 20 'Framsize ' '--variable------------------------------------------------------------------------------------------------------- ' Dim Value As Long At &H60 'aus Frequ errechneter Wert fuer AD9835 ' Dim Frequ As Double 'Berechneter Wert fuer Frequenz Dim Help As Double 'Hilfsvariable zum Runden von Frequ ' Dim F1 As Long 'im Display eingestellte Frequenz Dim F2 As Long 'Hilfsvariable fuer Berechnung F1 ' Dim Send As Word '16Bit Variable die zum DDS gesendet wird ' Dim Fmsbh As Byte At &H63 Overlay 'Frequenz bit 24-31 Dim Fmsbl As Byte At &H62 Overlay 'Frequenz bit 16-23 Dim Flsbh As Byte At &H61 Overlay 'Frequenz bit 8-15 Dim Flsbl As Byte At &H60 Overlay 'Frequenz bit 0-7 ' Dim Enc_v As Byte 'mit Encoder eingestellter Wert Dim Lcd_r As Byte 'Cursor Position Reihe Dim Lcd_c As Byte 'Cursor Position Spalte ' Dim Number(8) As Byte 'Array, Speicher eingestellter Wert im Display Dim Z As Byte 'Hilfsvariable fuer Array ' '--constant------------------------------------------------------------------------------------------------------- ' Const Mclk = 50000000 'Taktfrequenz AD9835(Hz) Const Parameter = 2 ^ 32 'fuer Frequ Berechnung Const On = 1 'fuer bessere Lesbarkeit des Quelltextes Const Off = 0 'fuer bessere Lesbarkeit des Quelltextes Const St = "DDS GENERATOR V1.00 M.L. 01/2006 1Hz-20MHz" 'Startmeldung, 4x20LCD ' '--alias---------------------------------------------------------------------------------------------------------- ' Enc_b Alias Pind.3 'Encoder B Eingang ' Ta_right Alias Pind.5 'Taste right Eingang Ta_left Alias Pind.7 'Taste left Eingang Ta_enter Alias Pind.6 'Taste enter Eingang ' Fsync Alias Portb.2 'AD9835 FSYNC Ausgang Sdata Alias Portb.4 'AD9835 SDATA Ausgang Sclk Alias Portb.5 'AD9835 SCLK Ausgang ' Lcd_light Alias Portd.4 'LCD Beleuchtung Ausgang ' '--init program--------------------------------------------------------------------------------------------------- ' 'Initialisierung Ports Ddrb = &B00110111 'Port B, 1=Ausgang Portd = &B11101100 'Port D, 1=Eingang mit Pullup ' ' 'Initialisierung AD9835 mit 1000Hz als Startwert Number(5) = 1 'LCD Anzeige Startwert ' Send = &B1111100000000000 'sleep=1, reset=1, clear=1 Gosub _ser_output Send = &B0011011100000000 'h-msb 8Bits in freq1 Gosub _ser_output Send = &B0010011000000001 'l-msb 8Bits in freq1 Gosub _ser_output Send = &B0011010101001111 'h-lsb 8Bits in freq1 Gosub _ser_output Send = &B0010010010001011 'l-lsb 8Bits in freq1 Gosub _ser_output Send = &B1011000000000000 'sync=1, selsrc=1 Gosub _ser_output Send = &B0101100000000000 'init freq1 Gosub _ser_output Send = &B1100000000000000 'sleep=0, reset=0, clear=0 Gosub _ser_output ' 'Initialisierung LCD EADIP204 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.0 , Rs = Portb.1 Config Lcd = 20 * 4a , Chipset = Ks077 Cls ' 'Initialisierung Interrupt Config Int0 = Rising 'Interrupt Int0 bei steigender Flanke On Int0 _encoder 'wenn Interrupt Int0 gehe zu Label _encoder Enable Int0 'Interrupt Int0 erlaubt Enable Interrupts 'Interrupts erlaubt ' '--main program--------------------------------------------------------------------------------------------------- ' 'LCD Startanzeige Lcd_light = On 'LCD Beleuchtung Ein Lcd St 'Startmeldung Cursor Off 'Cursor ausschalten ' Wait 4 '4s Startanzeige ' _enter: Cls 'LCD loeschen Locate 4 , 15 'LCD Cursor setzen Lcd "INPUT" 'LCD Anzeige Locate 1 , 5 'LCD Cursor setzen Lcd "FREQUENCY" 'LCD Anzeige Enc_v = Number(8) 'Encoder merkt sich Wert Einerstelle Locate 2 , 5 'LCD Cursor setzen For Z = 1 To 8 'LCD Frequenzanzeige Lcd Number(z) Next Lcd "Hz" 'LCD Masseinheit Anzeige Cursor Noblink 'Cursor ausschalten ' 'Eingabewert berechnen F1 = Number(8) 'kleinste Stelle F2 = Number(7) * 10 F1 = F1 + F2 F2 = Number(6) * 100 F1 = F1 + F2 F2 = Number(5) * 1000 F1 = F1 + F2 F2 = Number(4) * 10000 F1 = F1 + F2 F2 = Number(3) * 100000 F1 = F1 + F2 F2 = Number(2) * 1000000 F1 = F1 + F2 F2 = Number(1) * 10000000 'groesste Stelle F1 = F1 + F2 'Eingestellte Frequenz ' 'Werte fuer AD9835 berechnen Frequ = F1 'Long in Double wandeln Frequ = Frequ / Mclk 'Frequ berechnen Frequ = Frequ * Parameter Help = Round(frequ) 'Frequ auf glatten Wert runden Value = Help 'Double in Long wandeln ' 'Value als 4 Byte zum AD9835 senden Send = &B0011011100000000 + Fmsbh 'h-msb 8Bits in freq1 Gosub _ser_output Send = &B0010011000000000 + Fmsbl 'l-msb 8Bits in freq1 Gosub _ser_output Send = &B0011010100000000 + Flsbh 'h-lsb 8Bits in freq1 Gosub _ser_output Send = &B0010010000000000 + Flsbl 'l-lsb 8Bits in freq1 Gosub _ser_output ' Do 'Warten bis Taste right gedrueckt Waitms 10 Loop Until Ta_right = Off ' 'LCD Anzeige bei Frequenzeingabe Cls 'LCD loeschen Locate 1 , 3 'LCD Cursor setzen Lcd "FREQUENCY INPUT" 'LCD Anzeige Locate 4 , 2 'LCD Cursor setzen Lcd "LEFT ENTER RIGHT" 'LCD Anzeige Cursor Blink 'Cursor blinkt ' 'Frequenzeingabe vorbereiten Locate 2 , 5 'LCD Cursor setzen For Z = 1 To 8 'Frequenz 8 Stellen anzeigen Lcd Number(z) Next Lcd "Hz" 'Masseinheit anzeigen Lcd_r = 2 'LCD Reihe 2 Lcd_c = 12 'LCD Spalte 12 ' Do 'Eingabeschleife Locate Lcd_r , Lcd_c 'LCD Cursor setzen Number(z) = Enc_v 'Encoderwert merken Lcd Number(z) 'Encoderwert anzeigen Locate Lcd_r , Lcd_c 'LCD Cursor setzen ' If Ta_enter = Off Then Goto _enter 'Taste abfragen If Ta_left = Off Then Gosub _left If Ta_right = Off Then Gosub _right Waitms 10 'besseres Cursorblinken Loop ' '--subprogram----------------------------------------------------------------------------------------------------- ' _encoder: 'wenn Interrupt Int0 If Enc_b = Off Then 'Encoder nach links Decr Enc_v 'Variable -1 Else 'Encoder nach rechts Incr Enc_v 'Variable +1 End If ' If Enc_v = 10 Then Enc_v = 9 'Begrenzung der Variable auf 0 - 9 If Enc_v > 10 Then Enc_v = 0 Return ' _right: 'Taste right gedrueckt Incr Z 'Stelle nach rechts If Z > 8 Then Z = 8 'kleinste Stelle erreicht Enc_v = Number(z) 'Encoder merkt sich Wert der Stelle Incr Lcd_c 'Corsor nach rechts If Lcd_c > 11 Then Lcd_c = 12 'Cursor auf kleinster Stelle Waitms 200 'Taste entprellen Return ' _left: 'Taste left gedrueckt Decr Z 'Stelle nach links If Z < 1 Then Z = 1 'groesste Stelle erreicht Enc_v = Number(z) 'Encoder merkt sich Wert der Stelle Decr Lcd_c 'Cursor nach links If Lcd_c < 5 Then Lcd_c = 5 'Corsor auf grösster Stelle Waitms 200 'Taste entprellen Return ' 'Serielle Schnittstelle zum AD9835 _ser_output: Reset Fsync 'AD9835 bereit Shiftout Sdata , Sclk , Send , 0 '16Bit senden, MSB zuerst, Takt fallende Flanke Set Fsync 'AD9835 fertig Return ' '--end source code------------------------------------------------------------------------------------------------