Code:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 8000000 'Quarz: 8 MHz INTERN!!!
'$baud = 1200 'Baudrate der UART: 2400 Baud
'Konfiguration LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portd.6 , E = Portd.7 , Rs = Portb.0
Cursor Off Noblink ' Cursor aus
'Timer
'Config Portc = Input
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64 'FÜR PWM!!!
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64 'FÜR PWM!!!
Config Timer0 = Timer, Prescale = 1024
On Timer0 Timer0
Const Timervorgabe = 61
Enable Timer0
Enable Interrupts
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
Ddrc = &B0000011 '1 Ausgang, 0 Eingang = Pin PC6-2 als Eingang; 1-0 als Ausgang
Ddrd = &B11111011 '1 Ausgang, 0 Eingang = Pin PD7-0 als Ausgang; 0 als Eingang (Freigabe)
'Portc = &B11111111 'PC0...PC7 auf High setzen
Portb.1 = 0 'damit der Motor nicht kurzzeitig anläuft
'-------------------------------------------------------------------------------
' Variablen
'-------------------------------------------------------------------------------
Dim Anzeige_z As Byte 'Zähler Anzeige
Dim Anzeige_auto As Bit
Dim Anzeige_hand As Bit
Dim Anzeige_e As Bit
Dim Analog_in1 As Word '=0-1023 vom Analogeingang
Dim S1 As Bit 'Schalter 1
Dim S2 As Bit 'Schalter 2
Dim S3 As Bit 'Schalter 3
Dim S3_m As Bit 'Schalter 3 MERKER
Dim Pro1 As Integer
Dim Pro2 As Single
Dim Proz As Integer
Dim Pwm1 As Single
Dim Pwm As Integer
Dim Taste_s1 As Byte
'Anzeige
'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------
'----------
'ANNIMATION
'----------
'----------------------------
Start Adc
Cls 'LCD löschen
Anzeige_auto = 1
Anzeige_hand = 0
Anzeige_e = 0
Do
Portb.5 = 1 'LCD Beleuchtung an
If Pinc.3 = 0 Then 'Schalter 1
S1 = 1
Else
S1 = 0
End If
If Pinc.4 = 0 Then 'Schalter 2
S2 = 1
Else
S2 = 0
End If
If Pinc.5 = 0 Then 'Schalter 3
S3 = 1
Else
S3 = 0
End If
Wait 3
'Analogeingänge auslesen:
'Analog_in1 = Getadc(1) 'Wert aus Analogeingang laden
'
'
''Umrechnung Eingang -> %
' Pro1 = Analog_in1 - 16 'Prozent1Wert analog 16-90 also -16 = 0-74
' Pro2 = Pro1 * 1.351 'Rechnen: 100% / max(74) = 1.351
' Proz = Round(pro2)
'
''Umrechnung % -> PWM
' Pwm1 = Proz * 2.55
' Pwm = Round(pwm1)
'
''Motorsteuerung
'If Pind.2 = 1 Then
'Compare1a = Pwm
'Else
'Compare1a = 0
'End If
'---ANZEIGE AUTO WÄHLEN ---------------------------------------
If Anzeige_hand = 1 And S1 = 1 And S2 = 0 And S3 = 0 Then
'Anzeige_auto = 1
'Anzeige_hand = 0
'Anzeige_e = 0
End If
'---ANZEIGE HAND WÄHLEN---------------------------------------
If Anzeige_auto = 1 And S3 = 1 And S2 = 0 And S1 = 0 Then
Anzeige_auto = 0
Anzeige_hand = 1
Anzeige_e = 0
End If
'---ANZEIGE "E" WÄHLEN---------------------------------------
If Taste_s1 => 120 And S2 = 0 And S3 = 0 Then 'ca. 3 Sekunden
Taste_s1 = 0
'Anzeige_auto = 0
'Anzeige_hand = 0
'Anzeige_e = 1
End If
Wait 3
'-------------------------------------------------------------
If Anzeige_z => 40 Then 'Wenn zähler voll, dann zur ausgewählten Anzeige gehen!
Anzeige_z = 0
If Anzeige_auto = 1 Then
Goto Anzeige_auto
End If
If Anzeige_hand = 1 Then
Goto Anzeige_hand
End If
If Anzeige_e = 1 Then
Goto Anzeige_e
End If
End If
Wait 3
'===RS232===
'Print "ANZEIGE_Z: " ; Anzeige_z , 'Zähler Anzeige
'Print "Anzeige_Auto: " ; Anzeige_auto ,
'Print "Anzeige_Hand: " ; Anzeige_hand ,
'Print "Anzeige_E: " ; Anzeige_e ,
'print "Analog in: " ; Analog_in1 , '=0-1023 vom Analogeingang
'Print "S1: " ; S1 , 'Schalter 1
'Print "S2: " ; S2 , 'Schalter 2
'Print "S3: " ; S3 , 'Schalter 3
'Print "S3_m: "; S3_m , 'Schalter 3 MERKER
'Print "Pro1: "; Pro1 ,
'Print "Pro2: " ; Pro2 ,
'Print "Proz: " ; Proz ,
'Print "PWM1: "; Pwm1 ,
'Print "PWM: "; Pwm ,
'Print "Taste_s1: " ; Taste_s1 ,
Loop
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Timer0: 'Timer1-Interruptroutine (40 x pro Sekunde)
Timer0 = Timervorgabe
Incr Anzeige_z
If S1 = 1 Then 'soll nur hochgezählt werden, wenn Taste links gedrückt
Incr Taste_s1
Else
S1 = 0
End If
Return
'------------------------------------------
Anzeige_auto:
Cls
Locate 1 , 1
Lcd "Drehzahl:"
Locate 1 , 11
Lcd Str(proz , "X") ; " %"
Locate 2 , 1
Lcd Str(s1 , "x")
Locate 2 , 2
Lcd Str(s2 , "x")
Locate 2 , 3
Lcd Str(s3 , "x")
Locate 2 , 6
Lcd ">AUTO<"
Locate 2 , 12
Lcd "Hand"
Locate 2 , 16
Lcd Str(anzeige_z , "x")
Return
'------------------------------------------
Anzeige_hand:
Cls
Locate 1 , 1
Lcd "Drehzahl:"
Locate 1 , 11
Lcd Str(proz , "X") ; " %"
Locate 2 , 1
Lcd "back"
Locate 2 , 8
Lcd "-"
Locate 2 , 14
Lcd "+"
Return
'------------------------------------------
Anzeige_e:
Cls
Locate 1 , 1
Lcd "Drehzahl:"
Locate 1 , 11
Lcd Str(proz , "X") ; " %"
Locate 2 , 1
Lcd Str(analog_in1 , "xxxx") ; "B"
Locate 2 , 7
Lcd Str(pwm , "x") ; "PWM"
Return
Lesezeichen